From 75e1e7a5e26491e942fb2b25f518d8e2e3112721 Mon Sep 17 00:00:00 2001 From: inmarket Date: Fri, 15 Aug 2014 02:22:02 +1000 Subject: Add GFILE support for PetitFS (a very tiny FAT implementation) --- src/gfile/petitfs_chibios_diskio.c | 82 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/gfile/petitfs_chibios_diskio.c (limited to 'src/gfile/petitfs_chibios_diskio.c') diff --git a/src/gfile/petitfs_chibios_diskio.c b/src/gfile/petitfs_chibios_diskio.c new file mode 100644 index 00000000..dda3f6fc --- /dev/null +++ b/src/gfile/petitfs_chibios_diskio.c @@ -0,0 +1,82 @@ +/*-----------------------------------------------------------------------*/ +/* 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_PETITFS && GFX_USE_OS_CHIBIOS + +#include "petitfs_wrapper.h" + +#include + +#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 + +/*-----------------------------------------------------------------------*/ +/* Initialize a Drive */ + +DSTATUS disk_initialize (void) { +#if HAL_USE_MMC_SPI + /* It is initialized externally, just reads the status.*/ + if (blkGetDriverState(&MMCD1) != BLK_READY) + return STA_NOINIT; +#else + /* It is initialized externally, just reads the status.*/ + if (blkGetDriverState(&SDCD1) != BLK_READY) + return STA_NOINIT; +#endif + // All good + return 0; +} + +/*-----------------------------------------------------------------------*/ +/* Read Part Sector(s) */ + +static BYTE sectBuf[512]; +static DWORD sectpos = -1; + +DRESULT disk_readp ( + BYTE* buff, /* [OUT] Pointer to the read buffer */ + DWORD sector, /* [IN] Sector number */ + UINT offset, /* [IN] Byte offset in the sector to start to read */ + UINT count /* [IN] Number of bytes to read */ + ) { + + if (sector != sectpos) { + #if HAL_USE_MMC_SPI + if (blkGetDriverState(&MMCD1) != BLK_READY) + return RES_NOTRDY; + if (mmcStartSequentialRead(&MMCD1, sector)) + return RES_ERROR; + if (mmcSequentialRead(&MMCD1, sectBuf)) + return RES_ERROR; + if (mmcStopSequentialRead(&MMCD1)) + return RES_ERROR; + #else + if (blkGetDriverState(&SDCD1) != BLK_READY) + return RES_NOTRDY; + if (sdcRead(&SDCD1, sector, sectBuf, 1)) + return RES_ERROR; + #endif + sectpos = sector; + } + memcpy(buff, sectBuf + offset, count); + return RES_OK; +} + +#endif // GFX_USE_GFILE && GFILE_NEED_PETITFS && GFX_USE_OS_CHIBIOS + + -- cgit v1.2.3