fernly/usb-loader.S
2014-09-09 11:13:24 +08:00

164 lines
2.3 KiB
ArmAsm

.text
.global _start
_start:
// ldr r0, =0x7000cffc // stack_start
// mov sp, r0
// mov r2, #0xffffffff
// ldr r1, =0x7000c000 // stack_end
//
//clear_stack:
// cmp r1, r0
// str r2, [r0]
// sub r0, r0, #4
// bcc clear_stack
//
// bl wdt_disable
//
//clear_psram:
// mov r0, #0
// mov r1, #0x00800000
// mov r2, #0
//clear_psram_loop:
// cmp r1, r0
// str r2, [r0], #4
// bcc clear_psram_loop
//print_welcome_banner:
// adr r0, welcome_banner
// bl uart_puts
main_loop:
adr r0, four_byte_buffer
mov r1, #1
mvn r2, #0
ldr r3, =0xfff03639
blx r3
adr r0, four_byte_buffer
mov r1, #1
mvn r2, #0
ldr r3, =0xfff03653
blx r3
ldr r3, =0xfff04845
blx r3
b main_loop
.align 4
four_byte_buffer:
.ascii "1234"
load_program:
bl uart_getc
mov r5, r0
lsls r5, r5, #0
mov r4, r5
bl uart_getc
mov r5, r0
lsls r5, r5, #8
orr r4, r5
bl uart_getc
mov r5, r0
lsls r5, r5, #16
orr r4, r5
bl uart_getc
mov r5, r0
lsls r5, r5, #24
orr r4, r5
# r4 now contains the number of bytes to load.
# r5 contains the current offset to write to.
# Load bytes from the serial port into RAM.
mov r5, #0
loader_loop:
bl uart_getc
strb r0, [r5], #1
sub r4, #1
cmp r4, #0
bne loader_loop
jump_to_new_program:
adr r0, launch_message
bl uart_puts
mov r0, #0
mov pc, r0
.align 4
welcome_banner:
.ascii "Fernvale bootloader\r\nWrite four bytes of program size, then\r\n"
.asciz "write program data...\r\n>"
launch_message:
.asciz "Launching program...\r\n"
.align 4
uart_putc:
push {lr}
sub sp, sp, #12
add r3, sp, #8
strb r0, [r3, #-4]!
mov r0, r3
mov r1, #1
mvn r2, #0
ldr r3, =0x70004560
ldr r3, [r3]
blx r3
add sp, sp, #12
pop {pc}
uart_puts:
push {lr}
mov r3, r0
mov r2, r0
mov r1, #0
uart_puts_count_chars_loop:
ldrb r0, [r3], #1
cmp r0, #0
beq uart_puts_print
add r1, r1, #1
b uart_puts_count_chars_loop
uart_puts_print:
mov r0, r2
mvn r2, #0
// Call usb_uart_write(char *data, int bytes, int timeout)
ldr r3, =0x70004560
ldr r3, [r3]
blx r3
ldr r3, =0x70004564
ldr r3, [r3]
cmp r3, #0
beq uart_puts_exit
blx r3
uart_puts_exit:
pop {pc}
uart_getc:
bx =0xfff048ba+1
asm_memcpy:
mov r3, r1
add r3, r3, r2
asm_memcpy_loop:
cmp r1, r3
ldrcc r2, [r1], #4
strcc r2, [r0], #4
bcc asm_memcpy_loop
bx lr
wdt_disable:
ldr r1, =0xa0030000
mov r0, #0x2200
str r0, [r1]
bx lr