diff options
-rw-r--r-- | arm9/asm/CARD_backup.s | 358 | ||||
-rw-r--r-- | arm9/lib/include/CARD_backup.h | 27 | ||||
-rw-r--r-- | arm9/lib/include/CARD_common.h | 37 | ||||
-rw-r--r-- | arm9/lib/src/CARD_backup.c | 160 | ||||
-rw-r--r-- | arm9/lib/src/CARD_common.c | 1 |
5 files changed, 205 insertions, 378 deletions
diff --git a/arm9/asm/CARD_backup.s b/arm9/asm/CARD_backup.s deleted file mode 100644 index 32e6bc2a..00000000 --- a/arm9/asm/CARD_backup.s +++ /dev/null @@ -1,358 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .extern cardi_common - .extern OSi_ThreadInfo - - .text - - arm_func_start CARD_CancelBackupAsync -CARD_CancelBackupAsync: ; 0x020D6D7C - stmdb sp!, {lr} - sub sp, sp, #0x4 - bl OS_DisableInterrupts - ldr r1, _020D6DA8 ; =cardi_common - ldr r2, [r1, #0x114] - orr r2, r2, #0x40 - str r2, [r1, #0x114] - bl OS_RestoreInterrupts - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020D6DA8: .word cardi_common - - arm_func_start CARD_TryWaitBackupAsync -CARD_TryWaitBackupAsync: ; 0x020D6DAC - ldr ip, _020D6DB4 ; =CARDi_TryWaitAsync - bx r12 - .balign 4 -_020D6DB4: .word CARDi_TryWaitAsync - - arm_func_start CARD_WaitBackupAsync -CARD_WaitBackupAsync: ; 0x020D6DB8 - ldr ip, _020D6DC0 ; =CARDi_WaitAsync - bx r12 - .balign 4 -_020D6DC0: .word CARDi_WaitAsync - - .extern _SDK_NintendoBackup - - arm_func_start CARD_IdentifyBackup -CARD_IdentifyBackup: ; 0x020D6DC4 - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x4 - mov r5, r0 - ldr r0, _020D6F00 ; =_SDK_NintendoBackup - ldr r7, _020D6F04 ; =cardi_common - bl OSi_ReferSymbol -_020D6DDC: ; 0x020D6DDC - cmp r5, #0x0 - bne _020D6DE8 - bl OS_Terminate -_020D6DE8: - bl CARD_CheckEnabled - bl OS_DisableInterrupts - ldr r1, [r7, #0x114] - mov r4, r0 - ands r0, r1, #0x4 - beq _020D6E18 - add r6, r7, #0x10c -_020D6E04: - mov r0, r6 - bl OS_SleepThread - ldr r0, [r7, #0x114] - ands r0, r0, #0x4 - bne _020D6E04 -_020D6E18: - ldr r0, [r7, #0x114] - mov r1, #0x0 - orr r0, r0, #0x4 - str r0, [r7, #0x114] - str r1, [r7, #0x38] - mov r0, r4 - str r1, [r7, #0x3c] - bl OS_RestoreInterrupts - mov r0, r5 - bl CARDi_IdentifyBackupCore - ldr r0, _020D6F08 ; =OSi_ThreadInfo - ldr r1, _020D6F04 ; =cardi_common - ldr r2, [r0, #0x4] - mov r0, r7 - str r2, [r1, #0x104] - mov r1, #0x2 - mov r2, #0x1 - bl CARDi_Request -_020D6E60: ; 0x020D6E60 - ldr r0, [r7, #0x0] - mov r1, #0x0 - str r1, [r0, #0xc] - ldr r0, [r7, #0x0] - add r1, r7, #0x120 - str r1, [r0, #0x10] - ldr r1, [r7, #0x0] - mov r2, #0x1 - mov r0, r7 - str r2, [r1, #0x14] - mov r1, #0x6 - bl CARDi_Request - ldr r6, [r7, #0x38] - ldr r5, [r7, #0x3c] - bl OS_DisableInterrupts - mov r4, r0 - ldr r1, [r7, #0x114] - add r0, r7, #0x10c - bic r1, r1, #0x4c - str r1, [r7, #0x114] - bl OS_WakeupThread - ldr r0, [r7, #0x114] - ands r0, r0, #0x10 - beq _020D6EC8 - add r0, r7, #0x44 - bl OS_WakeupThreadDirect -_020D6EC8: - mov r0, r4 - bl OS_RestoreInterrupts -_020D6ED0: ; 0x020D6ED0 - cmp r6, #0x0 - beq _020D6EE0 - mov r0, r5 - blx r6 -_020D6EE0: - ldr r0, [r7, #0x0] - ldr r0, [r0, #0x0] - cmp r0, #0x0 - moveq r0, #0x1 - movne r0, #0x0 - add sp, sp, #0x4 - ldmia sp!, {r4-r7,lr} - bx lr - .balign 4 -_020D6F00: .word _SDK_NintendoBackup -_020D6F04: .word cardi_common -_020D6F08: .word OSi_ThreadInfo - - arm_func_start CARD_GetBackupSectorSize -CARD_GetBackupSectorSize: ; 0x020D6F0C - ldr r0, _020D6F1C ; =cardi_common - ldr r0, [r0, #0x0] - ldr r0, [r0, #0x1c] - bx lr - .balign 4 -_020D6F1C: .word cardi_common - - arm_func_start CARDi_RequestStreamCommand -CARDi_RequestStreamCommand: ; 0x020D6F20 - stmdb sp!, {r4-r10,lr} - mov r10, r0 - ldr r6, _020D7004 ; =cardi_common - ldr r0, _020D7008 ; =_SDK_NintendoBackup - mov r9, r1 - mov r8, r2 - mov r7, r3 - bl OSi_ReferSymbol - bl OS_DisableInterrupts - ldr r1, [r6, #0x114] - mov r5, r0 - ands r0, r1, #0x4 - beq _020D6F6C - add r4, r6, #0x10c -_020D6F58: - mov r0, r4 - bl OS_SleepThread - ldr r0, [r6, #0x114] - ands r0, r0, #0x4 - bne _020D6F58 -_020D6F6C: - ldr r0, [r6, #0x114] - ldr r1, [sp, #0x20] - orr r0, r0, #0x4 - str r0, [r6, #0x114] - str r7, [r6, #0x38] - mov r0, r5 - str r1, [r6, #0x3c] - bl OS_RestoreInterrupts - str r10, [r6, #0x1c] - str r9, [r6, #0x20] - ldr r0, [sp, #0x24] - ldr r1, [sp, #0x28] - str r8, [r6, #0x24] - ldr r2, [sp, #0x2c] - str r1, [r6, #0x2c] - ldr r1, [sp, #0x30] - str r2, [r6, #0x30] - str r1, [r6, #0x34] - cmp r0, #0x0 - beq _020D6FD0 - ldr r0, _020D700C ; =CARDi_RequestStreamCommandCore - bl CARDi_SetTask - mov r0, #0x1 - ldmia sp!, {r4-r10,lr} - bx lr -_020D6FD0: - ldr r0, _020D7010 ; =OSi_ThreadInfo - ldr r1, _020D7004 ; =cardi_common - ldr r2, [r0, #0x4] - mov r0, r6 - str r2, [r1, #0x104] - bl CARDi_RequestStreamCommandCore -_020D6FE8: ; 0x020D6FE8 - ldr r0, [r6, #0x0] - ldr r0, [r0, #0x0] - cmp r0, #0x0 - moveq r0, #0x1 - movne r0, #0x0 - ldmia sp!, {r4-r10,lr} - bx lr - .balign 4 -_020D7004: .word cardi_common -_020D7008: .word _SDK_NintendoBackup -_020D700C: .word CARDi_RequestStreamCommandCore -_020D7010: .word OSi_ThreadInfo - - arm_func_start CARDi_RequestStreamCommandCore -CARDi_RequestStreamCommandCore: - stmdb sp!, {r4-r11,lr} - sub sp, sp, #0x4 - mov r9, r0 - ldr r8, [r9, #0x2c] - ldr r0, _020D720C ; =_SDK_NintendoBackup - ldr r7, [r9, #0x34] - ldr r10, [r9, #0x30] - mov r6, #0x100 - bl OSi_ReferSymbol - cmp r8, #0xb - bne _020D7048 - bl CARD_GetBackupSectorSize - mov r6, r0 -_020D7048: - mov r0, #0x1 - add r4, r9, #0x120 - mov r11, #0x9 - str r0, [sp, #0x0] -_020D7058: - ldr r5, [r9, #0x24] - ldr r0, [r9, #0x0] - cmp r6, r5 - movcc r5, r6 - str r5, [r0, #0x14] - ldr r0, [r9, #0x114] - ands r0, r0, #0x40 - beq _020D7094 - ldr r0, [r9, #0x114] - mov r1, #0x7 - bic r0, r0, #0x40 - str r0, [r9, #0x114] - ldr r0, [r9, #0x0] - str r1, [r0, #0x0] - b _020D71A8 -_020D7094: - cmp r7, #0x3 - addls pc, pc, r7, lsl #0x2 - b _020D7124 - ; jump table - b _020D70B0 ; case 0 - b _020D70D4 ; case 1 - b _020D70D4 ; case 2 - b _020D710C ; case 3 -_020D70B0: - mov r1, r5 - add r0, r9, #0x120 - bl DC_InvalidateRange - ldr r1, [r9, #0x1c] - ldr r0, [r9, #0x0] - str r1, [r0, #0xc] - ldr r0, [r9, #0x0] - str r4, [r0, #0x10] - b _020D7124 -_020D70D4: - ldr r0, [r9, #0x1c] - mov r1, r4 - mov r2, r5 - bl MI_CpuCopy8 - mov r1, r5 - add r0, r9, #0x120 - bl DC_FlushRange - bl DC_WaitWriteBufferEmpty -_020D70F4: ; 0x020D70F4 - ldr r0, [r9, #0x0] - str r4, [r0, #0xc] - ldr r1, [r9, #0x20] - ldr r0, [r9, #0x0] - str r1, [r0, #0x10] - b _020D7124 -_020D710C: - ldr r1, [r9, #0x1c] - ldr r0, [r9, #0x0] - str r1, [r0, #0xc] - ldr r1, [r9, #0x20] - ldr r0, [r9, #0x0] - str r1, [r0, #0x10] -_020D7124: - mov r0, r9 - mov r1, r8 - mov r2, r10 - bl CARDi_Request -_020D7134: ; 0x020D7134 - cmp r0, #0x0 - beq _020D71A8 - cmp r7, #0x2 - bne _020D7160 - ldr r2, [sp, #0x0] - mov r0, r9 - mov r1, r11 - bl CARDi_Request -_020D7154: ; 0x020D7154 - cmp r0, #0x0 - bne _020D7178 - b _020D71A8 -_020D7160: - cmp r7, #0x0 - bne _020D7178 - ldr r1, [r9, #0x20] - mov r2, r5 - add r0, r9, #0x120 - bl MI_CpuCopy8 -_020D7178: - ldr r0, [r9, #0x1c] - add r0, r0, r5 - str r0, [r9, #0x1c] - ldr r0, [r9, #0x20] - add r0, r0, r5 - str r0, [r9, #0x20] - ldr r0, [r9, #0x24] - sub r0, r0, r5 - str r0, [r9, #0x24] - ldr r0, [r9, #0x24] - cmp r0, #0x0 - bne _020D7058 -_020D71A8: - ldr r6, [r9, #0x38] - ldr r5, [r9, #0x3c] - bl OS_DisableInterrupts - ldr r1, [r9, #0x114] - mov r4, r0 - bic r0, r1, #0x4c - str r0, [r9, #0x114] - add r0, r9, #0x10c - bl OS_WakeupThread - ldr r0, [r9, #0x114] - ands r0, r0, #0x10 - beq _020D71E0 - add r0, r9, #0x44 - bl OS_WakeupThreadDirect -_020D71E0: - mov r0, r4 - bl OS_RestoreInterrupts -_020D71E8: ; 0x020D71E8 - cmp r6, #0x0 - addeq sp, sp, #0x4 - ldmeqia sp!, {r4-r11,lr} - bxeq lr - mov r0, r5 - blx r6 - add sp, sp, #0x4 - ldmia sp!, {r4-r11,lr} - bx lr - .balign 4 -_020D720C: .word _SDK_NintendoBackup diff --git a/arm9/lib/include/CARD_backup.h b/arm9/lib/include/CARD_backup.h index 7cb5f820..465d6d2e 100644 --- a/arm9/lib/include/CARD_backup.h +++ b/arm9/lib/include/CARD_backup.h @@ -1,28 +1,17 @@ -#ifndef NITRO_CARD_BACKUP_H_ -#define NITRO_CARD_BACKUP_H_ +#ifndef POKEDIAMOND_CARD_BACKUP_H +#define POKEDIAMOND_CARD_BACKUP_H #include "nitro/types.h" #include "MI_dma.h" #include "CARD_common.h" -BOOL CARD_TryWaitBackupAsync(void); +BOOL CARDi_RequestStreamCommand(u32 src, u32 dst, u32 len, MIDmaCallback callback, void *arg, BOOL is_async, + CARDRequest req_type, int req_retry, CARDRequestMode req_mode); +u32 CARD_GetBackupSectorSize(void);; +BOOL CARD_IdentifyBackup(CARDBackupType type); BOOL CARD_WaitBackupAsync(void); +BOOL CARD_TryWaitBackupAsync(void); void CARD_CancelBackupAsync(void); -void CARD_UnlockBackup(u16 lock_id); -void CARD_LockBackup(u16 lock_id); -BOOL CARD_IdentifyBackup(u16 lock_id); - -BOOL CARDi_RequestStreamCommand( - u32 src, - u32 dst, - u32 len, - MIDmaCallback callback, - void * arg, - BOOL is_async, - CARDRequest req_type, - int req_retry, - CARDRequestMode req_mode -); static inline BOOL CARDi_ReadBackup(u32 src, void * dst, u32 len, MIDmaCallback callback, void * arg, BOOL is_async) { @@ -39,4 +28,4 @@ static inline BOOL CARDi_WriteAndVerifyBackup(u32 dst, void * src, u32 len, MIDm return CARDi_RequestStreamCommand((u32)src, (u32)dst, len, callback, arg, is_async, CARD_REQ_WRITE_BACKUP, CARD_RETRY_COUNT_MAX, CARD_REQUEST_MODE_SEND_VERIFY); } -#endif //NITRO_CARD_BACKUP_H_ +#endif //POKEDIAMOND_CARD_BACKUP_H diff --git a/arm9/lib/include/CARD_common.h b/arm9/lib/include/CARD_common.h index 051923ce..292b9066 100644 --- a/arm9/lib/include/CARD_common.h +++ b/arm9/lib/include/CARD_common.h @@ -3,6 +3,7 @@ #include "nitro/types.h" #include "OS_thread.h" +#include "OS_system.h" #include "MI_dma.h" #define CARD_THREAD_PRIORITY_DEFAULT 4 @@ -152,6 +153,42 @@ typedef struct CARDiCommon u8 backup_cache_page_buf[256] ALIGN(32); } CARDiCommon; +static inline void CARDi_EndTask(CARDiCommon *p, BOOL is_own_task) +{ + const MIDmaCallback func = p->callback; + void *const arg = p->callback_arg; + + { + OSIntrMode bak_psr = OS_DisableInterrupts(); + + p->flag &= ~(CARD_STAT_BUSY | CARD_STAT_TASK | CARD_STAT_CANCEL); + OS_WakeupThread(p->busy_q); + if ((p->flag & CARD_STAT_RECV) != 0) + { + OS_WakeupThreadDirect(p->thread); + } + (void)OS_RestoreInterrupts(bak_psr); + } + + if (is_own_task && func) + { + (*func)(arg); + } +} + +static inline void CARDi_WaitTask(CARDiCommon *p, MIDmaCallback callback, void *callback_arg) +{ + OSIntrMode bak_psr = OS_DisableInterrupts(); + while ((p->flag & CARD_STAT_BUSY) != 0) + { + OS_SleepThread(p->busy_q); + } + p->flag |= CARD_STAT_BUSY; + p->callback = callback; + p->callback_arg = callback_arg; + (void)OS_RestoreInterrupts(bak_psr); +} + void CARDi_SetTask(void (*task) (CARDiCommon *)); void CARDi_InitCommon(void); BOOL CARD_IsEnabled(void); diff --git a/arm9/lib/src/CARD_backup.c b/arm9/lib/src/CARD_backup.c new file mode 100644 index 00000000..fa39fa0f --- /dev/null +++ b/arm9/lib/src/CARD_backup.c @@ -0,0 +1,160 @@ +#include "CARD_backup.h" +#include "function_target.h" +#include "CARD_common.h" +#include "OS_cache.h" +#include "MI_memory.h" +#include "OS_terminate_proc.h" +#include "OS_system.h" + +extern void OSi_ReferSymbol(void *symbol); +extern char _SDK_NintendoBackup[]; + +extern BOOL CARDi_Request(CARDiCommon * p, int req_type, int retry_count); +extern void CARDi_IdentifyBackupCore(CARDBackupType type); + +extern CARDiCommon cardi_common; + +static void CARDi_RequestStreamCommandCore(CARDiCommon *p); + +ARM_FUNC static void CARDi_RequestStreamCommandCore(CARDiCommon *p) +{ + const int req_type = p->req_type; + const int req_mode = p->req_mode; + const int retry_count = p->req_retry; + u32 size = sizeof(p->backup_cache_page_buf); + + OSi_ReferSymbol((void *)_SDK_NintendoBackup); + + if (req_type == CARD_REQ_ERASE_SECTOR_BACKUP) + { + size = CARD_GetBackupSectorSize(); + } + do + { + const u32 len = (size < p->len) ? size : p->len; + p->cmd->len = len; + + if ((p->flag & CARD_STAT_CANCEL) != 0) + { + p->flag &= ~CARD_STAT_CANCEL; + p->cmd->result = CARD_RESULT_CANCELED; + break; + } + switch (req_mode) + { + case CARD_REQUEST_MODE_RECV: + DC_InvalidateRange(p->backup_cache_page_buf, len); + p->cmd->src = (u32)p->src; + p->cmd->dest = (u32)p->backup_cache_page_buf; + break; + case CARD_REQUEST_MODE_SEND: + case CARD_REQUEST_MODE_SEND_VERIFY: + MI_CpuCopy8((const void *)p->src, p->backup_cache_page_buf, len); + DC_FlushRange(p->backup_cache_page_buf, len); + DC_WaitWriteBufferEmpty(); + p->cmd->src = (u32)p->backup_cache_page_buf; + p->cmd->dest = (u32)p->dst; + break; + case CARD_REQUEST_MODE_SPECIAL: + p->cmd->src = (u32)p->src; + p->cmd->dest = (u32)p->dst; + break; + } + + if (!CARDi_Request(p, req_type, retry_count)) + { + break; + } + + if (req_mode == CARD_REQUEST_MODE_SEND_VERIFY) + { + if (!CARDi_Request(p, CARD_REQ_VERIFY_BACKUP, 1)) + { + break; + } + } + else if (req_mode == CARD_REQUEST_MODE_RECV) + { + MI_CpuCopy8(p->backup_cache_page_buf, (void *)p->dst, len); + } + p->src += len; + p->dst += len; + p->len -= len; + } + while (p->len > 0); + CARDi_EndTask(p, TRUE); +} + +ARM_FUNC BOOL CARDi_RequestStreamCommand(u32 src, u32 dst, u32 len, MIDmaCallback callback, void *arg, BOOL is_async, + CARDRequest req_type, int req_retry, CARDRequestMode req_mode) +{ + CARDiCommon *const p = &cardi_common; + + OSi_ReferSymbol((void *)_SDK_NintendoBackup); + + CARDi_WaitTask(p, callback, arg); + p->src = src; + p->dst = dst; + p->len = len; + p->req_type = req_type; + p->req_retry = req_retry; + p->req_mode = req_mode; + if (is_async) + { + CARDi_SetTask(CARDi_RequestStreamCommandCore); + return TRUE; + } + else + { + cardi_common.cur_th = OS_GetCurrentThread(); + CARDi_RequestStreamCommandCore(p); + return (p->cmd->result == CARD_RESULT_SUCCESS); + } +} + +ARM_FUNC u32 CARD_GetBackupSectorSize(void) +{ + return cardi_common.cmd->spec.sect_size; +} + +ARM_FUNC BOOL CARD_IdentifyBackup(CARDBackupType type) +{ + CARDiCommon *const p = &cardi_common; + + OSi_ReferSymbol((void *)_SDK_NintendoBackup); + if (type == CARD_BACKUP_TYPE_NOT_USE) + { + OS_Terminate(); + } + + CARD_CheckEnabled(); + + CARDi_WaitTask(p, NULL, NULL); + CARDi_IdentifyBackupCore(type); + cardi_common.cur_th = OS_GetCurrentThread(); + (void)CARDi_Request(p, CARD_REQ_IDENTIFY, 1); + + p->cmd->src = 0; + p->cmd->dest = (u32)p->backup_cache_page_buf; + p->cmd->len = 1; + (void)CARDi_Request(p, CARD_REQ_READ_BACKUP, 1); + CARDi_EndTask(p, TRUE); + return (p->cmd->result == CARD_RESULT_SUCCESS); +} + +ARM_FUNC BOOL CARD_WaitBackupAsync(void) +{ + return CARDi_WaitAsync(); +} + +ARM_FUNC BOOL CARD_TryWaitBackupAsync(void) +{ + return CARDi_TryWaitAsync(); +} + +ARM_FUNC void CARD_CancelBackupAsync(void) +{ + OSIntrMode bak_cpsr = OS_DisableInterrupts(); + cardi_common.flag |= CARD_STAT_CANCEL; + (void)OS_RestoreInterrupts(bak_cpsr); +} diff --git a/arm9/lib/src/CARD_common.c b/arm9/lib/src/CARD_common.c index f02d10e2..c6bae9a1 100644 --- a/arm9/lib/src/CARD_common.c +++ b/arm9/lib/src/CARD_common.c @@ -2,7 +2,6 @@ #include "consts.h" #include "function_target.h" #include "MI_memory.h" -#include "OS_system.h" #include "OS_terminate_proc.h" #include "OS_spinLock.h" #include "OS_cache.h" |