summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/nds/libfat/source/disc_io/io_fcsr.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/arm/nds/libfat/source/disc_io/io_fcsr.c')
-rw-r--r--c/src/lib/libbsp/arm/nds/libfat/source/disc_io/io_fcsr.c334
1 files changed, 0 insertions, 334 deletions
diff --git a/c/src/lib/libbsp/arm/nds/libfat/source/disc_io/io_fcsr.c b/c/src/lib/libbsp/arm/nds/libfat/source/disc_io/io_fcsr.c
deleted file mode 100644
index c888db0a0a..0000000000
--- a/c/src/lib/libbsp/arm/nds/libfat/source/disc_io/io_fcsr.c
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- io_fcsr.c based on
-
- compact_flash.c
- By chishm (Michael Chisholm)
-
- Hardware Routines for using a GBA Flash Cart and SRAM as a
- block device.
-
- The file system must be 512 byte aligned, in cart address space.
- SRAM is supported.
-
- Copyright (c) 2006 Michael "Chishm" Chisholm
-
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
- 3. The name of the author may not be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-
-#include "io_fcsr.h"
-
-#include <string.h>
-
-//---------------------------------------------------------------
-// DMA
-#ifdef _IO_USE_DMA
- #ifndef NDS
- #include "gba_dma.h"
- #else
- #include <nds/dma.h>
- #ifdef ARM9
- #include <nds/arm9/cache.h>
- #endif
- #endif
-#endif
-
-#ifdef NDS
- #define SRAM_START 0x0A000000
-#else
- #define SRAM_START 0x0E000000
-#endif
-
-#define NO_SRAM 0xFFFFFFFF
-
-#define FCSR 0x52534346
-const char _FCSR_LabelString[] = " Chishm FAT";
-
-u8* _FCSR_FileSysPointer = 0;
-u8* _FCSR_SramSectorPointer[4] = {0,0,0,0};
-u32 _FCSR_SramSectorStart[4] = {0,0,0,0};
-u32 _FCSR_SramSectorEnd[4] = {0,0,0,0};
-
-/*-----------------------------------------------------------------
-_FCSR_isInserted
-Is a GBA Flash Cart with a valid file system inserted?
-bool return OUT: true if a GBA FC card is inserted
------------------------------------------------------------------*/
-static bool _FCSR_isInserted (void)
-{
- bool flagFoundFileSys = false;
-
- u32* fileSysPointer = (u32*)0x08000100; // Start at beginning of cart address space, offset by expected location of string
-
- // Search for file system
- while ((fileSysPointer < (u32*)0x0A000000) && !flagFoundFileSys) // Only search while not at end of cart address space
- {
- while ((*fileSysPointer != FCSR) && (fileSysPointer < (u32*)0x0A000000))
- fileSysPointer += 0x40;
- if ((strncmp(_FCSR_LabelString, (char*)(fileSysPointer + 1), 12) == 0) && (fileSysPointer < (u32*)0x0A000000))
- {
- flagFoundFileSys = true;
- } else {
- fileSysPointer += 0x80;
- }
- }
-
- return flagFoundFileSys;
-}
-
-
-/*-----------------------------------------------------------------
-_FCSR_clearStatus
-Finish any pending operations
-bool return OUT: always true for GBA FC
------------------------------------------------------------------*/
-static bool _FCSR_clearStatus (void)
-{
- return true;
-}
-
-
-/*-----------------------------------------------------------------
-_FCSR_readSectors
-Read 512 byte sector numbered "sector" into "buffer"
-u32 sector IN: address of first 512 byte sector on Flash Cart to read
-u32 numSectors IN: number of 512 byte sectors to read,
- 1 to 256 sectors can be read
-void* buffer OUT: pointer to 512 byte buffer to store data in
-bool return OUT: true if successful
------------------------------------------------------------------*/
-static bool _FCSR_readSectors (u32 sector, u32 numSectors, void* buffer)
-{
- int i;
- bool flagSramSector = false;
- int readLength = numSectors * BYTES_PER_READ;
- u8* src;
- u8* dst;
-
- // Find which region this read is in
- for (i = 0; (i < 4) && !flagSramSector; i++)
- {
- if ((sector >= _FCSR_SramSectorStart[i]) && (sector < _FCSR_SramSectorEnd[i]))
- {
- flagSramSector = true;
- break;
- }
- }
-
- // Make sure read will be completely in SRAM range if it is partially there
- if ( flagSramSector && ((sector + numSectors) > _FCSR_SramSectorEnd[i]))
- return false;
-
- // Copy data to buffer
- if (flagSramSector)
- {
- src = _FCSR_SramSectorPointer[i] + (sector - _FCSR_SramSectorStart[i]) * BYTES_PER_READ;
- } else {
- src = _FCSR_FileSysPointer + sector * BYTES_PER_READ;
- }
- dst = (u8*)buffer;
-
- if (flagSramSector)
- {
- while (readLength--)
- {
- *dst++ = *src++;
- }
- } else { // Reading from Cart ROM
-
-#ifdef _IO_USE_DMA
- #ifdef NDS
- #ifdef ARM9
- DC_FlushRange( buffer, readLength);
- #endif // ARM9
- DMA3_SRC = (u32)src;
- DMA3_DEST = (u32)buffer;
- DMA3_CR = (readLength >> 1) | DMA_COPY_HALFWORDS;
- #else // ! NDS
- DMA3COPY ( src, buffer, (readLength >> 1) | DMA16 | DMA_ENABLE);
- #endif // NDS
-#else // !_IO_USE_DMA
- memcpy (buffer, src, readLength);
-#endif // _IO_USE_DMA
-
- } // if (flagSramSector)
-
- return true;
-}
-
-/*-----------------------------------------------------------------
-_FCSR_writeSectors
-Write 512 byte sector numbered "sector" from "buffer"
-u32 sector IN: address of 512 byte sector on Flash Cart to read
-u32 numSectors IN: number of 512 byte sectors to read,
- 1 to 256 sectors can be read
-void* buffer IN: pointer to 512 byte buffer to read data from
-bool return OUT: true if successful
------------------------------------------------------------------*/
-static bool _FCSR_writeSectors (u32 sector, u8 numSectors, void* buffer)
-{
- int i;
- bool flagSramSector = false;
- u32 writeLength = numSectors * BYTES_PER_READ;
- u8* src = (u8*) buffer;
- u8* dst;
-
- // Find which region this sector belongs in
- for (i = 0; (i < 4) && !flagSramSector; i++)
- {
- if ((sector >= _FCSR_SramSectorStart[i]) && (sector < _FCSR_SramSectorEnd[i]))
- {
- flagSramSector = true;
- break;
- }
- }
-
- if (!flagSramSector)
- return false;
-
- // Entire write must be within an SRAM region
- if ((sector + numSectors) > _FCSR_SramSectorEnd[i])
- return false;
-
- // Copy data to SRAM
- dst = _FCSR_SramSectorPointer[i] + (sector - _FCSR_SramSectorStart[i]) * BYTES_PER_READ;
- while (writeLength--)
- {
- *dst++ = *src++;
- }
-
- return true;
-}
-
-/*-----------------------------------------------------------------
-_FCSR_shutdown
-unload the Flash Cart interface
------------------------------------------------------------------*/
-static bool _FCSR_shutdown(void)
-{
- int i;
- if (_FCSR_clearStatus() == false)
- return false;
-
- _FCSR_FileSysPointer = 0;
-
- for (i=0; i < 4; i++)
- {
- _FCSR_SramSectorPointer[i] = 0;
- _FCSR_SramSectorStart[i] = 0;
- _FCSR_SramSectorEnd[i] = 0;
- }
- return true;
-}
-
-/*-----------------------------------------------------------------
-_FCSR_startUp
-initializes the Flash Cart interface, returns true if successful,
-otherwise returns false
------------------------------------------------------------------*/
-static bool _FCSR_startUp(void)
-{
- bool flagFoundFileSys = false;
- int i;
- int SramRegionSize[4];
- u8* srcByte;
- u8* destByte;
-
- u32* fileSysPointer = (u32*)0x08000100; // Start at beginning of cart address space, offset by expected location of string
-
- // Search for file system
- while ((fileSysPointer < (u32*)0x0A000000) && !flagFoundFileSys) // Only search while not at end of cart address space
- {
- while ((*fileSysPointer != FCSR) && (fileSysPointer < (u32*)0x0A000000))
- fileSysPointer += 0x40;
- if ((strncmp(_FCSR_LabelString, (char*)(fileSysPointer + 1), 12) == 0) && (fileSysPointer < (u32*)0x0A000000))
- {
- flagFoundFileSys = true;
- } else {
- fileSysPointer += 0x80;
- }
- }
-
- if (!flagFoundFileSys)
- return false;
-
- // Flash cart file system pointer has been found
- _FCSR_FileSysPointer = (u8*)(fileSysPointer - 0x40);
-
- // Get SRAM sector regions from header block
- for (i = 0; i < 4; i++)
- {
- _FCSR_SramSectorStart[i] = fileSysPointer[i+4];
- SramRegionSize[i] = fileSysPointer[i+8];
- _FCSR_SramSectorEnd[i] = _FCSR_SramSectorStart[i] + SramRegionSize[i];
- }
-
- // Calculate SRAM region pointers
- _FCSR_SramSectorPointer[0] = (u8*)(SRAM_START + 4);
- for (i = 1; i < 4; i++)
- {
- _FCSR_SramSectorPointer[i] = _FCSR_SramSectorPointer[i-1] + (SramRegionSize[i-1] * BYTES_PER_READ);
- }
-
- // Initialise SRAM with overlay if it hasn't been done so
- if ( (*((u8*)SRAM_START) != 'F') || (*((u8*)(SRAM_START+1)) != 'C') || (*((u8*)(SRAM_START+2)) != 'S') || (*((u8*)(SRAM_START+3)) != 'R') )
- {
- *((u8*)SRAM_START) = 'F';
- *((u8*)(SRAM_START+1)) = 'C';
- *((u8*)(SRAM_START+2)) = 'S';
- *((u8*)(SRAM_START+3)) = 'R';
-
- for (i = 0; i < 4; i++)
- {
- srcByte = _FCSR_FileSysPointer + (_FCSR_SramSectorStart[i] * BYTES_PER_READ);
- destByte = _FCSR_SramSectorPointer[i];
- while (srcByte < _FCSR_FileSysPointer + (_FCSR_SramSectorEnd[i] * BYTES_PER_READ) )
- *destByte++ = *srcByte++;
- }
- }
-
- // Get SRAM sector regions from header block
- for (i = 0; i < 4; i++)
- {
- if (SramRegionSize[i] == 0)
- {
- _FCSR_SramSectorStart[i] = NO_SRAM;
- _FCSR_SramSectorEnd[i] = NO_SRAM;
- }
- }
-
- return true;
-}
-
-/*-----------------------------------------------------------------
-the actual interface structure
------------------------------------------------------------------*/
-const IO_INTERFACE _io_fcsr = {
- DEVICE_TYPE_FCSR, // 'FCSR'
- FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE | FEATURE_SLOT_GBA,
- (FN_MEDIUM_STARTUP)&_FCSR_startUp,
- (FN_MEDIUM_ISINSERTED)&_FCSR_isInserted,
- (FN_MEDIUM_READSECTORS)&_FCSR_readSectors,
- (FN_MEDIUM_WRITESECTORS)&_FCSR_writeSectors,
- (FN_MEDIUM_CLEARSTATUS)&_FCSR_clearStatus,
- (FN_MEDIUM_SHUTDOWN)&_FCSR_shutdown
-} ;