/* soc */ .equ GPIOA, 0xC80B0000 .equ GPIOD, 0xC80E0000 .equ CGU_PERI, 0xC80F0014 .equ CCU_BASE, 0xC8100000 .equ SOUK, 0x1bf2c .equ SOUK_LEN, 0x3cc .equ VAL, 0 /* DO NOT TOUCH */ originalentry: .word 0 /* This value is filled in by mkamsboot */ /* enable gpio clock */ ldr r1, =CGU_PERI ldr r2, [r1] mov r0, #0x10000 /* gpio : bit 16 */ orr r2, r2, r0 str r2, [r1] /* check hold button / usb connection */ ldr r1, =GPIOA mov r2, #0 strb r2, [r1, #0x400] /* gpioa_dir */ ldrb r4, [r1, #0x120] /* pin 3 : hold, 6 : usb */ /* we need write access, so map the firmware into RAM */ ldr r1, =CCU_BASE mov r0, #1 /* ram */ str r0, [r1, #8] /* ccu_memmap */ bl clean /* BE CAREFUL : uses r0, r1, r2, r3 */ cmp r4, #0 bne resume /* resume OF if set */ /* NOW YOU CAN TOUCH */ /* from here we can run bad code, infinite loops, etc .. */ bl blink bl clean b resume /* store our functions here */ /* DO NOT TOUCH */ /* Reset block to normal */ /* DO NOT TOUCH */ /* Uses: r0, r1, r2, r3 */ /* DO NOT TOUCH */ /* RET: r3 */ /* DO NOT TOUCH */ clean: /* DO NOT TOUCH */ mov r3, lr /* DO NOT TOUCH */ ldr r0, =SOUK /* DO NOT TOUCH */ ldr r1, =VAL /* DO NOT TOUCH */ ldr r2, =SOUK_LEN /* DO NOT TOUCH */ bl bzero /* DO NOT TOUCH */ bx r3 /* DO NOT TOUCH */ /* WORD ALIGNED */ /* DO NOT TOUCH */ /* void memset(r0 = address, r1 = word, r2 = size) */ /* DO NOT TOUCH */ /* RET : safe */ /* DO NOT TOUCH */ bzero: /* DO NOT TOUCH */ subs r2, r2, #4 /* start by the end */ /* DO NOT TOUCH */ _bzero: /* DO NOT TOUCH */ str r1, [r0, r2] /* DO NOT TOUCH */ subs r2, r2, #4 /* DO NOT TOUCH */ bge _bzero /* DO NOT TOUCH */ bx lr /* DO NOT TOUCH */ /* end of bzero */ /* blink : switches the light on/off r1 times, delay in r4 */ /* uses: r0, r1, r2, r3, r4(sleep) */ /* void blink(void) */ /* RETURN r6 */ blink: mov r6, lr ldr r2, =GPIOD ldrb r0, [r2, #0x400] /* gpiod_dir */ orr r0, r0, #0x80 /* sets pin 7 as output */ strb r0, [r2, #0x400] mov r3, #0 /* Start by toggling off */ mov r1, #0x8 /* Let's toggle 8 times (4 on/off cycles) */ toggle_led: strb r3, [r2, #0x200] /* switch pin 7 : led on/off */ /* and prepare for next cycle */ eor r3, r3, #0xFF /* toggle value we write into pin 7 */ mov r4, #0x20000 /* approx 1/8 second delay */ bl sleep /* Let's do 4 on/off cycles */ subs r1, r1, #1 bne toggle_led bx r6 /* end of function blink */ /* void sleep(r4) : r4 = 0x10000 ~= 1 second */ /* RETURN : lr is safe */ sleep: subs r4, r4, #1 bne sleep bx lr /* end of function sleep */ /* RET: never, so safe */ infinite_blink: bl blink b infinite_blink /* end of function infinite_blink */ resume: ldr pc, originalentry