Alek Boving / SDFileSystem8
Committer:
alekboving
Date:
Thu Nov 12 15:20:15 2020 +0000
Revision:
0:83e8ad3d9a65
initial commit

Who changed what in which revision?

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