aboutsummaryrefslogtreecommitdiffstats
path: root/src/gfile/petitfs_chibios_diskio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gfile/petitfs_chibios_diskio.c')
-rw-r--r--src/gfile/petitfs_chibios_diskio.c82
1 files changed, 82 insertions, 0 deletions
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 <string.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
+
+/*-----------------------------------------------------------------------*/
+/* 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
+
+