Dependents:   microSD_Card

Committer:
adrevong
Date:
Tue Jan 28 11:11:57 2020 +0000
Revision:
0:c9f6f3f0cd78

        

Who changed what in which revision?

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