ak3-labs-asm/start.S

100 lines
1.5 KiB
ArmAsm
Raw Normal View History

2025-02-05 00:06:56 +02:00
.syntax unified
.cpu cortex-m4
.thumb
.equ SYSTICK_OFFSET, 0xE000E010
.equ RCC_OFFSET, 0x40023800
.equ GPIOD_OFFSET, 0x40020C00
.section .text
2025-02-05 00:06:56 +02:00
vtable:
.word __stack_start
.word __hard_reset__+1
2025-02-10 13:09:17 +02:00
.align 2
v2_img_start:
.incbin "lab1_v2.bin"
2025-02-10 13:09:17 +02:00
.align 2
v2_img_end: @ ==__hard_reset__
2025-02-05 00:06:56 +02:00
__hard_reset__:
bl setup_leds
bl load_systick_timer
bl lab1_v1
bl bootload_v2
readloop:
ldr.n r0, [r7, #8]
2025-02-09 15:59:54 +02:00
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:
2025-02-10 13:09:17 +02:00
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
2025-02-09 20:13:38 +02:00
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