diff options
Diffstat (limited to 'rbutil/mkimxboot/dualboot/dualboot.S')
-rw-r--r-- | rbutil/mkimxboot/dualboot/dualboot.S | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/rbutil/mkimxboot/dualboot/dualboot.S b/rbutil/mkimxboot/dualboot/dualboot.S index 8302829a81..1b9edb015f 100644 --- a/rbutil/mkimxboot/dualboot/dualboot.S +++ b/rbutil/mkimxboot/dualboot/dualboot.S | |||
@@ -23,6 +23,7 @@ | |||
23 | .global start | 23 | .global start |
24 | @ int start(uint32_t arg, uint32_t *result_id) | 24 | @ int start(uint32_t arg, uint32_t *result_id) |
25 | start: | 25 | start: |
26 | stmfd sp!, {r4-r6,lr} | ||
26 | #if defined(SANSA_FUZEPLUS) | 27 | #if defined(SANSA_FUZEPLUS) |
27 | /* If volume down key is hold, return so that the OF can boot */ | 28 | /* If volume down key is hold, return so that the OF can boot */ |
28 | ldr r2, =0x80018610 @ HW_PINCTRL_DIN1 | 29 | ldr r2, =0x80018610 @ HW_PINCTRL_DIN1 |
@@ -30,10 +31,31 @@ start: | |||
30 | tst r2, #0x40000000 @ bit 30, active low | 31 | tst r2, #0x40000000 @ bit 30, active low |
31 | moveq r0, #0 @ return 0, continue boot | 32 | moveq r0, #0 @ return 0, continue boot |
32 | bxeq lr | 33 | bxeq lr |
33 | /* otherwise jump to section given as argument */ | 34 | /* otherwise monitor the power button for a short time */ |
35 | ldr r2, =550000 @ loop count | ||
36 | ldr r4, =0 @ number of times PSWITCH was 1 | ||
37 | pswitch_monitor_loop: | ||
38 | ldr r3, =0x800440c0 @ HW_POWER_STS | ||
39 | ldr r3, [r3] | ||
40 | mov r3, r3, lsl#10 | ||
41 | mov r3, r3, lsr#30 @ extract PSWITCH | ||
42 | cmp r3, #1 | ||
43 | addeq r4, r3 @ add one if PSWITCH=1 (means power hold) | ||
44 | subs r2, #1 | ||
45 | bne pswitch_monitor_loop | ||
46 | /* power down if power wasn't hold long enough */ | ||
47 | ldr r2, =400000 | ||
48 | cmp r4, r2 | ||
49 | bcc power_down | ||
50 | /* jump to section given as argument */ | ||
34 | str r0, [r1] | 51 | str r0, [r1] |
35 | mov r0, #1 | 52 | mov r0, #1 |
36 | bx lr | 53 | ldmfd sp!, {r4-r6,pc} |
54 | power_down: | ||
55 | ldr r0, =0x80044100 @ HW_POWER_RESET | ||
56 | ldr r1, =0x3E770001 @ unlock key + power down | ||
57 | str r1, [r0] | ||
58 | b power_down | ||
37 | #else | 59 | #else |
38 | #error No target defined ! | 60 | #error No target defined ! |
39 | #endif | 61 | #endif |