#include #include "diskio.h" #include "sdcard.h" /*-----------------------------------------------------------------------*/ /* Get Disk Status */ /*-----------------------------------------------------------------------*/ DSTATUS disk_status ( BYTE drv /* Drive number (always 0) */ ) { if (drv) return STA_NOINIT; if (sd_get_sector_count()) return 0; return STA_NODISK; } /*-----------------------------------------------------------------------*/ /* Initialize Disk Drive */ /*-----------------------------------------------------------------------*/ DSTATUS disk_initialize ( BYTE drv /* Physical drive nmuber (0) */ ) { if (drv) return RES_NOTRDY; if (sd_get_sector_count()) { return 0; } else { if (sd_init() == 0) return 0; } return STA_NOINIT; } /*-----------------------------------------------------------------------*/ /* Read Sector(s) */ /*-----------------------------------------------------------------------*/ DRESULT disk_read ( BYTE drv, /* Physical drive nmuber (0) */ BYTE *buff, /* Pointer to the data buffer to store read data */ DWORD sector, /* Start sector number (LBA) */ UINT count /* Sector count (1..128) */ ) { if (disk_status(drv) & STA_NOINIT) return RES_NOTRDY; while (count--) { if (sd_readsector(sector++, buff) != 0) { return RES_ERROR; } buff += 512; } return RES_OK; } /*-----------------------------------------------------------------------*/ /* Write Sector(s) */ /*-----------------------------------------------------------------------*/ DRESULT disk_write ( BYTE drv, /* Physical drive nmuber (0) */ const BYTE *buff, /* Pointer to the data to be written */ DWORD sector, /* Start sector number (LBA) */ UINT count /* Sector count (1..128) */ ) { if (disk_status(drv) & STA_NOINIT) return RES_NOTRDY; while (count--) { if (sd_writesector(sector++, buff) != 0) { return RES_ERROR; } buff += 512; } return RES_OK; } /*-----------------------------------------------------------------------*/ /* Miscellaneous Functions */ /*-----------------------------------------------------------------------*/ DRESULT disk_ioctl ( BYTE drv, /* Physical drive nmuber (0) */ BYTE ctrl, /* Control code */ void *buff /* Buffer to send/receive control data */ ) { DRESULT res; if (disk_status(drv) & STA_NOINIT) return RES_NOTRDY; /* Check if card is in the socket */ res = RES_ERROR; switch (ctrl) { case CTRL_SYNC : /* Make sure that no pending write process */ res = RES_OK; break; case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */ *(DWORD*)buff = sd_get_sector_count(); res = RES_OK; break; case GET_BLOCK_SIZE : /* Get erase block size in unit of sector (DWORD) */ *(DWORD*)buff = 128; res = RES_OK; break; default: res = RES_PARERR; } return res; }