17 #include "stm32469i_discovery_sd.h" 20 #define SD_TIMEOUT (3*1000)
27 extern SD_HandleTypeDef uSdHandle;
32 static int flg_dma_rx_cmp = 0;
33 static int flg_dma_tx_cmp = 0;
34 static int flg_sd_cmp = 0;
36 void BSP_SD_ReadCpltCallback(
void)
38 DKFPRINTF(0x02,
"\n");
43 void BSP_SD_WriteCpltCallback(
void)
45 DKFPRINTF(0x02,
"\n");
51 static void inthdr_sd_dma_rx(
unsigned int intnum,
void *sp)
53 DKFPRINTF(0x02,
"intnum=%d\n", intnum);
55 HAL_DMA_IRQHandler(uSdHandle.hdmarx);
57 DKFPRINTF(0x02,
"end\n");
60 DKFPRINTF(0x02,
"event wakeup dma_rx_evt\n");
67 static void inthdr_sd_dma_tx(
unsigned int intnum,
void *sp)
69 DKFPRINTF(0x02,
"intnum=%d\n", intnum);
71 HAL_DMA_IRQHandler(uSdHandle.hdmatx);
73 DKFPRINTF(0x02,
"end\n");
76 DKFPRINTF(0x02,
"event wakeup dma_tx_evt\n");
82 static void inthdr_sd(
unsigned int intnum,
void *sp)
84 DKFPRINTF(0x02,
"intnum=%d\n", intnum);
86 HAL_SD_IRQHandler(&uSdHandle);
88 DKFPRINTF(0x02,
"end\n");
90 if(flg_dma_rx_cmp != 0) {
92 DKFPRINTF(0x02,
"event wakeup dma_rx_evt\n");
98 if(flg_dma_tx_cmp != 0) {
100 DKFPRINTF(0x02,
"event wakeup dma_tx_evt\n");
106 #endif //ENABLE_SD_DMA 108 static int sd_register(
struct st_device *dev,
char *param)
112 stat = BSP_SD_Init();
115 SYSERR_PRINT(
"SD Initialize error(%d)\n", (
int)stat);
123 HAL_NVIC_SetPriority(SD_DMAx_Rx_IRQn, 0, 0);
124 register_interrupt(IRQ2VECT(SD_DMAx_Rx_IRQn), inthdr_sd_dma_rx);
127 HAL_NVIC_SetPriority(SD_DMAx_Tx_IRQn, 0, 0);
128 register_interrupt(IRQ2VECT(SD_DMAx_Tx_IRQn), inthdr_sd_dma_tx);
130 HAL_NVIC_SetPriority(SDIO_IRQn, 0, 0);
131 register_interrupt(IRQ2VECT(SDIO_IRQn), inthdr_sd);
132 #endif //ENABLE_SD_DMA 137 static int sd_unregister(
struct st_device *dev)
140 unregister_interrupt(IRQ2VECT(SD_DMAx_Rx_IRQn));
141 unregister_interrupt(IRQ2VECT(SD_DMAx_Tx_IRQn));
142 unregister_interrupt(IRQ2VECT(SDIO_IRQn));
143 #endif //ENABLE_SD_DMA 148 static int sd_open(
struct st_device *dev)
150 DKFPRINTF(0x01,
"dev=%p\n", dev);
155 static int sd_close(
struct st_device *dev)
157 DKFPRINTF(0x01,
"dev=%p\n", dev);
162 static uint32_t sdbuf[BLOCKSIZE];
164 static int sd_block_read(
struct st_device *dev,
void *data,
unsigned int sector,
unsigned int blkcount)
171 DKFPRINTF(0x01,
"dev=%p, data=%p, sector=%u, blkcount=%u\n", dev, data, sector, blkcount);
174 if((
unsigned int)data & 0x3) {
175 DKFPRINTF(0x08,
"data=%p\n", data);
181 for(i=0; i<blkcount; i++) {
184 res = BSP_SD_ReadBlocks_DMA((uint32_t *)sdbuf, sector+i, 1);
186 SYSERR_PRINT(
"BSP_SD_ReadBlocks_DMA(%d)\n", res);
190 tout =
event_wait(&dma_rx_evt, 0, SD_TIMEOUT);
192 SYSERR_PRINT(
"event_wait dma_rx_evt timeout(res = %d)\n", res);
195 res = BSP_SD_GetCardState();
196 if(res == SD_TRANSFER_OK) {
197 memorycopy(data, (
const void *)sdbuf, BLOCKSIZE);
201 SYSERR_PRINT(
"BSP_SD_GetCardState error(%d)\n", res);
210 res = BSP_SD_ReadBlocks_DMA((uint32_t *)data, sector, blkcount);
212 SYSERR_PRINT(
"BSP_SD_ReadBlocks_DMA(%d)\n", res);
216 tout =
event_wait(&dma_rx_evt, 0, SD_TIMEOUT);
218 SYSERR_PRINT(
"event_wait dma_rx_evt timeout(res = %d)\n", res);
221 res = BSP_SD_GetCardState();
222 if(res == SD_TRANSFER_OK) {
225 SYSERR_PRINT(
"BSP_SD_GetCardState error(%d)\n", res);
232 res = BSP_SD_ReadBlocks((uint32_t *)data, sector, blkcount, SD_TIMEOUT);
237 KXDUMP(0x04, data, blkcount * BLOCKSIZE);
240 SYSERR_PRINT(
"Block read(data=%p, sector=%u, size=%d) error %u\n", data, sector, blkcount, res);
245 static int sd_block_write(
struct st_device *dev,
const void *data,
unsigned int sector,
unsigned int blkcount)
247 unsigned char res = 0;
252 DKFPRINTF(0x01,
"dev=%p, data=%p, sector=%u, blkcount=%u\n", dev, data, sector, blkcount);
258 res = BSP_SD_WriteBlocks_DMA((uint32_t *)data, sector, blkcount);
260 tout =
event_wait(&dma_tx_evt, 0, SD_TIMEOUT);
262 SYSERR_PRINT(
"event_wait dma_tx_evt timeout(res = %d)\n", res);
267 res = BSP_SD_GetCardState();
268 if(res == SD_TRANSFER_OK) {
272 if(res != SD_TRANSFER_OK) {
273 SYSERR_PRINT(
"BSP_SD_GetCardState error(%d)\n", res);
276 if((
unsigned int)data & 0x3) {
277 DKFPRINTF(0x10,
"data=%p\n", data);
279 for(j=0; j<blkcount; j++) {
280 unsigned char *sp = (
unsigned char *)data + (j * BLOCKSIZE);
281 unsigned char *dp = (
unsigned char *)sdbuf;
282 for(i=0; i<BLOCKSIZE; i++) {
288 res = BSP_SD_WriteBlocks(sdbuf, sector+j, 1, SD_TIMEOUT);
291 while(BSP_SD_GetCardState() != SD_TRANSFER_OK) {
297 res = BSP_SD_WriteBlocks((uint32_t *)data, sector, blkcount, SD_TIMEOUT);
300 while(BSP_SD_GetCardState() != SD_TRANSFER_OK) {
306 if(res == SD_TRANSFER_OK) {
309 SYSERR_PRINT(
"Block write(data=%p, sector=%u, size=%d) error %u\n", data, sector, blkcount, res);
314 static int sd_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
316 HAL_SD_CardInfoTypeDef cardInfo;
319 DKFPRINTF(0x01,
"dev=%p, com=%08x, arg=%08x, param=%p\n", dev, com, arg, param);
321 BSP_SD_GetCardInfo(&cardInfo);
323 DKPRINTF(0x02,
"CardType = %u\n", cardInfo.CardType);
324 DKPRINTF(0x02,
"CardVersion = %u\n", cardInfo.CardVersion);
325 DKPRINTF(0x02,
"Class = %u\n", cardInfo.Class);
326 DKPRINTF(0x02,
"RelCardAdd = %u\n", cardInfo.RelCardAdd);
327 DKPRINTF(0x02,
"BlockNbr = %u\n", cardInfo.BlockNbr);
328 DKPRINTF(0x02,
"BlockSize = %u\n", cardInfo.BlockSize);
329 DKPRINTF(0x02,
"LogBlockNbr = %u\n", cardInfo.LogBlockNbr);
330 DKPRINTF(0x02,
"LogBlockSize = %u\n", cardInfo.LogBlockSize);
335 #if FF_MAX_SS != FF_MIN_SS 336 rt = (int)cardInfo.BlockNbr;
338 rt = (
int)cardInfo.LogBlockNbr;
345 #if FF_MAX_SS != FF_MIN_SS 346 rt = (int)cardInfo.BlockSize;
348 rt = (
int)cardInfo.LogBlockSize;
355 rt = (int)cardInfo.BlockSize;
360 SYSERR_PRINT(
"Unknow command %08lX arg %08lX\n", com, arg);
367 static int sd_sync(
struct st_device *dev)
372 static int sd_suspend(
struct st_device *dev)
379 static int sd_resume(
struct st_device *dev)
389 .explan =
"32F469IDISCOVERY SD Card Storage",
390 .register_dev = sd_register,
391 .unregister_dev = sd_unregister,
394 .block_read = sd_block_read,
395 .block_write = sd_block_write,
398 .suspend = sd_suspend,
#define IOCMD_SD_GET_SECTOR_COUNT
セクタ数を取得する
#define IOCMD_SD_GET_BLOCK_SIZE
消去ブロックサイズを取得する
#define DEF_DEV_NAME_SD
標準ストレージデバイス名(MMC,SD等)
void eventqueue_register_ISR(struct st_event *evtque, const char *name, void *args, unsigned int arg_size, int arg_count)
イベントキューを登録する
void event_wakeup_ISR(void *sp, struct st_event *evtque, void *arg)
イベントキューにイベントを登録し、イベント待ちタスクを起動する
#define IOCMD_SD_GET_SECTOR_SIZE
1セクタサイズを取得する
void * memorycopy(void *dest, const void *src, unsigned int count)
メモリコピー
ストレージデバイスドライバ ioctl 用マクロ定義
unsigned long long get_kernel_time(void)
カーネル時間を取得する
char name[MAX_DEVNAMELRN]
デバイス名文字列
int event_wait(struct st_event *evtque, void *argp, unsigned int timeout)
タスクをイベント待ち状態にする