Committer:
jbeason3
Date:
Wed Nov 06 04:53:44 2019 +0000
Revision:
0:e126ae11d20b
Final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jbeason3 0:e126ae11d20b 1 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 2 /* Low level disk I/O module skeleton for FatFs (C)ChaN, 2014 */
jbeason3 0:e126ae11d20b 3 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 4 /* If a working storage control module is available, it should be */
jbeason3 0:e126ae11d20b 5 /* attached to the FatFs via a glue function rather than modifying it. */
jbeason3 0:e126ae11d20b 6 /* This is an example of glue functions to attach various exsisting */
jbeason3 0:e126ae11d20b 7 /* storage control modules to the FatFs module with a defined API. */
jbeason3 0:e126ae11d20b 8 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 9
jbeason3 0:e126ae11d20b 10 #include "diskio.h"
jbeason3 0:e126ae11d20b 11 #include "mbed_debug.h"
jbeason3 0:e126ae11d20b 12 #include "FATFileSystem.h"
jbeason3 0:e126ae11d20b 13
jbeason3 0:e126ae11d20b 14 using namespace mbed;
jbeason3 0:e126ae11d20b 15
jbeason3 0:e126ae11d20b 16 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 17 /* Get Drive Status */
jbeason3 0:e126ae11d20b 18 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 19
jbeason3 0:e126ae11d20b 20 DSTATUS disk_status (
jbeason3 0:e126ae11d20b 21 BYTE pdrv /* Physical drive nmuber to identify the drive */
jbeason3 0:e126ae11d20b 22 )
jbeason3 0:e126ae11d20b 23 {
jbeason3 0:e126ae11d20b 24 debug_if(FFS_DBG, "disk_status on pdrv [%d]\n", pdrv);
jbeason3 0:e126ae11d20b 25 return (DSTATUS)FATFileSystem::_ffs[pdrv]->disk_status();
jbeason3 0:e126ae11d20b 26 }
jbeason3 0:e126ae11d20b 27
jbeason3 0:e126ae11d20b 28 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 29 /* Inidialize a Drive */
jbeason3 0:e126ae11d20b 30 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 31
jbeason3 0:e126ae11d20b 32 DSTATUS disk_initialize (
jbeason3 0:e126ae11d20b 33 BYTE pdrv /* Physical drive nmuber to identify the drive */
jbeason3 0:e126ae11d20b 34 )
jbeason3 0:e126ae11d20b 35 {
jbeason3 0:e126ae11d20b 36 debug_if(FFS_DBG, "disk_initialize on pdrv [%d]\n", pdrv);
jbeason3 0:e126ae11d20b 37 return (DSTATUS)FATFileSystem::_ffs[pdrv]->disk_initialize();
jbeason3 0:e126ae11d20b 38 }
jbeason3 0:e126ae11d20b 39
jbeason3 0:e126ae11d20b 40 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 41 /* Read Sector(s) */
jbeason3 0:e126ae11d20b 42 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 43
jbeason3 0:e126ae11d20b 44 DRESULT disk_read (
jbeason3 0:e126ae11d20b 45 BYTE pdrv, /* Physical drive nmuber to identify the drive */
jbeason3 0:e126ae11d20b 46 BYTE* buff, /* Data buffer to store read data */
jbeason3 0:e126ae11d20b 47 DWORD sector, /* Sector address in LBA */
jbeason3 0:e126ae11d20b 48 UINT count /* Number of sectors to read */
jbeason3 0:e126ae11d20b 49 )
jbeason3 0:e126ae11d20b 50 {
jbeason3 0:e126ae11d20b 51 debug_if(FFS_DBG, "disk_read(sector %d, count %d) on pdrv [%d]\n", sector, count, pdrv);
jbeason3 0:e126ae11d20b 52 if (FATFileSystem::_ffs[pdrv]->disk_read((uint8_t*)buff, sector, count))
jbeason3 0:e126ae11d20b 53 return RES_PARERR;
jbeason3 0:e126ae11d20b 54 else
jbeason3 0:e126ae11d20b 55 return RES_OK;
jbeason3 0:e126ae11d20b 56 }
jbeason3 0:e126ae11d20b 57
jbeason3 0:e126ae11d20b 58 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 59 /* Write Sector(s) */
jbeason3 0:e126ae11d20b 60 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 61
jbeason3 0:e126ae11d20b 62 #if _USE_WRITE
jbeason3 0:e126ae11d20b 63 DRESULT disk_write (
jbeason3 0:e126ae11d20b 64 BYTE pdrv, /* Physical drive nmuber to identify the drive */
jbeason3 0:e126ae11d20b 65 const BYTE* buff, /* Data to be written */
jbeason3 0:e126ae11d20b 66 DWORD sector, /* Sector address in LBA */
jbeason3 0:e126ae11d20b 67 UINT count /* Number of sectors to write */
jbeason3 0:e126ae11d20b 68 )
jbeason3 0:e126ae11d20b 69 {
jbeason3 0:e126ae11d20b 70 debug_if(FFS_DBG, "disk_write(sector %d, count %d) on pdrv [%d]\n", sector, count, pdrv);
jbeason3 0:e126ae11d20b 71 if (FATFileSystem::_ffs[pdrv]->disk_write((uint8_t*)buff, sector, count))
jbeason3 0:e126ae11d20b 72 return RES_PARERR;
jbeason3 0:e126ae11d20b 73 else
jbeason3 0:e126ae11d20b 74 return RES_OK;
jbeason3 0:e126ae11d20b 75 }
jbeason3 0:e126ae11d20b 76 #endif
jbeason3 0:e126ae11d20b 77
jbeason3 0:e126ae11d20b 78 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 79 /* Miscellaneous Functions */
jbeason3 0:e126ae11d20b 80 /*-----------------------------------------------------------------------*/
jbeason3 0:e126ae11d20b 81
jbeason3 0:e126ae11d20b 82 #if _USE_IOCTL
jbeason3 0:e126ae11d20b 83 DRESULT disk_ioctl (
jbeason3 0:e126ae11d20b 84 BYTE pdrv, /* Physical drive nmuber (0..) */
jbeason3 0:e126ae11d20b 85 BYTE cmd, /* Control code */
jbeason3 0:e126ae11d20b 86 void* buff /* Buffer to send/receive control data */
jbeason3 0:e126ae11d20b 87 )
jbeason3 0:e126ae11d20b 88 {
jbeason3 0:e126ae11d20b 89 debug_if(FFS_DBG, "disk_ioctl(%d)\n", cmd);
jbeason3 0:e126ae11d20b 90 switch(cmd) {
jbeason3 0:e126ae11d20b 91 case CTRL_SYNC:
jbeason3 0:e126ae11d20b 92 if(FATFileSystem::_ffs[pdrv] == NULL) {
jbeason3 0:e126ae11d20b 93 return RES_NOTRDY;
jbeason3 0:e126ae11d20b 94 } else if(FATFileSystem::_ffs[pdrv]->disk_sync()) {
jbeason3 0:e126ae11d20b 95 return RES_ERROR;
jbeason3 0:e126ae11d20b 96 }
jbeason3 0:e126ae11d20b 97 return RES_OK;
jbeason3 0:e126ae11d20b 98 case GET_SECTOR_COUNT:
jbeason3 0:e126ae11d20b 99 if(FATFileSystem::_ffs[pdrv] == NULL) {
jbeason3 0:e126ae11d20b 100 return RES_NOTRDY;
jbeason3 0:e126ae11d20b 101 } else {
jbeason3 0:e126ae11d20b 102 DWORD res = FATFileSystem::_ffs[pdrv]->disk_sectors();
jbeason3 0:e126ae11d20b 103 if(res > 0) {
jbeason3 0:e126ae11d20b 104 *((DWORD*)buff) = res; // minimum allowed
jbeason3 0:e126ae11d20b 105 return RES_OK;
jbeason3 0:e126ae11d20b 106 } else {
jbeason3 0:e126ae11d20b 107 return RES_ERROR;
jbeason3 0:e126ae11d20b 108 }
jbeason3 0:e126ae11d20b 109 }
jbeason3 0:e126ae11d20b 110 case GET_BLOCK_SIZE:
jbeason3 0:e126ae11d20b 111 *((DWORD*)buff) = 1; // default when not known
jbeason3 0:e126ae11d20b 112 return RES_OK;
jbeason3 0:e126ae11d20b 113
jbeason3 0:e126ae11d20b 114 }
jbeason3 0:e126ae11d20b 115 return RES_PARERR;
jbeason3 0:e126ae11d20b 116 }
jbeason3 0:e126ae11d20b 117 #endif