Emilia Marino / SDFileSystem
Committer:
emiliamarino
Date:
Sat Dec 18 20:17:31 2021 +0000
Revision:
0:5f7b02d095c2
Assignment 4

Who changed what in which revision?

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