Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/linux-sunxi/sunxi-tools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fel_lib.c25
-rw-r--r--thunks/sid_read_root.S14
-rw-r--r--thunks/sid_read_root.h26
3 files changed, 38 insertions, 27 deletions
diff --git a/fel_lib.c b/fel_lib.c
index 310e836..c79eebb 100644
--- a/fel_lib.c
+++ b/fel_lib.c
@@ -551,9 +551,10 @@ void fel_clrsetbits_le32(feldev_handle *dev,
static void fel_get_sid_registers(feldev_handle *dev, uint32_t *result)
{
uint32_t arm_code[] = {
- htole32(0xe59f0040), /* 0: ldr r0, [pc, #64] */
- htole32(0xe3a01000), /* 4: mov r1, #0 */
- htole32(0xe28f303c), /* 8: add r3, pc, #60 */
+ /* <sid_read_root_key>: */
+ htole32(0xe59f0044), /* 0: ldr r0, [pc, #68] */
+ htole32(0xe59f1044), /* 4: ldr r1, [pc, #68] */
+ htole32(0xe28f3048), /* 8: add r3, pc, #72 */
/* <sid_read_loop>: */
htole32(0xe1a02801), /* c: lsl r2, r1, #16 */
htole32(0xe3822b2b), /* 10: orr r2, r2, #44032 */
@@ -564,14 +565,20 @@ static void fel_get_sid_registers(feldev_handle *dev, uint32_t *result)
htole32(0xe3120002), /* 20: tst r2, #2 */
htole32(0x1afffffc), /* 24: bne 1c <sid_read_wait> */
htole32(0xe5902060), /* 28: ldr r2, [r0, #96] */
- htole32(0xe7832001), /* 2c: str r2, [r3, r1] */
+ htole32(0xe4832004), /* 2c: str r2, [r3], #4 */
htole32(0xe2811004), /* 30: add r1, r1, #4 */
- htole32(0xe3510010), /* 34: cmp r1, #16 */
- htole32(0x3afffff3), /* 38: bcc c <sid_read_loop> */
- htole32(0xe3a02000), /* 3c: mov r2, #0 */
- htole32(0xe5802040), /* 40: str r2, [r0, #64] */
- htole32(0xe12fff1e), /* 44: bx lr */
+ htole32(0xe59f2018), /* 34: ldr r2, [pc, #24] */
+ htole32(0xe1510002), /* 38: cmp r1, r2 */
+ htole32(0x3afffff2), /* 3c: bcc c <sid_read_loop> */
+ htole32(0xe3a02000), /* 40: mov r2, #0 */
+ htole32(0xe5802040), /* 44: str r2, [r0, #64] */
+ htole32(0xe12fff1e), /* 48: bx lr */
+ /* <sid_base>: */
htole32(dev->soc_info->sid_base), /* SID base addr */
+ /* <offset>: */
+ htole32(0), /* first word to read */
+ /* <end>: */
+ htole32(16), /* where to stop to read */
/* retrieved SID values go here */
};
/* write and execute code */
diff --git a/thunks/sid_read_root.S b/thunks/sid_read_root.S
index 9fd04b1..3d8d719 100644
--- a/thunks/sid_read_root.S
+++ b/thunks/sid_read_root.S
@@ -42,7 +42,7 @@ sid_key_index .req r1
sid_read_root_key:
ldr SID_BASE, sid_base
- mov sid_key_index, #0
+ ldr sid_key_index, offset
adr r3, sid_result /* result pointer */
sid_read_loop:
mov r2, sid_key_index, lsl #16 /* PG_INDEX value */
@@ -55,10 +55,11 @@ sid_read_wait:
bne sid_read_wait /* loop while bit 1 still set */
ldr r2, [SID_BASE, #SID_RDKEY] /* read SID key value */
- str r2, [r3, sid_key_index] /* store SID value */
+ str r2, [r3], #4 /* store SID value */
add sid_key_index, #4
- cmp sid_key_index, #16
+ ldr r2, end
+ cmp sid_key_index, r2
blo sid_read_loop /* loop while (sid_key_index < 0x10) */
mov r2, #0
@@ -66,7 +67,6 @@ sid_read_wait:
bx lr
sid_base: .word 0
-sid_result: .word 0 /* receives the four "root key" 32-bit words */
- .word 0
- .word 0
- .word 0
+offset: .word 0
+end: .word 0
+sid_result: /* receives the values read from the SID registers */
diff --git a/thunks/sid_read_root.h b/thunks/sid_read_root.h
index 48596bb..fc11e14 100644
--- a/thunks/sid_read_root.h
+++ b/thunks/sid_read_root.h
@@ -1,7 +1,7 @@
/* <sid_read_root_key>: */
- htole32(0xe59f0040), /* 0: ldr r0, [pc, #64] */
- htole32(0xe3a01000), /* 4: mov r1, #0 */
- htole32(0xe28f303c), /* 8: add r3, pc, #60 */
+ htole32(0xe59f0044), /* 0: ldr r0, [pc, #68] */
+ htole32(0xe59f1044), /* 4: ldr r1, [pc, #68] */
+ htole32(0xe28f3048), /* 8: add r3, pc, #72 */
/* <sid_read_loop>: */
htole32(0xe1a02801), /* c: lsl r2, r1, #16 */
htole32(0xe3822b2b), /* 10: orr r2, r2, #44032 */
@@ -12,13 +12,17 @@
htole32(0xe3120002), /* 20: tst r2, #2 */
htole32(0x1afffffc), /* 24: bne 1c <sid_read_wait> */
htole32(0xe5902060), /* 28: ldr r2, [r0, #96] */
- htole32(0xe7832001), /* 2c: str r2, [r3, r1] */
+ htole32(0xe4832004), /* 2c: str r2, [r3], #4 */
htole32(0xe2811004), /* 30: add r1, r1, #4 */
- htole32(0xe3510010), /* 34: cmp r1, #16 */
- htole32(0x3afffff3), /* 38: bcc c <sid_read_loop> */
- htole32(0xe3a02000), /* 3c: mov r2, #0 */
- htole32(0xe5802040), /* 40: str r2, [r0, #64] */
- htole32(0xe12fff1e), /* 44: bx lr */
+ htole32(0xe59f2018), /* 34: ldr r2, [pc, #24] */
+ htole32(0xe1510002), /* 38: cmp r1, r2 */
+ htole32(0x3afffff2), /* 3c: bcc c <sid_read_loop> */
+ htole32(0xe3a02000), /* 40: mov r2, #0 */
+ htole32(0xe5802040), /* 44: str r2, [r0, #64] */
+ htole32(0xe12fff1e), /* 48: bx lr */
/* <sid_base>: */
- htole32(0x00000000), /* 48: .word 0x00000000 */
- /* <sid_result>: */
+ htole32(0x00000000), /* 4c: .word 0x00000000 */
+ /* <offset>: */
+ htole32(0x00000000), /* 50: .word 0x00000000 */
+ /* <end>: */
+ htole32(0x00000000), /* 54: .word 0x00000000 */