From d4e51f80601f57399db49f1010c45427bd2bf3c4 Mon Sep 17 00:00:00 2001 From: Jesse Talavera-Greenberg Date: Wed, 11 Oct 2023 11:20:05 -0400 Subject: Refactor DSi_NAND (#1844) * Refactor diskio's contents - Change ff_disk_read_cb/write_cb into a std::function instead of a raw pointer - Add const specifiers as needed * Refactor DSi_NAND to manage the file system's mounted lifetime with RAII * Split NANDMount into NANDMount and NANDImage - NANDImage is used for information about the NAND that doesn't require decryption or filesystem access - NANDMount is used to actually access the file system - Both classes manage their respective resources (the NAND file handle and the NAND's mount) with RAII - Also split the file loading into another function that I will remove in a later PR * Make NANDMount immovable * Remove NAND-loading code that I had sectioned off into a function - Incomplete copypasta - I must have gotten distracted * Tidy up NANDImage's initialization - Don't unmount the disk image if the constructor fails (that's NANDMount's job now) - Only assign CurFile if the constructor succeeds * Add some const-correctness * Move DSi NAND initialization to the frontend - The NANDImage is now installed via a unique_ptr in DSi * Remove Platform::DSi_NANDPath - Not Config::DSiNANDPath; that can still be configured as usual - The core no longer needs to care --- src/fatfs/diskio.c | 153 ----------------------------------------------------- 1 file changed, 153 deletions(-) delete mode 100644 src/fatfs/diskio.c (limited to 'src/fatfs/diskio.c') diff --git a/src/fatfs/diskio.c b/src/fatfs/diskio.c deleted file mode 100644 index 5b5c054..0000000 --- a/src/fatfs/diskio.c +++ /dev/null @@ -1,153 +0,0 @@ -/*-----------------------------------------------------------------------*/ -/* Low level disk I/O module SKELETON for FatFs (C)ChaN, 2019 */ -/*-----------------------------------------------------------------------*/ -/* 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 "ff.h" /* Obtains integer types */ -#include "diskio.h" /* Declarations of disk functions */ - - -static ff_disk_read_cb ReadCb; -static ff_disk_write_cb WriteCb; -static LBA_t SectorCount; -static DSTATUS Status = STA_NOINIT | STA_NODISK; - - -void ff_disk_open(ff_disk_read_cb readcb, ff_disk_write_cb writecb, LBA_t seccnt) -{ - if (!readcb) return; - - ReadCb = readcb; - WriteCb = writecb; - SectorCount = seccnt; - - Status &= ~STA_NODISK; - if (!writecb) Status |= STA_PROTECT; - else Status &= ~STA_PROTECT; -} - -void ff_disk_close(void) -{ - ReadCb = (void*)0; - WriteCb = (void*)0; - SectorCount = 0; - - Status &= ~STA_PROTECT; - Status |= STA_NODISK; -} - - -/*-----------------------------------------------------------------------*/ -/* Get Drive Status */ -/*-----------------------------------------------------------------------*/ - -DSTATUS disk_status ( - BYTE pdrv /* Physical drive nmuber to identify the drive */ -) -{ - return Status; -} - - - -/*-----------------------------------------------------------------------*/ -/* Inidialize a Drive */ -/*-----------------------------------------------------------------------*/ - -DSTATUS disk_initialize ( - BYTE pdrv /* Physical drive nmuber to identify the drive */ -) -{ - Status &= ~STA_NOINIT; - return Status; -} - - - -/*-----------------------------------------------------------------------*/ -/* Read Sector(s) */ -/*-----------------------------------------------------------------------*/ - -DRESULT disk_read ( - BYTE pdrv, /* Physical drive nmuber to identify the drive */ - BYTE *buff, /* Data buffer to store read data */ - LBA_t sector, /* Start sector in LBA */ - UINT count /* Number of sectors to read */ -) -{ - if (Status & (STA_NOINIT | STA_NODISK)) return RES_NOTRDY; - if (!ReadCb) return RES_ERROR; - - UINT res = ReadCb(buff, sector, count); - if (res != count) return RES_ERROR; - return RES_OK; -} - - - -/*-----------------------------------------------------------------------*/ -/* Write Sector(s) */ -/*-----------------------------------------------------------------------*/ - -#if FF_FS_READONLY == 0 - -DRESULT disk_write ( - BYTE pdrv, /* Physical drive nmuber to identify the drive */ - const BYTE *buff, /* Data to be written */ - LBA_t sector, /* Start sector in LBA */ - UINT count /* Number of sectors to write */ -) -{ - if (Status & (STA_NOINIT | STA_NODISK)) return RES_NOTRDY; - if (Status & STA_PROTECT) return RES_WRPRT; - if (!WriteCb) return RES_ERROR; - - UINT res = WriteCb(buff, sector, count); - if (res != count) return RES_ERROR; - return RES_OK; -} - -#endif - - -/*-----------------------------------------------------------------------*/ -/* Miscellaneous Functions */ -/*-----------------------------------------------------------------------*/ - -DRESULT disk_ioctl ( - BYTE pdrv, /* Physical drive nmuber (0..) */ - BYTE cmd, /* Control code */ - void *buff /* Buffer to send/receive control data */ -) -{ - switch (cmd) - { - case CTRL_SYNC: - // TODO: fflush? - return RES_OK; - - case GET_SECTOR_COUNT: - *(LBA_t*)buff = SectorCount; - return RES_OK; - - case GET_SECTOR_SIZE: - *(WORD*)buff = 0x200; - return RES_OK; - - case GET_BLOCK_SIZE: - *(DWORD*)buff = 1; - return RES_OK; - - case CTRL_TRIM: - // TODO?? - return RES_OK; - } - - //printf("FatFS: unknown disk_ioctl(%02X, %02X, %p)\n", pdrv, cmd, buff); - return RES_PARERR; -} - -- cgit v1.2.3