diff options
Diffstat (limited to 'arm9/lib/include')
-rw-r--r-- | arm9/lib/include/CARD_common.h | 6 | ||||
-rw-r--r-- | arm9/lib/include/CARD_rom.h | 71 | ||||
-rw-r--r-- | arm9/lib/include/FSi_util.h | 2 | ||||
-rw-r--r-- | arm9/lib/include/MI_dma.h | 2 | ||||
-rw-r--r-- | arm9/lib/include/OS_interrupt.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/registers.h | 1 |
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 |