diff options
author | Revo <projectrevotpp@hotmail.com> | 2021-03-09 10:54:26 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-09 10:54:26 -0500 |
commit | d032e35566418f0706c892d7227fe7e5dc8f7f58 (patch) | |
tree | 32f4514efda3ef5dc46ce2e3137e2815c9e61627 | |
parent | acbce1c8be2370e6617cdc74eb658f3f5cf8e1ed (diff) | |
parent | bf279cbcd3d541426fd9c82dafeafaf5f479d285 (diff) |
Merge pull request #326 from red031000/master
finish CTRDG_flash_AT29LV512
-rw-r--r-- | arm9/arm9.lsf | 2 | ||||
-rw-r--r-- | arm9/asm/CTRDG_flash_AT29LV512_asm.s | 358 | ||||
-rw-r--r-- | arm9/asm/CTRDG_flash_LE39FW512.s | 6 | ||||
-rw-r--r-- | arm9/asm/CTRDG_flash_MX29L010.s | 6 | ||||
-rw-r--r-- | arm9/asm/CTRDG_flash_MX29L512.s | 6 | ||||
-rw-r--r-- | arm9/asm/CTRDG_flash_common.s | 4 | ||||
-rw-r--r-- | arm9/asm/SOC_socl_const.s | 2 | ||||
-rw-r--r-- | arm9/lib/include/CTRDG_backup.h | 5 | ||||
-rw-r--r-- | arm9/lib/include/CTRDG_flash_AT29LV512.h | 13 | ||||
-rw-r--r-- | arm9/lib/src/CTRDG_flash_AT29LV512.c | 208 |
10 files changed, 225 insertions, 385 deletions
diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf index 6bbff67c..138a74e6 100644 --- a/arm9/arm9.lsf +++ b/arm9/arm9.lsf @@ -335,7 +335,6 @@ Static arm9 Object SOC_socl_close.o Object SOC_socl_cleanup.o Object SOC_socl_poll.o - Object SOC_socl_const.o Object SOC_socl_misc.o Object SOC_socl_list.o Object SOC_soc.o @@ -456,7 +455,6 @@ Static arm9 Object CTRDG_proc.o Object CTRDG_backup.o Object CTRDG_flash_common.o - Object CTRDG_flash_AT29LV512_asm.o Object CTRDG_flash_AT29LV512.o Object CTRDG_flash_LE26FV10N1TS-10.o Object CTRDG_flash_LE39FW512.o diff --git a/arm9/asm/CTRDG_flash_AT29LV512_asm.s b/arm9/asm/CTRDG_flash_AT29LV512_asm.s deleted file mode 100644 index 7cfa90af..00000000 --- a/arm9/asm/CTRDG_flash_AT29LV512_asm.s +++ /dev/null @@ -1,358 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .extern CTRDGi_PollingSR512kCOMMON - .extern AgbFlash - .extern CTRDGi_PollingSR - .extern ctrdgi_flash_lock_id - .extern UNK_021D6B08 - .extern CTRDGi_EraseFlashChipCoreAT - .extern CTRDGi_EraseFlashSectorCoreAT - .extern AT29LV512_org - .extern AT29LV512_lib - - .text - - arm_func_start CTRDGi_WriteFlashSectorAsyncAT -CTRDGi_WriteFlashSectorAsyncAT: ; 0x020DC5DC - stmdb sp!, {lr} - sub sp, sp, #0x24 - str r1, [sp, #0xc] - strh r0, [sp, #0x20] - ldr r1, _020DC604 ; =CTRDGi_WriteFlashSectorCoreAT - add r0, sp, #0x0 - bl CTRDGi_SetTask - add sp, sp, #0x24 - ldmia sp!, {lr} - bx lr - .balign 4 -_020DC604: .word CTRDGi_WriteFlashSectorCoreAT - - arm_func_start CTRDGi_EraseFlashSectorAsyncAT -CTRDGi_EraseFlashSectorAsyncAT: ; 0x020DC608 - stmdb sp!, {lr} - sub sp, sp, #0x24 - mov r2, r1 - strh r0, [sp, #0x20] - ldr r1, _020DC630 ; =CTRDGi_EraseFlashSectorCoreAT - add r0, sp, #0x0 - bl CTRDGi_SetTask - add sp, sp, #0x24 - ldmia sp!, {lr} - bx lr - .balign 4 -_020DC630: .word CTRDGi_EraseFlashSectorCoreAT - - arm_func_start CTRDGi_WriteFlashSectorAT -CTRDGi_WriteFlashSectorAT: ; 0x020DC634 - stmdb sp!, {lr} - sub sp, sp, #0x24 - strh r0, [sp, #0x20] - add r0, sp, #0x0 - str r1, [sp, #0xc] - bl CTRDGi_WriteFlashSectorCoreAT - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - add sp, sp, #0x24 - ldmia sp!, {lr} - bx lr - - arm_func_start CTRDGi_EraseFlashSectorAT -CTRDGi_EraseFlashSectorAT: ; 0x020DC660 - stmdb sp!, {lr} - sub sp, sp, #0x24 - strh r0, [sp, #0x20] - add r0, sp, #0x0 - bl CTRDGi_EraseFlashSectorCoreAT - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - add sp, sp, #0x24 - ldmia sp!, {lr} - bx lr - - arm_func_start CTRDGi_WriteFlash4KBAsyncAT -CTRDGi_WriteFlash4KBAsyncAT: ; 0x020DC688 - stmdb sp!, {lr} - sub sp, sp, #0x24 - str r1, [sp, #0xc] - strh r0, [sp, #0x20] - ldr r1, _020DC6B0 ; =CTRDGi_WriteFlash4KBCoreAT - add r0, sp, #0x0 - bl CTRDGi_SetTask - add sp, sp, #0x24 - ldmia sp!, {lr} - bx lr - .balign 4 -_020DC6B0: .word CTRDGi_WriteFlash4KBCoreAT - - arm_func_start CTRDGi_EraseFlash4KBAsyncAT -CTRDGi_EraseFlash4KBAsyncAT: ; 0x020DC6B4 - stmdb sp!, {lr} - sub sp, sp, #0x24 - mov r2, r1 - strh r0, [sp, #0x20] - ldr r1, _020DC6DC ; =CTRDGi_EraseFlash4KBCoreAT - add r0, sp, #0x0 - bl CTRDGi_SetTask - add sp, sp, #0x24 - ldmia sp!, {lr} - bx lr - .balign 4 -_020DC6DC: .word CTRDGi_EraseFlash4KBCoreAT - - arm_func_start CTRDGi_EraseFlashChipAsyncAT -CTRDGi_EraseFlashChipAsyncAT: ; 0x020DC6E0 - stmdb sp!, {lr} - sub sp, sp, #0x24 - ldr r1, _020DC704 ; =CTRDGi_EraseFlashChipCoreAT - mov r2, r0 - add r0, sp, #0x0 - bl CTRDGi_SetTask - add sp, sp, #0x24 - ldmia sp!, {lr} - bx lr - .balign 4 -_020DC704: .word CTRDGi_EraseFlashChipCoreAT - - arm_func_start CTRDGi_WriteFlash4KBAT -CTRDGi_WriteFlash4KBAT: ; 0x020DC708 - stmdb sp!, {lr} - sub sp, sp, #0x24 - strh r0, [sp, #0x20] - add r0, sp, #0x0 - str r1, [sp, #0xc] - bl CTRDGi_WriteFlash4KBCoreAT - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - add sp, sp, #0x24 - ldmia sp!, {lr} - bx lr - - arm_func_start CTRDGi_EraseFlash4KBAT -CTRDGi_EraseFlash4KBAT: ; 0x020DC734 - stmdb sp!, {lr} - sub sp, sp, #0x24 - strh r0, [sp, #0x20] - add r0, sp, #0x0 - bl CTRDGi_EraseFlash4KBCoreAT - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - add sp, sp, #0x24 - ldmia sp!, {lr} - bx lr - - arm_func_start CTRDGi_EraseFlashChipAT -CTRDGi_EraseFlashChipAT: ; 0x020DC75C - stmdb sp!, {lr} - sub sp, sp, #0x24 - add r0, sp, #0x0 - bl CTRDGi_EraseFlashChipCoreAT - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - add sp, sp, #0x24 - ldmia sp!, {lr} - bx lr - - arm_func_start CTRDGi_WriteFlash4KBCoreAT -CTRDGi_WriteFlash4KBCoreAT: ; 0x020DC780 - stmdb sp!, {r4-r9,lr} - sub sp, sp, #0x24 - mov r5, r0 - ldmia r5!, {r0-r3} - add r4, sp, #0x0 - stmia r4!, {r0-r3} - ldmia r5!, {r0-r3} - stmia r4!, {r0-r3} - ldr r0, [r5, #0x0] - str r0, [r4, #0x0] - ldrh r0, [sp, #0x20] - ldr r7, [sp, #0xc] - cmp r0, #0x10 - addcs sp, sp, #0x24 - ldrhs r0, _020DC85C ; =0x000080FF - ldmcsia sp!, {r4-r9,lr} - bxcs lr - ldr r1, _020DC860 ; =AT29LV512_lib - mov r0, r0, lsl #0x15 - ldr r1, [r1, #0x24] - ldr r4, _020DC864 ; =UNK_021D6B08 - mov r8, r0, lsr #0x10 - strh r1, [r4, #0x0] - ldrh r0, [r4, #0x0] - cmp r0, #0x0 - beq _020DC84C - ldr r0, _020DC868 ; =AT29LV512_org - ldr r6, [r0, #0x24] - mov r5, #0x2 -_020DC7F4: - mov r9, r5 -_020DC7F8: - mov r0, r8 - mov r1, r7 - bl CTRDGi_WriteFlashSectorAT - movs r12, r0 - beq _020DC81C - sub r0, r9, #0x1 - mov r0, r0, lsl #0x10 - movs r9, r0, lsr #0x10 - bne _020DC7F8 -_020DC81C: - cmp r12, #0x0 - bne _020DC84C - ldrh r1, [r4, #0x0] - add r0, r8, #0x1 - mov r0, r0, lsl #0x10 - sub r1, r1, r6 - strh r1, [r4, #0x0] - ldrh r1, [r4, #0x0] - add r7, r7, r6 - mov r8, r0, lsr #0x10 - cmp r1, #0x0 - bne _020DC7F4 -_020DC84C: - mov r0, r12 - add sp, sp, #0x24 - ldmia sp!, {r4-r9,lr} - bx lr - .balign 4 -_020DC85C: .word 0x000080FF -_020DC860: .word AT29LV512_lib -_020DC864: .word UNK_021D6B08 -_020DC868: .word AT29LV512_org - - arm_func_start CTRDGi_WriteFlashSectorCoreAT -CTRDGi_WriteFlashSectorCoreAT: ; 0x020DC86C - stmdb sp!, {r4-r5,lr} - sub sp, sp, #0x24 - mov r5, r0 - add r4, sp, #0x0 - ldmia r5!, {r0-r3} - stmia r4!, {r0-r3} - ldmia r5!, {r0-r3} - stmia r4!, {r0-r3} - ldr r0, _020DC984 ; =ctrdgi_flash_lock_id - ldr r1, [r5, #0x0] - ldrh r0, [r0, #0x0] - str r1, [r4, #0x0] - ldr r4, [sp, #0xc] - bl OS_LockCartridge - ldr r5, _020DC988 ; =0x04000204 - ldr r1, _020DC98C ; =AgbFlash - ldrh r0, [r5, #0x0] - ldr r1, [r1, #0x0] - ldrh r2, [r5, #0x0] - ldr r3, [r1, #0x10] - ldr r1, _020DC990 ; =AT29LV512_org - bic r2, r2, #0x3 - orr r2, r2, r3 - strh r2, [r5, #0x0] - ldr r5, _020DC994 ; =0x04000208 - ldrh lr, [sp, #0x20] - ldrh r12, [r1, #0x28] - ldrh r2, [r5, #0x0] - mov r3, #0x0 - mov lr, lr, lsl r12 - strh r3, [r5, #0x0] - ldr ip, _020DC998 ; =0x0A005555 - mov r5, #0xaa - strb r5, [r12, #0x0] - ldr r3, _020DC99C ; =0x0A002AAA - mov r5, #0x55 - strb r5, [r3, #0x0] - mov r3, #0xa0 - strb r3, [r12, #0x0] - ldr r3, [r1, #0x24] - and r5, r0, #0x3 - cmp r3, #0x0 - add r1, lr, #0xa000000 - beq _020DC92C -_020DC91C: - ldrb r0, [r4], #0x1 - subs r3, r3, #0x1 - strb r0, [r1], #0x1 - bne _020DC91C -_020DC92C: - ldr ip, _020DC994 ; =0x04000208 - ldr r3, _020DC9A0 ; =CTRDGi_PollingSR - ldrh r0, [r12, #0x0] - sub r1, r1, #0x1 - mov r0, #0x1 - strh r2, [r12, #0x0] - ldrb r2, [r4, #-0x1] - ldr r3, [r3, #0x0] - blx r3 - ldr r3, _020DC988 ; =0x04000204 - ldr r1, _020DC984 ; =ctrdgi_flash_lock_id - ldrh r2, [r3, #0x0] - mov r4, r0 - bic r0, r2, #0x3 - orr r0, r0, r5 - strh r0, [r3, #0x0] - ldrh r0, [r1, #0x0] - bl OS_UnlockCartridge - mov r0, r4 - add sp, sp, #0x24 - ldmia sp!, {r4-r5,lr} - bx lr - .balign 4 -_020DC984: .word ctrdgi_flash_lock_id -_020DC988: .word 0x04000204 -_020DC98C: .word AgbFlash -_020DC990: .word AT29LV512_org -_020DC994: .word 0x04000208 -_020DC998: .word 0x0A005555 -_020DC99C: .word 0x0A002AAA -_020DC9A0: .word CTRDGi_PollingSR - - arm_func_start CTRDGi_EraseFlash4KBCoreAT -CTRDGi_EraseFlash4KBCoreAT: ; 0x020DC9A4 - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x24 - mov r5, r0 - ldmia r5!, {r0-r3} - add r4, sp, #0x0 - stmia r4!, {r0-r3} - ldmia r5!, {r0-r3} - stmia r4!, {r0-r3} - ldr r0, [r5, #0x0] - str r0, [r4, #0x0] - ldrh r0, [sp, #0x20] - cmp r0, #0x10 - addcs sp, sp, #0x24 - ldrhs r0, _020DCA54 ; =0x000080FF - ldmcsia sp!, {r4-r7,lr} - bxcs lr - mov r0, r0, lsl #0x15 - mov r5, r0, lsr #0x10 - mov r6, #0x0 - mov r4, #0x2 -_020DC9F4: - mov r7, r4 -_020DC9F8: - mov r0, r5 - bl CTRDGi_EraseFlashSectorAT -_020DCA00: ; 0x020DCA00 - cmp r0, #0x0 - beq _020DCA18 - sub r1, r7, #0x1 - mov r1, r1, lsl #0x10 - movs r7, r1, lsr #0x10 - bne _020DC9F8 -_020DCA18: - add r1, r5, #0x1 - mov r1, r1, lsl #0x10 - cmp r0, #0x0 - mov r5, r1, lsr #0x10 - addne sp, sp, #0x24 - ldmneia sp!, {r4-r7,lr} - bxne lr - add r1, r6, #0x1 - mov r1, r1, lsl #0x10 - mov r6, r1, lsr #0x10 - cmp r6, #0x20 - blo _020DC9F4 - add sp, sp, #0x24 - ldmia sp!, {r4-r7,lr} - bx lr - .balign 4 -_020DCA54: .word 0x000080FF diff --git a/arm9/asm/CTRDG_flash_LE39FW512.s b/arm9/asm/CTRDG_flash_LE39FW512.s index 26e714c0..8b249e96 100644 --- a/arm9/asm/CTRDG_flash_LE39FW512.s +++ b/arm9/asm/CTRDG_flash_LE39FW512.s @@ -6,7 +6,7 @@ .extern CTRDGi_PollingSR .extern ctrdgi_flash_lock_id .extern ctrdgi_backup_irq - .extern UNK_021D6B08 + .extern ctrdg_flash_remainder .section .rodata @@ -256,7 +256,7 @@ _020DCF38: ldr r3, [r1, #0x0] ldrh r2, [r5, #0x0] ldr r3, [r3, #0x10] - ldr r7, _020DD02C ; =UNK_021D6B08 + ldr r7, _020DD02C ; =ctrdg_flash_remainder bic r2, r2, #0x3 orr r2, r2, r3 strh r2, [r5, #0x0] @@ -311,7 +311,7 @@ _020DD01C: .word AgbFlash _020DD020: .word CTRDGi_VerifyFlashCoreFF _020DD024: .word ctrdgi_flash_lock_id _020DD028: .word 0x04000204 -_020DD02C: .word UNK_021D6B08 +_020DD02C: .word ctrdg_flash_remainder _020DD030: .word 0x04000208 _020DD034: .word ctrdgi_backup_irq diff --git a/arm9/asm/CTRDG_flash_MX29L010.s b/arm9/asm/CTRDG_flash_MX29L010.s index 13de7bd7..39f792cc 100644 --- a/arm9/asm/CTRDG_flash_MX29L010.s +++ b/arm9/asm/CTRDG_flash_MX29L010.s @@ -6,7 +6,7 @@ .extern CTRDGi_PollingSR .extern ctrdgi_flash_lock_id .extern ctrdgi_backup_irq - .extern UNK_021D6B08 + .extern ctrdg_flash_remainder .section .rodata @@ -174,7 +174,7 @@ CTRDGi_WriteFlashSectorCoreMX: ; 0x020DD3D0 ldr r3, [r0, #0x0] mov r0, r1, lsl #0x10 ldr r2, [r3, #0x4] - ldr r8, _020DD550 ; =UNK_021D6B08 + ldr r8, _020DD550 ; =ctrdg_flash_remainder ldr r1, _020DD554 ; =0x04000208 strh r2, [r8, #0x0] ldrh r3, [r3, #0x8] @@ -226,7 +226,7 @@ _020DD540: .word AgbFlash _020DD544: .word 0x000080FF _020DD548: .word ctrdgi_flash_lock_id _020DD54C: .word 0x04000204 -_020DD550: .word UNK_021D6B08 +_020DD550: .word ctrdg_flash_remainder _020DD554: .word 0x04000208 _020DD558: .word ctrdgi_backup_irq diff --git a/arm9/asm/CTRDG_flash_MX29L512.s b/arm9/asm/CTRDG_flash_MX29L512.s index eac57f63..a0d7a776 100644 --- a/arm9/asm/CTRDG_flash_MX29L512.s +++ b/arm9/asm/CTRDG_flash_MX29L512.s @@ -5,7 +5,7 @@ .extern CTRDGi_EraseFlashChipLE .extern CTRDGi_EraseFlashSectorAsyncLE .extern CTRDGi_PollingSR512kCOMMON - .extern UNK_021D6B08 + .extern ctrdg_flash_remainder .extern AgbFlash .extern ctrdgi_flash_lock_id @@ -96,7 +96,7 @@ CTRDGi_WriteFlashSectorCoreMX5: ; 0x020DD8C0 ldr r2, [r0, #0x0] ldrh r1, [r7, #0x0] ldr r2, [r2, #0x10] - ldr r8, _020DD9F8 ; =UNK_021D6B08 + ldr r8, _020DD9F8 ; =ctrdg_flash_remainder bic r1, r1, #0x3 orr r1, r1, r2 strh r1, [r7, #0x0] @@ -142,4 +142,4 @@ _020DD9E8: .word AgbFlash _020DD9EC: .word 0x000080FF _020DD9F0: .word ctrdgi_flash_lock_id _020DD9F4: .word 0x04000204 -_020DD9F8: .word UNK_021D6B08 +_020DD9F8: .word ctrdg_flash_remainder diff --git a/arm9/asm/CTRDG_flash_common.s b/arm9/asm/CTRDG_flash_common.s index ed1dd88e..cf62c3b0 100644 --- a/arm9/asm/CTRDG_flash_common.s +++ b/arm9/asm/CTRDG_flash_common.s @@ -3,8 +3,8 @@ .section .bss - .global UNK_021D6B08 -UNK_021D6B08: ; 0x021D6B08 + .global ctrdg_flash_remainder +ctrdg_flash_remainder: ; 0x021D6B08 .space 0x4 .global ctrdgi_flash_lock_id diff --git a/arm9/asm/SOC_socl_const.s b/arm9/asm/SOC_socl_const.s deleted file mode 100644 index 1a4b032e..00000000 --- a/arm9/asm/SOC_socl_const.s +++ /dev/null @@ -1,2 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" diff --git a/arm9/lib/include/CTRDG_backup.h b/arm9/lib/include/CTRDG_backup.h index 272744ad..8b95a7aa 100644 --- a/arm9/lib/include/CTRDG_backup.h +++ b/arm9/lib/include/CTRDG_backup.h @@ -8,6 +8,11 @@ #define CTRDG_BACKUP_PHASE_PROGRAM 0x0001 #define CTRDG_BACKUP_PHASE_SECTOR_ERASE 0x0002 #define CTRDG_BACKUP_PHASE_CHIP_ERASE 0x0003 +#define CTRDG_BACKUP_PHASE_PARAMETER_CHECK 0x00ff + +#define CTRDG_BACKUP_RESULT_ERROR 0x8000 + +extern u16 ctrdg_flash_remainder; typedef struct CTRDGiFlashTypePlusTag { diff --git a/arm9/lib/include/CTRDG_flash_AT29LV512.h b/arm9/lib/include/CTRDG_flash_AT29LV512.h index 908dd6cf..64f3efdb 100644 --- a/arm9/lib/include/CTRDG_flash_AT29LV512.h +++ b/arm9/lib/include/CTRDG_flash_AT29LV512.h @@ -6,5 +6,18 @@ u32 CTRDGi_EraseFlashChipCoreAT(CTRDGTaskInfo *arg); u32 CTRDGi_EraseFlashSectorCoreAT(CTRDGTaskInfo *arg); +u32 CTRDGi_EraseFlash4KBCoreAT(CTRDGTaskInfo *arg); +u32 CTRDGi_WriteFlashSectorCoreAT(CTRDGTaskInfo *arg); +u32 CTRDGi_WriteFlash4KBCoreAT(CTRDGTaskInfo *arg); +u16 CTRDGi_EraseFlashChipAT(void); +u16 CTRDGi_EraseFlash4KBAT(u16 l_secNo); +u16 CTRDGi_WriteFlash4KBAT(u16 l_secNo, u8 *src); +void CTRDGi_EraseFlashChipAsyncAT(CTRDG_TASK_FUNC callback); +void CTRDGi_EraseFlash4KBAsyncAT(u16 l_secNo, CTRDG_TASK_FUNC callback); +void CTRDGi_WriteFlash4KBAsyncAT(u16 l_secNo, u8 *src, CTRDG_TASK_FUNC callback); +u16 CTRDGi_EraseFlashSectorAT(u16 p_secNo); +u16 CTRDGi_WriteFlashSectorAT(u16 p_secNo, u8 *src); +void CTRDGi_EraseFlashSectorAsyncAT(u16 p_secNo, CTRDG_TASK_FUNC callback); +void CTRDGi_WriteFlashSectorAsyncAT(u16 p_secNo, u8 *src, CTRDG_TASK_FUNC callback); #endif //POKEDIAMOND_CTRDG_FLASH_AT29LV512_H diff --git a/arm9/lib/src/CTRDG_flash_AT29LV512.c b/arm9/lib/src/CTRDG_flash_AT29LV512.c index 8cd90c31..b1d09738 100644 --- a/arm9/lib/src/CTRDG_flash_AT29LV512.c +++ b/arm9/lib/src/CTRDG_flash_AT29LV512.c @@ -9,22 +9,16 @@ #define CTRDG_BACKUP_COM_ADR1 (CTRDG_AGB_FLASH_ADR+0x00005555) #define CTRDG_BACKUP_COM_ADR2 (CTRDG_AGB_FLASH_ADR+0x00002aaa) +#define FLASH_LOG_SECTOR_COUNT 16 +#define FLASH_SECTOR_LOG_TO_PHYS 32 +#define FLASH_SECTOR_LOG_TO_PHYS_SHIFT 5 + extern u16 ctrdgi_flash_lock_id; extern BOOL ctrdgi_backup_irq; -extern u16 CTRDGi_PollingSR512kCOMMON(u16 phase, u8 *adr, u16 lastData); - -extern u16 CTRDGi_EraseFlashChipAT(void); -extern u16 CTRDGi_EraseFlashSectorAT(u16 p_secNo); -extern u16 CTRDGi_EraseFlash4KBAT(u16 l_secNo); -extern u16 CTRDGi_WriteFlashSectorAT(u16 p_secNo, u8 *src); -extern u16 CTRDGi_WriteFlash4KBAT(u16 l_secNo, u8 *src); +extern void CTRDGi_SetTask(CTRDGTaskInfo * pt, CTRDG_TASK_FUNC task, CTRDG_TASK_FUNC callback); -extern void CTRDGi_EraseFlashChipAsyncAT(CTRDG_TASK_FUNC callback); -extern void CTRDGi_EraseFlash4KBAsyncAT(u16 secNo, CTRDG_TASK_FUNC callback); -extern void CTRDGi_WriteFlash4KBAsyncAT(u16 secNo, u8 *src, CTRDG_TASK_FUNC callback); -extern void CTRDGi_EraseFlashSectorAsyncAT(u16 secNo, CTRDG_TASK_FUNC callback); -extern void CTRDGi_WriteFlashSectorAsyncAT(u16 secNo, u8 *src, CTRDG_TASK_FUNC callback); +extern u16 CTRDGi_PollingSR512kCOMMON(u16 phase, u8 *adr, u16 lastData); static const u16 atMaxTime[] = { 10, 40, 0, 40 @@ -141,3 +135,193 @@ ARM_FUNC u32 CTRDGi_EraseFlashSectorCoreAT(CTRDGTaskInfo *arg) return result; } + +ARM_FUNC u32 CTRDGi_EraseFlash4KBCoreAT(CTRDGTaskInfo *arg) +{ + u32 result; + u16 i, p_secNo, retry; + CTRDGTaskInfo p = *arg; + u16 l_secNo = p.sec_num; + + if (l_secNo >= FLASH_LOG_SECTOR_COUNT) + { + return CTRDG_BACKUP_RESULT_ERROR | CTRDG_BACKUP_PHASE_PARAMETER_CHECK; + } + + p_secNo = (u16)(l_secNo << FLASH_SECTOR_LOG_TO_PHYS_SHIFT); + for (i = 0; i < FLASH_SECTOR_LOG_TO_PHYS; i++) + { + for (retry = 2; retry > 0; retry--) + { + result = CTRDGi_EraseFlashSectorAT(p_secNo); + if (result == 0) + { + break; + } + } + p_secNo++; + if (result) + { + break; + } + } + + return result; +} + +ARM_FUNC u32 CTRDGi_WriteFlashSectorCoreAT(CTRDGTaskInfo *arg) +{ + u32 i; + u8 *dst; + BOOL shlet_ime; + MICartridgeRamCycle ram_cycle; + u32 result; + CTRDGTaskInfo p = *arg; + u16 p_secNo = p.sec_num; + u8 *src = p.data; + + (void)OS_LockCartridge(ctrdgi_flash_lock_id); + + ram_cycle = MI_GetCartridgeRamCycle(); + MI_SetCartridgeRamCycle(AgbFlash->agbWait[0]); + + dst = (u8 *)(CTRDG_AGB_FLASH_ADR + (p_secNo << AT29LV512_org.type.sector.shift)); + + shlet_ime = OS_DisableIrq(); + + *(vu8 *)CTRDG_BACKUP_COM_ADR1 = 0xaa; + *(vu8 *)CTRDG_BACKUP_COM_ADR2 = 0x55; + *(vu8 *)CTRDG_BACKUP_COM_ADR1 = 0xa0; + + for (i = AT29LV512_org.type.sector.size; i > 0; i--) + { + *dst++ = *src++; + } + dst--; + src--; + + (void)OS_RestoreIrq(shlet_ime); + + result = CTRDGi_PollingSR(CTRDG_BACKUP_PHASE_PROGRAM, dst, *src); + + MI_SetCartridgeRamCycle(ram_cycle); + + (void)OS_UnlockCartridge(ctrdgi_flash_lock_id); + + return result; +} + +ARM_FUNC u32 CTRDGi_WriteFlash4KBCoreAT(CTRDGTaskInfo *arg) +{ + u32 result; + u16 p_secNo, retry; + CTRDGTaskInfo p = *arg; + u16 l_secNo = p.sec_num; + u8 *src = p.data; + + if (l_secNo >= FLASH_LOG_SECTOR_COUNT) + { + return CTRDG_BACKUP_RESULT_ERROR | CTRDG_BACKUP_PHASE_PARAMETER_CHECK; + } + + p_secNo = (u16)(l_secNo << FLASH_SECTOR_LOG_TO_PHYS_SHIFT); + ctrdg_flash_remainder = (u16)(AT29LV512_lib.type.sector.size); + while (ctrdg_flash_remainder) + { + for (retry = 2; retry > 0; retry--) + { + result = CTRDGi_WriteFlashSectorAT(p_secNo, src); + if (result == 0) + { + break; + } + } + if (result) + { + break; + } + ctrdg_flash_remainder -= AT29LV512_org.type.sector.size; + src += AT29LV512_org.type.sector.size; + p_secNo++; + } + + return result; +} + +ARM_FUNC u16 CTRDGi_EraseFlashChipAT(void) +{ + CTRDGTaskInfo p; + return (u16)CTRDGi_EraseFlashChipCoreAT(&p); +} + +ARM_FUNC u16 CTRDGi_EraseFlash4KBAT(u16 l_secNo) +{ + CTRDGTaskInfo p; + p.sec_num = l_secNo; + return (u16)CTRDGi_EraseFlash4KBCoreAT(&p); +} + +ARM_FUNC u16 CTRDGi_WriteFlash4KBAT(u16 l_secNo, u8 *src) +{ + CTRDGTaskInfo p; + p.sec_num = l_secNo; + p.data = src; + return (u16)CTRDGi_WriteFlash4KBCoreAT(&p); +} + +ARM_FUNC void CTRDGi_EraseFlashChipAsyncAT(CTRDG_TASK_FUNC callback) +{ + CTRDGTaskInfo p; + + CTRDGi_SetTask(&p, CTRDGi_EraseFlashChipCoreAT, callback); +} + +ARM_FUNC void CTRDGi_EraseFlash4KBAsyncAT(u16 l_secNo, CTRDG_TASK_FUNC callback) +{ + CTRDGTaskInfo p; + + p.sec_num = l_secNo; + CTRDGi_SetTask(&p, CTRDGi_EraseFlash4KBCoreAT, callback); +} + +ARM_FUNC void CTRDGi_WriteFlash4KBAsyncAT(u16 l_secNo, u8 *src, CTRDG_TASK_FUNC callback) +{ + CTRDGTaskInfo p; + + p.sec_num = l_secNo; + p.data = src; + CTRDGi_SetTask(&p, CTRDGi_WriteFlash4KBCoreAT, callback); +} + +ARM_FUNC u16 CTRDGi_EraseFlashSectorAT(u16 p_secNo) +{ + CTRDGTaskInfo p; + p.sec_num = p_secNo; + return (u16)CTRDGi_EraseFlashSectorCoreAT(&p); +} + +ARM_FUNC u16 CTRDGi_WriteFlashSectorAT(u16 p_secNo, u8 *src) +{ + CTRDGTaskInfo p; + + p.sec_num = p_secNo; + p.data = src; + return (u16)CTRDGi_WriteFlashSectorCoreAT(&p); +} + +ARM_FUNC void CTRDGi_EraseFlashSectorAsyncAT(u16 p_secNo, CTRDG_TASK_FUNC callback) +{ + CTRDGTaskInfo p; + + p.sec_num = p_secNo; + CTRDGi_SetTask(&p, CTRDGi_EraseFlashSectorCoreAT, callback); +} + +ARM_FUNC void CTRDGi_WriteFlashSectorAsyncAT(u16 p_secNo, u8 *src, CTRDG_TASK_FUNC callback) +{ + CTRDGTaskInfo p; + + p.sec_num = p_secNo; + p.data = src; + CTRDGi_SetTask(&p, CTRDGi_WriteFlashSectorCoreAT, callback); +} |