7b19e99edd
There are lots of cosmetic changes, but this release brings a very important bug fix: - Fixed f_unlink() does not remove cluster chain of the file. With R0.10c if you try to write a file that is too large to fit in the free space of the drive, the operation fails, you delete the incomplete file, and it seems to be erased, but the space is not really freed, because any subsequent write operations fail because the drive is "still" full. The only way to recover from this is by formatting the drive. I can confirm that R0.11 fixes the problem.
231 lines
5.3 KiB
C
231 lines
5.3 KiB
C
/*-----------------------------------------------------------------------*/
|
|
/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2014 */
|
|
/*-----------------------------------------------------------------------*/
|
|
/* If a working storage control module is available, it should be */
|
|
/* attached to the FatFs via a glue function rather than modifying it. */
|
|
/* This is an example of glue functions to attach various exsisting */
|
|
/* storage control modules to the FatFs module with a defined API. */
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
#include "diskio.h" /* FatFs lower layer API */
|
|
#include "usbdisk.h" /* Example: Header file of existing USB MSD control module */
|
|
#include "atadrive.h" /* Example: Header file of existing ATA harddisk control module */
|
|
#include "sdcard.h" /* Example: Header file of existing MMC/SDC contorl module */
|
|
|
|
/* Definitions of physical drive number for each drive */
|
|
#define ATA 0 /* Example: Map ATA harddisk to physical drive 0 */
|
|
#define MMC 1 /* Example: Map MMC/SD card to physical drive 1 */
|
|
#define USB 2 /* Example: Map USB MSD to physical drive 2 */
|
|
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
/* Get Drive Status */
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
DSTATUS disk_status (
|
|
BYTE pdrv /* Physical drive nmuber to identify the drive */
|
|
)
|
|
{
|
|
DSTATUS stat;
|
|
int result;
|
|
|
|
switch (pdrv) {
|
|
case ATA :
|
|
result = ATA_disk_status();
|
|
|
|
// translate the reslut code here
|
|
|
|
return stat;
|
|
|
|
case MMC :
|
|
result = MMC_disk_status();
|
|
|
|
// translate the reslut code here
|
|
|
|
return stat;
|
|
|
|
case USB :
|
|
result = USB_disk_status();
|
|
|
|
// translate the reslut code here
|
|
|
|
return stat;
|
|
}
|
|
return STA_NOINIT;
|
|
}
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
/* Inidialize a Drive */
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
DSTATUS disk_initialize (
|
|
BYTE pdrv /* Physical drive nmuber to identify the drive */
|
|
)
|
|
{
|
|
DSTATUS stat;
|
|
int result;
|
|
|
|
switch (pdrv) {
|
|
case ATA :
|
|
result = ATA_disk_initialize();
|
|
|
|
// translate the reslut code here
|
|
|
|
return stat;
|
|
|
|
case MMC :
|
|
result = MMC_disk_initialize();
|
|
|
|
// translate the reslut code here
|
|
|
|
return stat;
|
|
|
|
case USB :
|
|
result = USB_disk_initialize();
|
|
|
|
// translate the reslut code here
|
|
|
|
return stat;
|
|
}
|
|
return STA_NOINIT;
|
|
}
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
/* Read Sector(s) */
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
DRESULT disk_read (
|
|
BYTE pdrv, /* Physical drive nmuber to identify the drive */
|
|
BYTE *buff, /* Data buffer to store read data */
|
|
DWORD sector, /* Sector address in LBA */
|
|
UINT count /* Number of sectors to read */
|
|
)
|
|
{
|
|
DRESULT res;
|
|
int result;
|
|
|
|
switch (pdrv) {
|
|
case ATA :
|
|
// translate the arguments here
|
|
|
|
result = ATA_disk_read(buff, sector, count);
|
|
|
|
// translate the reslut code here
|
|
|
|
return res;
|
|
|
|
case MMC :
|
|
// translate the arguments here
|
|
|
|
result = MMC_disk_read(buff, sector, count);
|
|
|
|
// translate the reslut code here
|
|
|
|
return res;
|
|
|
|
case USB :
|
|
// translate the arguments here
|
|
|
|
result = USB_disk_read(buff, sector, count);
|
|
|
|
// translate the reslut code here
|
|
|
|
return res;
|
|
}
|
|
|
|
return RES_PARERR;
|
|
}
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
/* Write Sector(s) */
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
#if _USE_WRITE
|
|
DRESULT disk_write (
|
|
BYTE pdrv, /* Physical drive nmuber to identify the drive */
|
|
const BYTE *buff, /* Data to be written */
|
|
DWORD sector, /* Sector address in LBA */
|
|
UINT count /* Number of sectors to write */
|
|
)
|
|
{
|
|
DRESULT res;
|
|
int result;
|
|
|
|
switch (pdrv) {
|
|
case ATA :
|
|
// translate the arguments here
|
|
|
|
result = ATA_disk_write(buff, sector, count);
|
|
|
|
// translate the reslut code here
|
|
|
|
return res;
|
|
|
|
case MMC :
|
|
// translate the arguments here
|
|
|
|
result = MMC_disk_write(buff, sector, count);
|
|
|
|
// translate the reslut code here
|
|
|
|
return res;
|
|
|
|
case USB :
|
|
// translate the arguments here
|
|
|
|
result = USB_disk_write(buff, sector, count);
|
|
|
|
// translate the reslut code here
|
|
|
|
return res;
|
|
}
|
|
|
|
return RES_PARERR;
|
|
}
|
|
#endif
|
|
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
/* Miscellaneous Functions */
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
#if _USE_IOCTL
|
|
DRESULT disk_ioctl (
|
|
BYTE pdrv, /* Physical drive nmuber (0..) */
|
|
BYTE cmd, /* Control code */
|
|
void *buff /* Buffer to send/receive control data */
|
|
)
|
|
{
|
|
DRESULT res;
|
|
int result;
|
|
|
|
switch (pdrv) {
|
|
case ATA :
|
|
|
|
// Process of the command for the ATA drive
|
|
|
|
return res;
|
|
|
|
case MMC :
|
|
|
|
// Process of the command for the MMC/SD card
|
|
|
|
return res;
|
|
|
|
case USB :
|
|
|
|
// Process of the command the USB drive
|
|
|
|
return res;
|
|
}
|
|
|
|
return RES_PARERR;
|
|
}
|
|
#endif
|