/*-----------------------------------------------------------------------*/ /* 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" #include "sdio.h" #include "malloc.h" #define SD_CARD 0 // SD卡,卷标为0 #define EX_FLASH 1 // 外部spi flash,卷标为1 #define USB_DISK 3 // U盘,卷标为3 // 对于W25Q128 // 前8M字节给fatfs用,8M字节后,用于存放字库,字库占用6.01M.剩余部分1.99M,给客户自己用 #define FLASH_SECTOR_SIZE 512 #define FLASH_SECTOR_COUNT 1024*8*2 // W25Q128,前8M字节给FATFS占用 #define FLASH_BLOCK_SIZE 8 // 每个BLOCK有8个扇区 FATFS fatfs_sd; // SD卡逻辑驱动器的工作区 FATFS fatfs_flash; // FLASH逻辑驱动器的工作区 FATFS fatfs_usb; // USB逻辑驱动器的工作区 FIL file_sd; // SD卡文件对象 FIL file_flash; // FLASH文件对象 FIL file_usb; // USB文件对象 //----------------------------------------------------------------- // DWORD get_fattime (void) //----------------------------------------------------------------- // // 函数功能: 用户定义函数,为fatfs模块停工当前时间 // 入口参数: 无 // 返 回 值: 无 // 注意事项: 无 // //----------------------------------------------------------------- DWORD get_fattime (void) { return 0; } //----------------------------------------------------------------- // DSTATUS disk_status (BYTE pdrv) //----------------------------------------------------------------- // // 函数功能: 获得磁盘状态 // 入口参数: BYTE pdrv:用于标识驱动器的物理驱动器号 // 返 回 值: 无 // 注意事项: 无 // //----------------------------------------------------------------- DSTATUS disk_status(BYTE pdrv) { return RES_OK; } //----------------------------------------------------------------- // DSTATUS disk_status (BYTE pdrv) //----------------------------------------------------------------- // // 函数功能: 初始化磁盘 // 入口参数: BYTE pdrv:用于标识驱动器的物理驱动器号 // 返 回 值: 无 // 注意事项: 无 // //----------------------------------------------------------------- DSTATUS disk_initialize(BYTE pdrv) { u8 res=0; switch(pdrv) { case SD_CARD: // SD卡 res=SD_Init(); // SD卡初始化 break; case USB_DISK: // U盘 break; default: res=1; } if(res) return STA_NOINIT; else return 0; // 初始化成功 } //----------------------------------------------------------------- // DRESULT disk_read (BYTE pdrv,BYTE *buff,DWORD sector,UINT count) //----------------------------------------------------------------- // // 函数功能: 读扇区 // 入口参数: BYTE pdrv:磁盘编号0~9 // BYTE *buff:数据接收缓冲首地址 // DWORD sector:扇区地址 // UINT count:需要读取的扇区数 // 返 回 值: 无 // 注意事项: 无 // //----------------------------------------------------------------- DRESULT disk_read (BYTE pdrv,BYTE *buff,DWORD sector,UINT count) { u8 res=0; if (!count) return RES_PARERR;// count不能等于0,否则返回参数错误 switch(pdrv) { case SD_CARD: // SD卡 res=SD_ReadDisk(buff,sector,count); while(res) // 读出错 { SD_Init(); // 重新初始化SD卡 res=SD_ReadDisk(buff,sector,count); } break; case USB_DISK: // U盘 break; default: res=1; } // 处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值 if(res==0x00) return RES_OK; else return RES_ERROR; } //----------------------------------------------------------------- // DRESULT disk_write (BYTE pdrv,const BYTE *buff,DWORD sector,UINT count) //----------------------------------------------------------------- // // 函数功能: 写扇区 // 入口参数: BYTE pdrv:磁盘编号0~9 // BYTE *buff:发送数据首地址 // DWORD sector:扇区地址 // UINT count:需要写入的扇区数 // 返 回 值: 无 // 注意事项: 无 // //----------------------------------------------------------------- DRESULT disk_write (BYTE pdrv,const BYTE *buff,DWORD sector,UINT count) { u8 res=0; if (!count) return RES_PARERR;// count不能等于0,否则返回参数错误 switch(pdrv) { case SD_CARD: // SD卡 res=SD_WriteDisk((u8*)buff,sector,count); while(res) // 写出错 { SD_Init(); //重新初始化SD卡 res=SD_WriteDisk((u8*)buff,sector,count); //printf("sd wr error:%d\r\n",res); } break; case USB_DISK: // U盘 break; default: res=1; } // 处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值 if(res == 0x00) return RES_OK; else return RES_ERROR; } //----------------------------------------------------------------- // DRESULT disk_ioctl (BYTE pdrv,BYTE cmd,void *buff) //----------------------------------------------------------------- // // 函数功能: 其他表参数的获得 // 入口参数: BYTE pdrv:磁盘编号0~9 // BYTE cmd:控制代码 // void *buff:发送/接收缓冲区指针 // 返 回 值: 无 // 注意事项: 无 // //----------------------------------------------------------------- DRESULT disk_ioctl (BYTE pdrv,BYTE cmd,void *buff) { DRESULT res; if(pdrv==SD_CARD)// SD卡 { switch(cmd) { case CTRL_SYNC: res = RES_OK; break; case GET_SECTOR_SIZE: *(DWORD*)buff = 512; res = RES_OK; break; case GET_BLOCK_SIZE: *(WORD*)buff = SDCardInfo.CardBlockSize; res = RES_OK; break; case GET_SECTOR_COUNT: *(DWORD*)buff = SDCardInfo.CardCapacity/512; res = RES_OK; break; default: res = RES_PARERR; break; } } else if(pdrv==USB_DISK) // U盘 { } else res=RES_ERROR;// 其他的不支持 return res; } void *ff_memalloc (UINT size) { return (void*)mymalloc(SRAMEX,size); } //释放内存 void ff_memfree (void* mf) { myfree(SRAMEX,mf); } //----------------------------------------------------------------- // End Of File //-----------------------------------------------------------------