ak3-labs-asm/start.S

100 lines
1.5 KiB
ArmAsm

.syntax unified
.cpu cortex-m4
.thumb
.equ SYSTICK_OFFSET, 0xE000E010
.equ RCC_OFFSET, 0x40023800
.equ GPIOD_OFFSET, 0x40020C00
.section .text
vtable:
.word __stack_start
.word __hard_reset__+1
.align 2
v2_img_start:
.incbin "lab1_v2.bin"
.align 2
v2_img_end: @ ==__hard_reset__
__hard_reset__:
bl setup_leds
bl load_systick_timer
bl lab1_v1
bl bootload_v2
readloop:
ldr.n r0, [r7, #8]
wfi
b.n readloop
load_systick_timer:
@ SysTick_LOAD
ldr.n r7, =SYSTICK_OFFSET
mov r1, #0x1
lsl r1, #20
str.n r1, [r7, #4]
@ SysTick_CTRL
mov r1, #0x1
str.n r1, [r7]
mov pc, lr
bootload_v2:
push {lr}
@ bootload to ram
ldr.n r0, =v2_img_start
ldr.n r1, =v2_img_end
ldr.n r3, =__ram_start
copy_loop:
ldr r2, [r0], #4
str r2, [r3], #4
cmp.n r0, r1
bne.n copy_loop
ldr.n r3, =__ram_start
add r3, r3, #1
push {r3}
blx r3
pop {r3}
@ patch A
ldr r0, =0x707ff64d @ 0xDF7F
str r0, [r3, #0xb]
push {r3}
blx r3
pop {r3}
@ patch A and B
ldr r0, =0x000af240 @ 0x000A
str r0, [r3, #0xb]
ldr r0, =0x010af240 @ 0x000A
str r0, [r3, #0xf]
blx r3
pop {pc}
setup_leds:
@ RCC reset & enable GPIOD
ldr r0, =RCC_OFFSET
mov r1, #0x8
str r1, [r0, #0x30] @ ENABLE
@ GPIOD config
ldr r0, =GPIOD_OFFSET
ldr r1, =0x55000000
str r1, [r0] @ Mode Register
mov r1, #0xF000
str r1, [r0, #0x14] @ Output Data Register
mov pc, lr