ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el18gs

Dependencies:   mbed

Committer:
el18gs
Date:
Fri Mar 06 19:27:12 2020 +0000
Revision:
2:eaf245af2aae
Initial Commit

Who changed what in which revision?

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