123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- /*-----------------------------------------------------------------------*/
- /* Low level disk I/O module skeleton for FatFs (C)ChaN, 2014 */
- /*-----------------------------------------------------------------------*/
- /* If a working storage control module is available, it should be */
- /* attached to the FatFs via a glue function rather than modifying it. */
- /* This is an example of glue functions to attach various exsisting */
- /* storage control modules to the FatFs module with a defined API. */
- /*-----------------------------------------------------------------------*/
- #include "diskio.h" /* FatFs lower layer API */
- // #include "atadrive.h" /* Example: ATA drive control */
- #include "nand_flash.h"
- #include "sdcard.h" /* Example: MMC/SDC contorl */
- // #include "usbdisk.h" /* Example: USB drive control */
- #include "string.h"
- #ifdef FS_USB
- #include "usbh_bsp_msc.h" /* 底层驱动 */
- #endif
- /* Definitions of physical drive number for each drive */
- /* 为每个设备定义一个物理编号 */
- #define FS_SD 0 // SD卡
- #define FS_NAND 1 // 预留外部SPI Flash使用
- // #define ATA 0 /* Example: Map ATA drive to drive number 0 */
- // #define MMC 1 /* Example: Map MMC/SD card to drive number 1 */
- // #define FS_USB 2 /* Example: Map USB drive to drive number 2 */
- #define SD_BLOCKSIZE 512
- extern SD_CardInfo SDCardInfo;
- /*-----------------------------------------------------------------------*/
- /* 获取设备状态 */
- /*-----------------------------------------------------------------------*/
- DSTATUS disk_status(
- BYTE pdrv /* Physical drive nmuber to identify the drive */
- )
- {
- DSTATUS status = STA_NOINIT;
- switch (pdrv)
- {
- case FS_SD:
- status &= ~STA_NOINIT;
- break;
- case FS_NAND:
- status = 0;
- break;
- #ifdef FS_USB
- case FS_USB:
- status = 0;
- break;
- #endif
- }
- return status;
- }
- /*-----------------------------------------------------------------------*/
- /* Inidialize a Drive */
- /*-----------------------------------------------------------------------*/
- DSTATUS disk_initialize(
- BYTE pdrv /* Physical drive nmuber to identify the drive */
- )
- {
- DSTATUS status = STA_NOINIT;
- switch (pdrv)
- {
- case FS_SD:
- if (SD_Init() == SD_OK)
- {
- status &= ~STA_NOINIT;
- }
- else
- {
- status = STA_NOINIT;
- }
- break;
- case FS_NAND:
- if (nand_flash_init() == NAND_OK)
- {
- status = RES_OK;
- }
- else
- {
- /* 如果初始化失败,请执行低级格式化 */
- printf("NAND_Init() Error! \r\n");
- status = RES_ERROR;
- }
- break;
- #ifdef FS_USB
- case FS_USB:
- if (HCD_IsDeviceConnected(&USB_OTG_Core))
- {
- status &= ~STA_NOINIT;
- }
- break;
- #endif
- }
- return status;
- }
- /*-----------------------------------------------------------------------*/
- /* Read Sector(s) */
- /*-----------------------------------------------------------------------*/
- DRESULT disk_read(
- BYTE pdrv, /* Physical drive nmuber to identify the drive */
- BYTE *buff, /* Data buffer to store read data */
- DWORD sector, /* Sector address in LBA */
- UINT count /* Number of sectors to read */
- )
- {
- DRESULT status = RES_PARERR;
- SD_Error SD_state = SD_OK;
- switch (pdrv)
- {
- case FS_SD:
- if ((DWORD)buff & 3)
- {
- DRESULT res = RES_OK;
- DWORD scratch[SD_BLOCKSIZE / 4];
- while (count--)
- {
- res = disk_read(FS_SD, (void *)scratch, sector++, 1);
- if (res != RES_OK)
- {
- break;
- }
- memcpy(buff, scratch, SD_BLOCKSIZE);
- buff += SD_BLOCKSIZE;
- }
- return res;
- }
- SD_state = SD_ReadMultiBlocks(buff, sector * SD_BLOCKSIZE, SD_BLOCKSIZE, count);
- if (SD_state == SD_OK)
- {
- /* Check if the Transfer is finished */
- SD_state = SD_WaitReadOperation();
- while (SD_GetStatus() != SD_TRANSFER_OK)
- ;
- }
- if (SD_state != SD_OK)
- status = RES_PARERR;
- else
- status = RES_OK;
- break;
- case FS_NAND:
- if (NAND_OK == NAND_ReadMultiSectors(buff, sector, 512, count))
- {
- status = RES_OK;
- }
- else
- {
- printf("NAND_ReadMultiSectors() Error! sector = %d, count = %d \r\n", sector, count);
- status = RES_ERROR;
- }
- break;
- #ifdef FS_USB
- case FS_USB:
- {
- BYTE res = USBH_MSC_OK;
- if (HCD_IsDeviceConnected(&USB_OTG_Core))
- {
- do
- {
- res = USBH_MSC_Read10(&USB_OTG_Core, buff, sector, 512 * count);
- USBH_MSC_HandleBOTXfer(&USB_OTG_Core, &USB_Host);
- if (!HCD_IsDeviceConnected(&USB_OTG_Core))
- {
- break;
- }
- } while (res == USBH_MSC_BUSY);
- }
- if (res == USBH_MSC_OK)
- {
- status = RES_OK;
- }
- else
- {
- status = RES_ERROR;
- }
- }
- #endif
- break;
- }
- return status;
- }
- /*-----------------------------------------------------------------------*/
- /* Write Sector(s) */
- /*-----------------------------------------------------------------------*/
- #if _USE_WRITE
- DRESULT disk_write(
- BYTE pdrv, /* Physical drive nmuber to identify the drive */
- const BYTE *buff, /* Data to be written */
- DWORD sector, /* Sector address in LBA */
- UINT count /* Number of sectors to write */
- )
- {
- DRESULT status = RES_PARERR;
- SD_Error SD_state = SD_OK;
- if (!count)
- {
- return RES_PARERR; /* Check parameter */
- }
- switch (pdrv)
- {
- case FS_SD: /* SD CARD */
- if ((DWORD)buff & 3)
- {
- DRESULT res = RES_OK;
- DWORD scratch[SD_BLOCKSIZE / 4];
- while (count--)
- {
- memcpy(scratch, buff, SD_BLOCKSIZE);
- res = disk_write(FS_SD, (void *)scratch, sector++, 1);
- if (res != RES_OK)
- {
- break;
- }
- buff += SD_BLOCKSIZE;
- }
- return res;
- }
- SD_state = SD_WriteMultiBlocks((uint8_t *)buff, sector * SD_BLOCKSIZE, SD_BLOCKSIZE, count);
- if (SD_state == SD_OK)
- {
- /* Check if the Transfer is finished */
- SD_state = SD_WaitWriteOperation();
- /* Wait until end of DMA transfer */
- while (SD_GetStatus() != SD_TRANSFER_OK)
- ;
- }
- if (SD_state != SD_OK)
- status = RES_PARERR;
- else
- status = RES_OK;
- break;
- case FS_NAND:
- if (NAND_OK == NAND_WriteMultiSectors((uint8_t *)buff, sector, 512, count))
- {
- status = RES_OK;
- }
- else
- {
- printf("NAND_ReadMultiSectors() Error! sector = %d, count = %d \r\n", sector, count);
- status = RES_ERROR;
- }
- break;
- #ifdef FS_USB
- case FS_USB:
- {
- BYTE res = USBH_MSC_OK;
- if (HCD_IsDeviceConnected(&USB_OTG_Core))
- {
- do
- {
- res = USBH_MSC_Write10(&USB_OTG_Core, (BYTE *)buff, sector, 512 * count);
- USBH_MSC_HandleBOTXfer(&USB_OTG_Core, &USB_Host);
- if (!HCD_IsDeviceConnected(&USB_OTG_Core))
- {
- break;
- }
- } while (res == USBH_MSC_BUSY);
- }
- if (res == USBH_MSC_OK)
- {
- status = RES_OK;
- }
- else
- {
- status = RES_ERROR;
- }
- }
- #endif
- break;
- }
- return status;
- }
- #endif
- /*-----------------------------------------------------------------------*/
- /* Miscellaneous Functions */
- /*-----------------------------------------------------------------------*/
- #if _USE_IOCTL
- DRESULT disk_ioctl(
- BYTE pdrv, /* Physical drive nmuber (0..) */
- BYTE cmd, /* Control code */
- void *buff /* Buffer to send/receive control data */
- )
- {
- DRESULT status = RES_PARERR;
- switch (pdrv)
- {
- case FS_SD: /* SD CARD */
- switch (cmd)
- {
- // Get R/W sector size (WORD)
- case GET_SECTOR_SIZE:
- *(WORD *)buff = SD_BLOCKSIZE;
- break;
- // Get erase block size in unit of sector (DWORD)
- case GET_BLOCK_SIZE:
- *(DWORD *)buff = 1; // SDCardInfo.CardBlockSize;
- break;
- case GET_SECTOR_COUNT:
- *(DWORD *)buff = SDCardInfo.CardCapacity / SDCardInfo.CardBlockSize;
- break;
- case CTRL_SYNC:
- break;
- }
- status = RES_OK;
- break;
- case FS_NAND:
- status = RES_OK;
- break;
- #ifdef FS_USB
- case FS_USB:
- // if (Stat & STA_NOINIT) return RES_NOTRDY;
- switch (cmd)
- {
- case CTRL_SYNC: /* Make sure that no pending write process */
- status = RES_OK;
- break;
- case GET_SECTOR_COUNT: /* Get number of sectors on the disk (DWORD) */
- *(DWORD *)buff = (DWORD)USBH_MSC_Param.MSCapacity;
- status = RES_OK;
- break;
- case GET_SECTOR_SIZE: /* Get R/W sector size (WORD) */
- *(WORD *)buff = 512;
- status = RES_OK;
- break;
- case GET_BLOCK_SIZE: /* Get erase block size in unit of sector (DWORD) */
- *(DWORD *)buff = 512;
- status = RES_OK;
- break;
- default:
- status = RES_PARERR;
- break;
- }
- #endif
- break;
- }
- return status;
- }
- /*
- *********************************************************************************************************
- * 函 数 名: get_fattime
- * 功能说明: 获得系统时间,用于改写文件的创建和修改时间。
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- // __weak DWORD get_fattime(void)
- // {
- // /* 如果有全局时钟,可按下面的格式进行时钟转换. 这个例子是2013-01-01 00:00:00 */
- // return ((DWORD)(2013 - 1980) << 25) /* Year = 2013 */
- // | ((DWORD)1 << 21) /* Month = 1 */
- // | ((DWORD)1 << 16) /* Day_m = 1*/
- // | ((DWORD)0 << 11) /* Hour = 0 */
- // | ((DWORD)0 << 5) /* Min = 0 */
- // | ((DWORD)0 >> 1); /* Sec = 0 */
- // }
- #endif
|