summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRevo <projectrevotpp@hotmail.com>2021-03-09 10:54:26 -0500
committerGitHub <noreply@github.com>2021-03-09 10:54:26 -0500
commitd032e35566418f0706c892d7227fe7e5dc8f7f58 (patch)
tree32f4514efda3ef5dc46ce2e3137e2815c9e61627
parentacbce1c8be2370e6617cdc74eb658f3f5cf8e1ed (diff)
parentbf279cbcd3d541426fd9c82dafeafaf5f479d285 (diff)
Merge pull request #326 from red031000/master
finish CTRDG_flash_AT29LV512
-rw-r--r--arm9/arm9.lsf2
-rw-r--r--arm9/asm/CTRDG_flash_AT29LV512_asm.s358
-rw-r--r--arm9/asm/CTRDG_flash_LE39FW512.s6
-rw-r--r--arm9/asm/CTRDG_flash_MX29L010.s6
-rw-r--r--arm9/asm/CTRDG_flash_MX29L512.s6
-rw-r--r--arm9/asm/CTRDG_flash_common.s4
-rw-r--r--arm9/asm/SOC_socl_const.s2
-rw-r--r--arm9/lib/include/CTRDG_backup.h5
-rw-r--r--arm9/lib/include/CTRDG_flash_AT29LV512.h13
-rw-r--r--arm9/lib/src/CTRDG_flash_AT29LV512.c208
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);
+}