diff options
Diffstat (limited to 'src/gfile/fatfs')
-rw-r--r-- | src/gfile/fatfs/fatfs.c | 20 | ||||
-rw-r--r-- | src/gfile/fatfs/fatfs.mk | 6 | ||||
-rw-r--r-- | src/gfile/fatfs/fatfs_chibios_diskio.c (renamed from src/gfile/fatfs/src/chibios_fatfs_diskio.c) | 511 | ||||
-rw-r--r-- | src/gfile/fatfs/fatfs_syscall.c (renamed from src/gfile/fatfs/src/syscall.c) | 155 |
4 files changed, 360 insertions, 332 deletions
diff --git a/src/gfile/fatfs/fatfs.c b/src/gfile/fatfs/fatfs.c new file mode 100644 index 00000000..f9d11aeb --- /dev/null +++ b/src/gfile/fatfs/fatfs.c @@ -0,0 +1,20 @@ +/* + * This file is subject to the terms of the GFX License. If a copy of + * the license was not distributed with this file, you can obtain one at: + * + * http://ugfx.org/license.html + */ + +/** + * @file src/gfile/fatfs/fatfs.c + * @brief GFILE FATFS wrapper. + * + */ + +#include "gfx.h" + +#if GFX_USE_GFILE && GFILE_NEED_FATFS + +#include "src/ff.c" + +#endif // GFX_USE_GFILE && GFILE_NEED_FATFS diff --git a/src/gfile/fatfs/fatfs.mk b/src/gfile/fatfs/fatfs.mk index 0b540a41..683cea5b 100644 --- a/src/gfile/fatfs/fatfs.mk +++ b/src/gfile/fatfs/fatfs.mk @@ -1,6 +1,6 @@ -GFXSRC += $(GFXLIB)/src/gfile/fatfs/src/ff.c \ - $(GFXLIB)/src/gfile/fatfs/src/chibios_fatfs_diskio.c \ - $(GFXLIB)/src/gfile/fatfs/src/syscall.c +GFXSRC += $(GFXLIB)/src/gfile/fatfs/fatfs.c \ + $(GFXLIB)/src/gfile/fatfs/fatfs_syscall.c \ + $(GFXLIB)/src/gfile/fatfs/fatfs_chibios_diskio.c GFXINC += $(GFXLIB)/src/gfile/fatfs/src diff --git a/src/gfile/fatfs/src/chibios_fatfs_diskio.c b/src/gfile/fatfs/fatfs_chibios_diskio.c index f882aa41..d770e2a1 100644 --- a/src/gfile/fatfs/src/chibios_fatfs_diskio.c +++ b/src/gfile/fatfs/fatfs_chibios_diskio.c @@ -1,254 +1,257 @@ -/*-----------------------------------------------------------------------*/
-/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */
-/*-----------------------------------------------------------------------*/
-/* This is a stub disk I/O module that acts as front end of the existing */
-/* disk I/O modules and attach it to FatFs module with common interface. */
-/*-----------------------------------------------------------------------*/
-
-#include "ch.h"
-#include "hal.h"
-#include "ffconf.h"
-#include "diskio.h"
-
-#if HAL_USE_MMC_SPI && HAL_USE_SDC
-#error "cannot specify both MMC_SPI and SDC drivers"
-#endif
-
-#if HAL_USE_MMC_SPI
-extern MMCDriver MMCD1;
-#elif HAL_USE_SDC
-extern SDCDriver SDCD1;
-#else
-#error "MMC_SPI or SDC driver must be specified"
-#endif
-
-#if HAL_USE_RTC
-#include "chrtclib.h"
-extern RTCDriver RTCD1;
-#endif
-
-/*-----------------------------------------------------------------------*/
-/* Correspondence between physical drive number and physical drive. */
-
-#define MMC 0
-#define SDC 0
-
-
-
-/*-----------------------------------------------------------------------*/
-/* Inidialize a Drive */
-
-DSTATUS disk_initialize (
- BYTE drv /* Physical drive nmuber (0..) */
-)
-{
- DSTATUS stat;
-
- switch (drv) {
-#if HAL_USE_MMC_SPI
- case MMC:
- stat = 0;
- /* It is initialized externally, just reads the status.*/
- if (blkGetDriverState(&MMCD1) != BLK_READY)
- stat |= STA_NOINIT;
- if (mmcIsWriteProtected(&MMCD1))
- stat |= STA_PROTECT;
- return stat;
-#else
- case SDC:
- stat = 0;
- /* It is initialized externally, just reads the status.*/
- if (blkGetDriverState(&SDCD1) != BLK_READY)
- stat |= STA_NOINIT;
- if (sdcIsWriteProtected(&SDCD1))
- stat |= STA_PROTECT;
- return stat;
-#endif
- }
- return STA_NODISK;
-}
-
-
-
-/*-----------------------------------------------------------------------*/
-/* Return Disk Status */
-
-DSTATUS disk_status (
- BYTE drv /* Physical drive nmuber (0..) */
-)
-{
- DSTATUS stat;
-
- switch (drv) {
-#if HAL_USE_MMC_SPI
- case MMC:
- stat = 0;
- /* It is initialized externally, just reads the status.*/
- if (blkGetDriverState(&MMCD1) != BLK_READY)
- stat |= STA_NOINIT;
- if (mmcIsWriteProtected(&MMCD1))
- stat |= STA_PROTECT;
- return stat;
-#else
- case SDC:
- stat = 0;
- /* It is initialized externally, just reads the status.*/
- if (blkGetDriverState(&SDCD1) != BLK_READY)
- stat |= STA_NOINIT;
- if (sdcIsWriteProtected(&SDCD1))
- stat |= STA_PROTECT;
- return stat;
-#endif
- }
- return STA_NODISK;
-}
-
-
-
-/*-----------------------------------------------------------------------*/
-/* Read Sector(s) */
-
-DRESULT disk_read (
- BYTE drv, /* Physical drive nmuber (0..) */
- BYTE *buff, /* Data buffer to store read data */
- DWORD sector, /* Sector address (LBA) */
- UINT count /* Number of sectors to read (1..255) */
-)
-{
- switch (drv) {
-#if HAL_USE_MMC_SPI
- case MMC:
- if (blkGetDriverState(&MMCD1) != BLK_READY)
- return RES_NOTRDY;
- if (mmcStartSequentialRead(&MMCD1, sector))
- return RES_ERROR;
- while (count > 0) {
- if (mmcSequentialRead(&MMCD1, buff))
- return RES_ERROR;
- buff += MMCSD_BLOCK_SIZE;
- count--;
- }
- if (mmcStopSequentialRead(&MMCD1))
- return RES_ERROR;
- return RES_OK;
-#else
- case SDC:
- if (blkGetDriverState(&SDCD1) != BLK_READY)
- return RES_NOTRDY;
- if (sdcRead(&SDCD1, sector, buff, count))
- return RES_ERROR;
- return RES_OK;
-#endif
- }
- return RES_PARERR;
-}
-
-
-
-/*-----------------------------------------------------------------------*/
-/* Write Sector(s) */
-
-#if _READONLY == 0
-DRESULT disk_write (
- BYTE drv, /* Physical drive nmuber (0..) */
- const BYTE *buff, /* Data to be written */
- DWORD sector, /* Sector address (LBA) */
- UINT count /* Number of sectors to write (1..255) */
-)
-{
- switch (drv) {
-#if HAL_USE_MMC_SPI
- case MMC:
- if (blkGetDriverState(&MMCD1) != BLK_READY)
- return RES_NOTRDY;
- if (mmcIsWriteProtected(&MMCD1))
- return RES_WRPRT;
- if (mmcStartSequentialWrite(&MMCD1, sector))
- return RES_ERROR;
- while (count > 0) {
- if (mmcSequentialWrite(&MMCD1, buff))
- return RES_ERROR;
- buff += MMCSD_BLOCK_SIZE;
- count--;
- }
- if (mmcStopSequentialWrite(&MMCD1))
- return RES_ERROR;
- return RES_OK;
-#else
- case SDC:
- if (blkGetDriverState(&SDCD1) != BLK_READY)
- return RES_NOTRDY;
- if (sdcWrite(&SDCD1, sector, buff, count))
- return RES_ERROR;
- return RES_OK;
-#endif
- }
- return RES_PARERR;
-}
-#endif /* _READONLY */
-
-
-
-/*-----------------------------------------------------------------------*/
-/* Miscellaneous Functions */
-
-DRESULT disk_ioctl (
- BYTE drv, /* Physical drive nmuber (0..) */
- BYTE ctrl, /* Control code */
- void *buff /* Buffer to send/receive control data */
-)
-{
- switch (drv) {
-#if HAL_USE_MMC_SPI
- case MMC:
- switch (ctrl) {
- case CTRL_SYNC:
- return RES_OK;
- case GET_SECTOR_SIZE:
- *((WORD *)buff) = MMCSD_BLOCK_SIZE;
- return RES_OK;
-#if _USE_ERASE
- case CTRL_ERASE_SECTOR:
- mmcErase(&MMCD1, *((DWORD *)buff), *((DWORD *)buff + 1));
- return RES_OK;
-#endif
- default:
- return RES_PARERR;
- }
-#else
- case SDC:
- switch (ctrl) {
- case CTRL_SYNC:
- return RES_OK;
- case GET_SECTOR_COUNT:
- *((DWORD *)buff) = mmcsdGetCardCapacity(&SDCD1);
- return RES_OK;
- case GET_SECTOR_SIZE:
- *((WORD *)buff) = MMCSD_BLOCK_SIZE;
- return RES_OK;
- case GET_BLOCK_SIZE:
- *((DWORD *)buff) = 256; /* 512b blocks in one erase block */
- return RES_OK;
-#if _USE_ERASE
- case CTRL_ERASE_SECTOR:
- sdcErase(&SDCD1, *((DWORD *)buff), *((DWORD *)buff + 1));
- return RES_OK;
-#endif
- default:
- return RES_PARERR;
- }
-#endif
- }
- return RES_PARERR;
-}
-
-DWORD get_fattime(void) {
-#if HAL_USE_RTC
- return rtcGetTimeFat(&RTCD1);
-#else
- return ((uint32_t)0 | (1 << 16)) | (1 << 21); /* wrong but valid time */
-#endif
-}
-
-
-
+/*-----------------------------------------------------------------------*/ +/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */ +/*-----------------------------------------------------------------------*/ +/* This is a stub disk I/O module that acts as front end of the existing */ +/* disk I/O modules and attach it to FatFs module with common interface. */ +/*-----------------------------------------------------------------------*/ + +#include "gfx.h" + +#if GFX_USE_GFILE && GFILE_NEED_FATFS && GFX_USE_OS_CHIBIOS + +#include "ffconf.h" +#include "diskio.h" + +#if HAL_USE_MMC_SPI && HAL_USE_SDC +#error "cannot specify both MMC_SPI and SDC drivers" +#endif + +#if HAL_USE_MMC_SPI +extern MMCDriver MMCD1; +#elif HAL_USE_SDC +extern SDCDriver SDCD1; +#else +#error "MMC_SPI or SDC driver must be specified" +#endif + +#if HAL_USE_RTC +#include "chrtclib.h" +extern RTCDriver RTCD1; +#endif + +/*-----------------------------------------------------------------------*/ +/* Correspondence between physical drive number and physical drive. */ + +#define MMC 0 +#define SDC 0 + + + +/*-----------------------------------------------------------------------*/ +/* Inidialize a Drive */ + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive nmuber (0..) */ +) +{ + DSTATUS stat; + + switch (drv) { +#if HAL_USE_MMC_SPI + case MMC: + stat = 0; + /* It is initialized externally, just reads the status.*/ + if (blkGetDriverState(&MMCD1) != BLK_READY) + stat |= STA_NOINIT; + if (mmcIsWriteProtected(&MMCD1)) + stat |= STA_PROTECT; + return stat; +#else + case SDC: + stat = 0; + /* It is initialized externally, just reads the status.*/ + if (blkGetDriverState(&SDCD1) != BLK_READY) + stat |= STA_NOINIT; + if (sdcIsWriteProtected(&SDCD1)) + stat |= STA_PROTECT; + return stat; +#endif + } + return STA_NODISK; +} + + + +/*-----------------------------------------------------------------------*/ +/* Return Disk Status */ + +DSTATUS disk_status ( + BYTE drv /* Physical drive nmuber (0..) */ +) +{ + DSTATUS stat; + + switch (drv) { +#if HAL_USE_MMC_SPI + case MMC: + stat = 0; + /* It is initialized externally, just reads the status.*/ + if (blkGetDriverState(&MMCD1) != BLK_READY) + stat |= STA_NOINIT; + if (mmcIsWriteProtected(&MMCD1)) + stat |= STA_PROTECT; + return stat; +#else + case SDC: + stat = 0; + /* It is initialized externally, just reads the status.*/ + if (blkGetDriverState(&SDCD1) != BLK_READY) + stat |= STA_NOINIT; + if (sdcIsWriteProtected(&SDCD1)) + stat |= STA_PROTECT; + return stat; +#endif + } + return STA_NODISK; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ + +DRESULT disk_read ( + BYTE drv, /* Physical drive nmuber (0..) */ + BYTE *buff, /* Data buffer to store read data */ + DWORD sector, /* Sector address (LBA) */ + UINT count /* Number of sectors to read (1..255) */ +) +{ + switch (drv) { +#if HAL_USE_MMC_SPI + case MMC: + if (blkGetDriverState(&MMCD1) != BLK_READY) + return RES_NOTRDY; + if (mmcStartSequentialRead(&MMCD1, sector)) + return RES_ERROR; + while (count > 0) { + if (mmcSequentialRead(&MMCD1, buff)) + return RES_ERROR; + buff += MMCSD_BLOCK_SIZE; + count--; + } + if (mmcStopSequentialRead(&MMCD1)) + return RES_ERROR; + return RES_OK; +#else + case SDC: + if (blkGetDriverState(&SDCD1) != BLK_READY) + return RES_NOTRDY; + if (sdcRead(&SDCD1, sector, buff, count)) + return RES_ERROR; + return RES_OK; +#endif + } + return RES_PARERR; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ + +#if _READONLY == 0 +DRESULT disk_write ( + BYTE drv, /* Physical drive nmuber (0..) */ + const BYTE *buff, /* Data to be written */ + DWORD sector, /* Sector address (LBA) */ + UINT count /* Number of sectors to write (1..255) */ +) +{ + switch (drv) { +#if HAL_USE_MMC_SPI + case MMC: + if (blkGetDriverState(&MMCD1) != BLK_READY) + return RES_NOTRDY; + if (mmcIsWriteProtected(&MMCD1)) + return RES_WRPRT; + if (mmcStartSequentialWrite(&MMCD1, sector)) + return RES_ERROR; + while (count > 0) { + if (mmcSequentialWrite(&MMCD1, buff)) + return RES_ERROR; + buff += MMCSD_BLOCK_SIZE; + count--; + } + if (mmcStopSequentialWrite(&MMCD1)) + return RES_ERROR; + return RES_OK; +#else + case SDC: + if (blkGetDriverState(&SDCD1) != BLK_READY) + return RES_NOTRDY; + if (sdcWrite(&SDCD1, sector, buff, count)) + return RES_ERROR; + return RES_OK; +#endif + } + return RES_PARERR; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ + +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive nmuber (0..) */ + BYTE ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + switch (drv) { +#if HAL_USE_MMC_SPI + case MMC: + switch (ctrl) { + case CTRL_SYNC: + return RES_OK; + case GET_SECTOR_SIZE: + *((WORD *)buff) = MMCSD_BLOCK_SIZE; + return RES_OK; +#if _USE_ERASE + case CTRL_ERASE_SECTOR: + mmcErase(&MMCD1, *((DWORD *)buff), *((DWORD *)buff + 1)); + return RES_OK; +#endif + default: + return RES_PARERR; + } +#else + case SDC: + switch (ctrl) { + case CTRL_SYNC: + return RES_OK; + case GET_SECTOR_COUNT: + *((DWORD *)buff) = mmcsdGetCardCapacity(&SDCD1); + return RES_OK; + case GET_SECTOR_SIZE: + *((WORD *)buff) = MMCSD_BLOCK_SIZE; + return RES_OK; + case GET_BLOCK_SIZE: + *((DWORD *)buff) = 256; /* 512b blocks in one erase block */ + return RES_OK; +#if _USE_ERASE + case CTRL_ERASE_SECTOR: + sdcErase(&SDCD1, *((DWORD *)buff), *((DWORD *)buff + 1)); + return RES_OK; +#endif + default: + return RES_PARERR; + } +#endif + } + return RES_PARERR; +} + +DWORD get_fattime(void) { +#if HAL_USE_RTC + return rtcGetTimeFat(&RTCD1); +#else + return ((uint32_t)0 | (1 << 16)) | (1 << 21); /* wrong but valid time */ +#endif +} + +#endif // GFX_USE_GFILE && GFILE_NEED_FATFS && GFX_USE_OS_CHIBIOS + + diff --git a/src/gfile/fatfs/src/syscall.c b/src/gfile/fatfs/fatfs_syscall.c index ccc22bdb..80342731 100644 --- a/src/gfile/fatfs/src/syscall.c +++ b/src/gfile/fatfs/fatfs_syscall.c @@ -1,75 +1,80 @@ -/*
- * This file is subject to the terms of the GFX License. If a copy of
- * the license was not distributed with this file, you can obtain one at:
- *
- * http://ugfx.org/license.html
- */
-
-#include "gfx.h"
-#include "ff.h"
-
-#if _FS_REENTRANT
-
-/*------------------------------------------------------------------------*/
-/* Static array of Synchronization Objects */
-/*------------------------------------------------------------------------*/
-static gfxSem ff_sem[_VOLUMES];
-
-/*------------------------------------------------------------------------*/
-/* Create a Synchronization Object */
-/*------------------------------------------------------------------------*/
-int ff_cre_syncobj(BYTE vol, _SYNC_t *sobj)
-{
- *sobj = ff_sem[vol];
- gfxSemInit(sobj, 1, MAX_SEMAPHORE_COUNT);
-
- return 1;
-}
-
-/*------------------------------------------------------------------------*/
-/* Delete a Synchronization Object */
-/*------------------------------------------------------------------------*/
-int ff_del_syncobj(_SYNC_t sobj)
-{
- gfxSemDestroy( (gfxSem*)&sobj );
-
- return 1;
-}
-
-/*------------------------------------------------------------------------*/
-/* Request Grant to Access the Volume */
-/*------------------------------------------------------------------------*/
-int ff_req_grant(_SYNC_t sobj)
-{
- if (gfxSemWait( (gfxSem*)&sobj, (delaytime_t)_FS_TIMEOUT) )
- return TRUE;
- return FALSE;
-}
-
-/*------------------------------------------------------------------------*/
-/* Release Grant to Access the Volume */
-/*------------------------------------------------------------------------*/
-void ff_rel_grant(_SYNC_t sobj)
-{
- gfxSemSignal( (gfxSem*)&sobj );
-}
-#endif /* _FS_REENTRANT */
-
-#if _USE_LFN == 3 /* LFN with a working buffer on the heap */
-/*------------------------------------------------------------------------*/
-/* Allocate a memory block */
-/*------------------------------------------------------------------------*/
-void *ff_memalloc(UINT size)
-{
- return gfxAlloc( (size_t)size );
-}
-
-/*------------------------------------------------------------------------*/
-/* Free a memory block */
-/*------------------------------------------------------------------------*/
-void ff_memfree(void *mblock)
-{
- gfxFree(mblock);
-}
-#endif /* _USE_LFN == 3 */
-
+/* + * This file is subject to the terms of the GFX License. If a copy of + * the license was not distributed with this file, you can obtain one at: + * + * http://ugfx.org/license.html + */ + +#include "gfx.h" + +#if GFX_USE_GFILE && GFILE_NEED_FATFS + +#include "ff.h" + +#if _FS_REENTRANT + +/*------------------------------------------------------------------------*/ +/* Static array of Synchronization Objects */ +/*------------------------------------------------------------------------*/ +static gfxSem ff_sem[_VOLUMES]; + +/*------------------------------------------------------------------------*/ +/* Create a Synchronization Object */ +/*------------------------------------------------------------------------*/ +int ff_cre_syncobj(BYTE vol, _SYNC_t *sobj) +{ + *sobj = ff_sem[vol]; + gfxSemInit(sobj, 1, MAX_SEMAPHORE_COUNT); + + return 1; +} + +/*------------------------------------------------------------------------*/ +/* Delete a Synchronization Object */ +/*------------------------------------------------------------------------*/ +int ff_del_syncobj(_SYNC_t sobj) +{ + gfxSemDestroy( (gfxSem*)&sobj ); + + return 1; +} + +/*------------------------------------------------------------------------*/ +/* Request Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +int ff_req_grant(_SYNC_t sobj) +{ + if (gfxSemWait( (gfxSem*)&sobj, (delaytime_t)_FS_TIMEOUT) ) + return TRUE; + return FALSE; +} + +/*------------------------------------------------------------------------*/ +/* Release Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +void ff_rel_grant(_SYNC_t sobj) +{ + gfxSemSignal( (gfxSem*)&sobj ); +} +#endif /* _FS_REENTRANT */ + +#if _USE_LFN == 3 /* LFN with a working buffer on the heap */ +/*------------------------------------------------------------------------*/ +/* Allocate a memory block */ +/*------------------------------------------------------------------------*/ +void *ff_memalloc(UINT size) +{ + return gfxAlloc( (size_t)size ); +} + +/*------------------------------------------------------------------------*/ +/* Free a memory block */ +/*------------------------------------------------------------------------*/ +void ff_memfree(void *mblock) +{ + gfxFree(mblock); +} +#endif /* _USE_LFN == 3 */ + +#endif // GFX_USE_GFILE && GFILE_NEED_FATFS + |