aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/ds/arm9/source/fat/io_sccf.c
diff options
context:
space:
mode:
Diffstat (limited to 'backends/platform/ds/arm9/source/fat/io_sccf.c')
-rw-r--r--backends/platform/ds/arm9/source/fat/io_sccf.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/backends/platform/ds/arm9/source/fat/io_sccf.c b/backends/platform/ds/arm9/source/fat/io_sccf.c
new file mode 100644
index 0000000000..336387e9d7
--- /dev/null
+++ b/backends/platform/ds/arm9/source/fat/io_sccf.c
@@ -0,0 +1,174 @@
+/*
+ io_sccf.c based on
+
+ compact_flash.c
+ By chishm (Michael Chisholm)
+
+ Hardware Routines for reading a compact flash card
+ using the Super Card CF
+
+ CF routines modified with help from Darkfader
+
+ This software is completely free. No warranty is provided.
+ If you use it, please give me credit and email me about your
+ project at chishm@hotmail.com
+
+ See gba_nds_fat.txt for help and license details.
+*/
+
+
+#include "io_sccf.h"
+
+#ifdef SUPPORT_SCCF
+
+#ifndef SUPPORT_MPCF
+ #error Supercard CF support requires GBAMP CF support
+#endif // SUPPORT_MPCF
+
+/*-----------------------------------------------------------------
+Since all CF addresses and commands are the same for the GBAMP,
+simply use it's functions instead.
+-----------------------------------------------------------------*/
+
+extern bool MPCF_IsInserted (void);
+extern bool MPCF_ClearStatus (void);
+extern bool MPCF_ReadSectors (u32 sector, u8 numSecs, void* buffer);
+extern bool MPCF_WriteSectors (u32 sector, u8 numSecs, void* buffer);
+
+
+/*-----------------------------------------------------------------
+SCCF_Unlock
+Returns true if SuperCard was unlocked, false if failed
+Added by MightyMax
+Modified by Chishm
+-----------------------------------------------------------------*/
+bool SCCF_Unlock(void)
+{
+#define CF_REG_LBA1 *(volatile unsigned short *)0x09060000
+ unsigned char temp;
+ volatile short *unlockAddress = (volatile short *)0x09FFFFFE;
+ *unlockAddress = 0xA55A ;
+ *unlockAddress = 0xA55A ;
+ *unlockAddress = 0x3 ;
+ *unlockAddress = 0x3 ;
+ // provoke a ready reply
+ temp = CF_REG_LBA1;
+ CF_REG_LBA1 = (~temp & 0xFF);
+ temp = (~temp & 0xFF);
+ return (CF_REG_LBA1 == temp);
+#undef CF_REG_LBA1
+}
+
+bool SCCF_Shutdown(void) {
+ return MPCF_ClearStatus() ;
+} ;
+
+bool SCCF_StartUp(void) {
+ return SCCF_Unlock() ;
+} ;
+
+
+IO_INTERFACE io_sccf = {
+ DEVICE_TYPE_SCCF,
+ FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE | FEATURE_SLOT_GBA,
+ (FN_MEDIUM_STARTUP)&SCCF_StartUp,
+ (FN_MEDIUM_ISINSERTED)&MPCF_IsInserted,
+ (FN_MEDIUM_READSECTORS)&MPCF_ReadSectors,
+ (FN_MEDIUM_WRITESECTORS)&MPCF_WriteSectors,
+ (FN_MEDIUM_CLEARSTATUS)&MPCF_ClearStatus,
+ (FN_MEDIUM_SHUTDOWN)&SCCF_Shutdown
+} ;
+
+
+LPIO_INTERFACE SCCF_GetInterface(void) {
+ return &io_sccf ;
+} ;
+
+#endif // SUPPORT_SCCF
+/*
+ io_sccf.c based on
+
+ compact_flash.c
+ By chishm (Michael Chisholm)
+
+ Hardware Routines for reading a compact flash card
+ using the Super Card CF
+
+ CF routines modified with help from Darkfader
+
+ This software is completely free. No warranty is provided.
+ If you use it, please give me credit and email me about your
+ project at chishm@hotmail.com
+
+ See gba_nds_fat.txt for help and license details.
+*/
+
+
+#include "io_sccf.h"
+
+#ifdef SUPPORT_SCCF
+
+#ifndef SUPPORT_MPCF
+ #error Supercard CF support requires GBAMP CF support
+#endif // SUPPORT_MPCF
+
+/*-----------------------------------------------------------------
+Since all CF addresses and commands are the same for the GBAMP,
+simply use it's functions instead.
+-----------------------------------------------------------------*/
+
+extern bool MPCF_IsInserted (void);
+extern bool MPCF_ClearStatus (void);
+extern bool MPCF_ReadSectors (u32 sector, u8 numSecs, void* buffer);
+extern bool MPCF_WriteSectors (u32 sector, u8 numSecs, void* buffer);
+
+
+/*-----------------------------------------------------------------
+SCCF_Unlock
+Returns true if SuperCard was unlocked, false if failed
+Added by MightyMax
+Modified by Chishm
+-----------------------------------------------------------------*/
+bool SCCF_Unlock(void)
+{
+#define CF_REG_LBA1 *(volatile unsigned short *)0x09060000
+ unsigned char temp;
+ volatile short *unlockAddress = (volatile short *)0x09FFFFFE;
+ *unlockAddress = 0xA55A ;
+ *unlockAddress = 0xA55A ;
+ *unlockAddress = 0x3 ;
+ *unlockAddress = 0x3 ;
+ // provoke a ready reply
+ temp = CF_REG_LBA1;
+ CF_REG_LBA1 = (~temp & 0xFF);
+ temp = (~temp & 0xFF);
+ return (CF_REG_LBA1 == temp);
+#undef CF_REG_LBA1
+}
+
+bool SCCF_Shutdown(void) {
+ return MPCF_ClearStatus() ;
+} ;
+
+bool SCCF_StartUp(void) {
+ return SCCF_Unlock() ;
+} ;
+
+
+IO_INTERFACE io_sccf = {
+ DEVICE_TYPE_SCCF,
+ FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE | FEATURE_SLOT_GBA,
+ (FN_MEDIUM_STARTUP)&SCCF_StartUp,
+ (FN_MEDIUM_ISINSERTED)&MPCF_IsInserted,
+ (FN_MEDIUM_READSECTORS)&MPCF_ReadSectors,
+ (FN_MEDIUM_WRITESECTORS)&MPCF_WriteSectors,
+ (FN_MEDIUM_CLEARSTATUS)&MPCF_ClearStatus,
+ (FN_MEDIUM_SHUTDOWN)&SCCF_Shutdown
+} ;
+
+
+LPIO_INTERFACE SCCF_GetInterface(void) {
+ return &io_sccf ;
+} ;
+
+#endif // SUPPORT_SCCF