megan gimple / SDFileSystem

Dependents:   gimple_A4_3_Temp_Light

Committer:
mgimple
Date:
Sat Nov 13 20:10:05 2021 +0000
Revision:
0:07ff9ae5339f
SD

Who changed what in which revision?

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