summaryrefslogtreecommitdiff
path: root/arm9/lib/include
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib/include')
-rw-r--r--arm9/lib/include/CARD_common.h6
-rw-r--r--arm9/lib/include/CARD_rom.h71
-rw-r--r--arm9/lib/include/FSi_util.h2
-rw-r--r--arm9/lib/include/MI_dma.h2
-rw-r--r--arm9/lib/include/OS_interrupt.h1
-rw-r--r--arm9/lib/include/registers.h1
6 files changed, 76 insertions, 7 deletions
diff --git a/arm9/lib/include/CARD_common.h b/arm9/lib/include/CARD_common.h
index 7730ffa4..a784ccde 100644
--- a/arm9/lib/include/CARD_common.h
+++ b/arm9/lib/include/CARD_common.h
@@ -24,6 +24,10 @@
((size) << CARD_BACKUP_TYPE_SIZEBIT_SHIFT) | \
((vender) << CARD_BACKUP_TYPE_VENDER_SHIFT))
+#define ALIGN_MASK(a) ((a) - 1)
+#define CARD_ALIGN_HI_BIT(n) (((u32)(n)) & ~ALIGN_MASK(CARD_ROM_PAGE_SIZE))
+#define CARD_ALIGN_LO_BIT(n) (((u32)(n)) & ALIGN_MASK(CARD_ROM_PAGE_SIZE))
+
typedef enum
{
CARD_BACKUP_TYPE_EEPROM_4KBITS = CARD_BACKUP_TYPE_DEFINE(EEPROM, 9, 0),
@@ -209,8 +213,6 @@ void CARD_UnlockBackup(u16 lock_id);
#define CARD_RETRY_COUNT_MAX 10
-void CARD_Init(void);
-
extern BOOL PXI_SendWordByFifo(u32 param1, u32 data, u32 param2);
static inline void CARDi_SendPxi(u32 data)
diff --git a/arm9/lib/include/CARD_rom.h b/arm9/lib/include/CARD_rom.h
index b96c527b..e72d653f 100644
--- a/arm9/lib/include/CARD_rom.h
+++ b/arm9/lib/include/CARD_rom.h
@@ -1,9 +1,31 @@
-#ifndef NITRO_CARD_ROM_H_
-#define NITRO_CARD_ROM_H_
+#ifndef POKEDIAMOND_CARD_ROM_H
+#define POKEDIAMOND_CARD_ROM_H
#include "nitro/types.h"
#include "MI_exMemory.h"
#include "MI_dma.h"
+#include "CARD_common.h"
+#include "OS_tcm.h"
+
+#define CARD_ROM_PAGE_SIZE 512
+
+#define CARDMST_SEL_ROM 0x00
+#define CARDMST_IF_ENABLE 0x40
+#define CARDMST_ENABLE 0x80
+
+#define CARD_DATA_READY 0x00800000
+#define CARD_COMMAND_PAGE 0x01000000
+#define CARD_COMMAND_ID 0x07000000
+#define CARD_COMMAND_MASK 0x07000000
+#define CARD_RESET_HI 0x20000000
+#define CARD_READ_MODE 0x00000000
+#define CARD_START 0x80000000
+#define CARD_LATENCY1_MASK 0x00001FFF
+
+#define MROMOP_G_READ_PAGE 0xB7000000
+#define MROMOP_G_READ_ID 0xB8000000
+
+extern CARDiCommon cardi_common;
typedef struct
{
@@ -12,6 +34,15 @@ typedef struct
}
CARDRomRegion;
+typedef struct CARDRomStat
+{
+ void (*read_func) (struct CARDRomStat *);
+ u32 ctrl;
+ u8 *cache_page;
+ u32 dummy[5];
+ u8 cache_buf[CARD_ROM_PAGE_SIZE];
+} CARDRomStat;
+
static inline const CARDRomRegion * CARD_GetRomRegionOVT(MIProcessor target)
{
return (target == MI_PROCESSOR_ARM9)
@@ -19,7 +50,14 @@ static inline const CARDRomRegion * CARD_GetRomRegionOVT(MIProcessor target)
: (const CARDRomRegion *)((const u8 *)HW_ROM_HEADER_BUF + 0x58);
}
-void CARDi_ReadRom(u32 dma, const void * src, void * dst, u32 len, MIDmaCallback done_cb, void * arg, BOOL is_async);
+BOOL CARDi_TryReadCardDma(CARDRomStat *p);
+void CARDi_ReadCard(CARDRomStat *p);
+u32 CARDi_ReadRomIDCore(void);
+void CARDi_CheckPulledOutCore(u32 id);
+void CARDi_ReadRom(u32 dma, const void *src, void *dst, u32 len, MIDmaCallback callback, void *arg, BOOL is_async);
+void CARD_Init(void);
+void CARD_WaitRomAsync(void);
+void (*CARDi_GetRomAccessor(void)) (CARDRomStat *);
static inline void CARD_ReadRomAsync(u32 dma, const void * src, void * dst, u32 len, MIDmaCallback callback, void * arg)
{
@@ -34,4 +72,29 @@ static inline const CARDRomRegion * CARD_GetRomRegionFAT() {
return (const CARDRomRegion *)((const u8 *)HW_ROM_HEADER_BUF + 0x48);
}
-#endif //NITRO_CARD_ROM_H_
+static inline void CARDi_ReadEnd(void)
+{
+ CARDiCommon *const p = &cardi_common;
+ CARDi_CheckPulledOutCore(CARDi_ReadRomIDCore());
+ p->cmd->result = CARD_RESULT_SUCCESS;
+ CARDi_EndTask(p, TRUE);
+}
+
+static inline BOOL CARDi_IsInTcm(u32 buf, u32 len)
+{
+ const u32 i = (u32)HW_ITCM;
+ const u32 d = OS_GetDTCMAddress();
+ return ((i < buf + len) && (i + HW_ITCM_SIZE > buf)) ||
+ ((d < buf + len) && (d + HW_DTCM_SIZE > buf));
+}
+
+extern u32 cardi_rom_header_addr;
+
+static inline u32 CARDi_GetRomFlag(u32 flag)
+{
+ const u32 rom_ctrl = *(vu32 *)(cardi_rom_header_addr + 0x60);
+ return (u32)((rom_ctrl & ~CARD_COMMAND_MASK) | flag |
+ CARD_READ_MODE | CARD_START | CARD_RESET_HI);
+}
+
+#endif //POKEDIAMOND_CARD_ROM_H
diff --git a/arm9/lib/include/FSi_util.h b/arm9/lib/include/FSi_util.h
index 6e96681e..2357b446 100644
--- a/arm9/lib/include/FSi_util.h
+++ b/arm9/lib/include/FSi_util.h
@@ -1,7 +1,7 @@
#ifndef NITRO_FSI_UTIL_H_
#define NITRO_FSI_UTIL_H_
-#define ALIGN_MASK(a) ((u32)((a) - 1))
+#include "CARD_common.h"
#define ALIGN_BYTE(n, a) (((u32)(n) + ALIGN_MASK(a)) & ~ALIGN_MASK(a))
diff --git a/arm9/lib/include/MI_dma.h b/arm9/lib/include/MI_dma.h
index aafc798b..8ce3f417 100644
--- a/arm9/lib/include/MI_dma.h
+++ b/arm9/lib/include/MI_dma.h
@@ -7,6 +7,8 @@
typedef void (*MIDmaCallback)(void *);
+#define MI_DMA_MAX_NUM 3
+
#define REG_ADDR_DMA0CNT 0x40000b8
#define REG_ADDR_DMA0_CLR_DATA 0x40000e0
diff --git a/arm9/lib/include/OS_interrupt.h b/arm9/lib/include/OS_interrupt.h
index 08417872..3d139079 100644
--- a/arm9/lib/include/OS_interrupt.h
+++ b/arm9/lib/include/OS_interrupt.h
@@ -12,6 +12,7 @@
#define OS_IE_V_COUNT (1UL << REG_OS_IE_VE_SHIFT)
#define OS_IE_TIMER0 (1UL << REG_OS_IE_T0_SHIFT)
#define OS_IE_TIMER1 (1UL << REG_OS_IE_T1_SHIFT)
+#define OS_IE_CARD_DATA (1UL << REG_OS_IE_MC_SHIFT)
extern OSIrqFunction OS_IRQTable[];
extern OSIrqCallbackInfo OSi_IrqCallbackInfo[8];
diff --git a/arm9/lib/include/registers.h b/arm9/lib/include/registers.h
index dc1b4fdb..44a21bf0 100644
--- a/arm9/lib/include/registers.h
+++ b/arm9/lib/include/registers.h
@@ -350,6 +350,7 @@
#define REG_OS_IE_VE_SHIFT 2
#define REG_OS_IE_T0_SHIFT 3
#define REG_OS_IE_T1_SHIFT 4
+#define REG_OS_IE_MC_SHIFT 19
#define REG_OS_TM0CNT_H_I_MASK 0x0040
#define REG_OS_TM0CNT_H_E_MASK 0x0080