17 #ifdef GSC_TARGET_SYSTEM_STM32F769IDISCOVERY 18 #include "stm32f769i_discovery_sd.h" 19 #define SDMMC_IRQn SDMMC2_IRQn 20 #elif defined(GSC_TARGET_SYSTEM_STM32F746GDISCOVERY) 21 #include "stm32746g_discovery_sd.h" 22 #define SDMMC_IRQn SDMMC1_IRQn 25 #define ENABLE_SDMMC_DMA 26 #define SD_TIMEOUT (3*1000)
32 #ifdef ENABLE_SDMMC_DMA 33 extern SD_HandleTypeDef uSdHandle;
38 void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)
40 SYSERR_PRINT(
"Error\n");
43 void HAL_SD_XferErrorCallback(SD_HandleTypeDef *hsd)
45 SYSERR_PRINT(
"Error\n");
48 void BSP_SD_AbortCallback(
void)
50 SYSERR_PRINT(
"Abort\n");
53 static int flg_dma_rx_cmp = 0;
54 static int flg_dma_tx_cmp = 0;
55 static int flg_sd_cmp = 0;
57 void BSP_SD_ReadCpltCallback(
void)
59 DKFPRINTF(0x02,
"\n");
64 void BSP_SD_WriteCpltCallback(
void)
66 DKFPRINTF(0x02,
"\n");
72 static void inthdr_sdmmc_dma_rx(
unsigned int intnum,
void *sp)
74 DKFPRINTF(0x02,
"intnum=%d\n", intnum);
76 HAL_DMA_IRQHandler(uSdHandle.hdmarx);
78 DKFPRINTF(0x02,
"end\n");
81 DKFPRINTF(0x02,
"event wakeup dma_rx_evt\n");
88 static void inthdr_sdmmc_dma_tx(
unsigned int intnum,
void *sp)
90 DKFPRINTF(0x02,
"intnum=%d\n", intnum);
92 HAL_DMA_IRQHandler(uSdHandle.hdmatx);
94 DKFPRINTF(0x02,
"end\n");
97 DKFPRINTF(0x02,
"event wakeup dma_tx_evt\n");
103 static void inthdr_sd(
unsigned int intnum,
void *sp)
105 DKFPRINTF(0x02,
"intnum=%d\n", intnum);
107 HAL_SD_IRQHandler(&uSdHandle);
109 DKFPRINTF(0x02,
"end\n");
111 if(flg_dma_rx_cmp != 0) {
113 DKFPRINTF(0x02,
"event wakeup dma_rx_evt\n");
119 if(flg_dma_tx_cmp != 0) {
121 DKFPRINTF(0x02,
"event wakeup dma_tx_evt\n");
127 #endif //ENABLE_SDMMC_DMA 129 static int sdmmc_register(
struct st_device *dev,
char *param)
133 stat = BSP_SD_Init();
136 SYSERR_PRINT(
"SD/MMC Initialize error(%d)\n", (
int)stat);
140 #ifdef ENABLE_SDMMC_DMA 144 HAL_NVIC_SetPriority(SD_DMAx_Rx_IRQn, 0, 0);
145 register_interrupt(IRQ2VECT(SD_DMAx_Rx_IRQn), inthdr_sdmmc_dma_rx);
148 HAL_NVIC_SetPriority(SD_DMAx_Tx_IRQn, 0, 0);
149 register_interrupt(IRQ2VECT(SD_DMAx_Tx_IRQn), inthdr_sdmmc_dma_tx);
151 HAL_NVIC_SetPriority(SDMMC_IRQn, 0, 0);
152 register_interrupt(IRQ2VECT(SDMMC_IRQn), inthdr_sd);
153 #endif //ENABLE_SDMMC_DMA 158 static int sdmmc_unregister(
struct st_device *dev)
160 #ifdef ENABLE_SDMMC_DMA 161 unregister_interrupt(IRQ2VECT(SD_DMAx_Rx_IRQn));
162 unregister_interrupt(IRQ2VECT(SD_DMAx_Tx_IRQn));
163 unregister_interrupt(IRQ2VECT(SDMMC_IRQn));
164 #endif //ENABLE_SDMMC_DMA 169 static int sdmmc_open(
struct st_device *dev)
171 DKFPRINTF(0x01,
"dev=%p\n", dev);
176 static int sdmmc_close(
struct st_device *dev)
178 DKFPRINTF(0x01,
"dev=%p\n", dev);
183 static uint32_t sdbuf[BLOCKSIZE];
185 static int sdmmc_block_read(
struct st_device *dev,
void *data,
unsigned int sector,
unsigned int blkcount)
188 #ifdef ENABLE_SDMMC_DMA 189 uint32_t alignedAddr;
193 DKFPRINTF(0x01,
"dev=%p, data=%p, sector=%u, blkcount=%u\n", dev, data, sector, blkcount);
195 #ifdef ENABLE_SDMMC_DMA 196 if((
unsigned int)data & 0x3) {
197 DKFPRINTF(0x08,
"data=%p\n", data);
203 for(i=0; i<blkcount; i++) {
206 res = BSP_SD_ReadBlocks_DMA((uint32_t *)sdbuf, sector+i, 1);
208 SYSERR_PRINT(
"BSP_SD_ReadBlocks_DMA(%d)\n", res);
212 tout =
event_wait(&dma_rx_evt, 0, SD_TIMEOUT);
214 SYSERR_PRINT(
"event_wait dma_rx_evt timeout(res = %d)\n", res);
217 res = BSP_SD_GetCardState();
218 if(res == SD_TRANSFER_OK) {
219 alignedAddr = (uint32_t)sdbuf & ~0x1F;
220 SCB_InvalidateDCache_by_Addr((uint32_t *)alignedAddr, BLOCKSIZE + ((uint32_t)sdbuf - alignedAddr));
221 memorycopy(data, (
const void *)sdbuf, BLOCKSIZE);
225 SYSERR_PRINT(
"BSP_SD_GetCardState error(%d)\n", res);
234 res = BSP_SD_ReadBlocks_DMA((uint32_t *)data, sector, blkcount);
236 SYSERR_PRINT(
"BSP_SD_ReadBlocks_DMA(%d)\n", res);
240 tout =
event_wait(&dma_rx_evt, 0, SD_TIMEOUT);
242 SYSERR_PRINT(
"event_wait dma_rx_evt timeout(res = %d)\n", res);
245 res = BSP_SD_GetCardState();
246 if(res == SD_TRANSFER_OK) {
247 alignedAddr = (uint32_t)data & ~0x1F;
248 SCB_InvalidateDCache_by_Addr((uint32_t *)alignedAddr, blkcount * BLOCKSIZE + ((uint32_t)data - alignedAddr));
250 SYSERR_PRINT(
"BSP_SD_GetCardState error(%d)\n", res);
257 res = BSP_SD_ReadBlocks((uint32_t *)data, sector, blkcount, SD_TIMEOUT);
262 KXDUMP(0x04, data, blkcount * BLOCKSIZE);
265 SYSERR_PRINT(
"Block read(data=%p, sector=%u, size=%d) error %u\n", data, sector, blkcount, res);
270 static int sdmmc_block_write(
struct st_device *dev,
const void *data,
unsigned int sector,
unsigned int blkcount)
272 unsigned char res = 0;
273 #ifdef ENABLE_SDMMC_DMA 277 DKFPRINTF(0x01,
"dev=%p, data=%p, sector=%u, blkcount=%u\n", dev, data, sector, blkcount);
279 #ifdef ENABLE_SDMMC_DMA 283 res = BSP_SD_WriteBlocks_DMA((uint32_t *)data, sector, blkcount);
285 tout =
event_wait(&dma_tx_evt, 0, SD_TIMEOUT);
287 SYSERR_PRINT(
"event_wait dma_tx_evt timeout(res = %d)\n", res);
292 res = BSP_SD_GetCardState();
293 if(res == SD_TRANSFER_OK) {
297 if(res != SD_TRANSFER_OK) {
298 SYSERR_PRINT(
"BSP_SD_GetCardState error(%d)\n", res);
301 if((
unsigned int)data & 0x3) {
302 DKFPRINTF(0x10,
"data=%p\n", data);
304 for(j=0; j<blkcount; j++) {
305 unsigned char *sp = (
unsigned char *)data + (j * BLOCKSIZE);
306 unsigned char *dp = (
unsigned char *)sdbuf;
307 for(i=0; i<BLOCKSIZE; i++) {
313 res = BSP_SD_WriteBlocks(sdbuf, sector+j, 1, SD_TIMEOUT);
316 while(BSP_SD_GetCardState() != SD_TRANSFER_OK) {
322 res = BSP_SD_WriteBlocks((uint32_t *)data, sector, blkcount, SD_TIMEOUT);
325 while(BSP_SD_GetCardState() != SD_TRANSFER_OK) {
331 if(res == SD_TRANSFER_OK) {
334 SYSERR_PRINT(
"Block write(data=%p, sector=%u, size=%d) error %u\n", data, sector, blkcount, res);
339 static int sdmmc_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
341 HAL_SD_CardInfoTypeDef cardInfo;
344 DKFPRINTF(0x01,
"dev=%p, com=%08x, arg=%08x, param=%p\n", dev, com, arg, param);
346 BSP_SD_GetCardInfo(&cardInfo);
348 DKPRINTF(0x02,
"CardType = %u\n", cardInfo.CardType);
349 DKPRINTF(0x02,
"CardVersion = %u\n", cardInfo.CardVersion);
350 DKPRINTF(0x02,
"Class = %u\n", cardInfo.Class);
351 DKPRINTF(0x02,
"RelCardAdd = %u\n", cardInfo.RelCardAdd);
352 DKPRINTF(0x02,
"BlockNbr = %u\n", cardInfo.BlockNbr);
353 DKPRINTF(0x02,
"BlockSize = %u\n", cardInfo.BlockSize);
354 DKPRINTF(0x02,
"LogBlockNbr = %u\n", cardInfo.LogBlockNbr);
355 DKPRINTF(0x02,
"LogBlockSize = %u\n", cardInfo.LogBlockSize);
360 #if FF_MAX_SS != FF_MIN_SS 361 rt = (int)cardInfo.BlockNbr;
363 rt = (
int)cardInfo.LogBlockNbr;
370 #if FF_MAX_SS != FF_MIN_SS 371 rt = (int)cardInfo.BlockSize;
373 rt = (
int)cardInfo.LogBlockSize;
380 rt = (int)cardInfo.BlockSize;
385 SYSERR_PRINT(
"Unknow command %08lX arg %08lX\n", com, arg);
392 static int sdmmc_sync(
struct st_device *dev)
397 static int sdmmc_suspend(
struct st_device *dev)
404 static int sdmmc_resume(
struct st_device *dev)
414 .explan =
"STM32F7xxx SD/MMC Storage",
415 .register_dev = sdmmc_register,
416 .unregister_dev = sdmmc_unregister,
418 .close = sdmmc_close,
419 .block_read = sdmmc_block_read,
420 .block_write = sdmmc_block_write,
421 .ioctl = sdmmc_ioctl,
423 .suspend = sdmmc_suspend,
424 .resume = sdmmc_resume,
#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)
タスクをイベント待ち状態にする