commit 9ce7aad1fee51b5b2c87f965dbaa3c9ffe0cad4e
parent 11b13529567ab1195ab0affefbf51e5c222748f2
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sat, 24 Feb 2024 07:26:52 +0900
delete head
Diffstat:
D | head/Makefile | | | 36 | ------------------------------------ |
D | head/boot2.s | | | 68 | -------------------------------------------------------------------- |
D | head/flash.s | | | 108 | ------------------------------------------------------------------------------- |
D | head/mach.s | | | 332 | ------------------------------------------------------------------------------- |
D | head/main.c | | | 29 | ----------------------------- |
D | head/mc.s | | | 89 | ------------------------------------------------------------------------------- |
D | head/memmap.ld | | | 20 | -------------------- |
7 files changed, 0 insertions(+), 682 deletions(-)
diff --git a/head/Makefile b/head/Makefile
@@ -1,36 +0,0 @@
-AS = arm-none-eabi-as
-LD = arm-none-eabi-ld
-CC = arm-none-eabi-gcc
-OBJCOPY = arm-none-eabi-objcopy
-BINCRC = ../tools/bincrc
-BIN2UF2 = ../tools/bin2uf2
-
-MCPU = -mcpu=cortex-m0plus
-ASFLAGS = $(MCPU)
-CFLAGS = $(MCPU) -ffreestanding -nostartfiles -O0 -fpic -mthumb -c
-LDFLAGS = --no-relax -nostdlib
-
-all: led.uf2
-
-clean:
- rm -f *.o *.elf *.uf2 *.bin
-
-.c.o:
- $(CC) $(CFLAGS) -o $@ $<
-
-.s.o:
- $(AS) $(ASFLAGS) -o $@ $<
-
-led.elf: boot2.o flash.o main.o mach.o memmap.ld
- $(LD) $(LDFLAGS) -o $@ -T memmap.ld boot2.o flash.o mach.o main.o
-
-led.bin: led.elf
- $(OBJCOPY) -O binary led.elf $@
-
-led.uf2: led.bin
- $(BINCRC) led.bin led_crc.bin
- $(BIN2UF2) led_crc.bin $@
-
-flash: led.uf2
- mount /dev/disk/by-label/RPI-RP2 /mnt
- cp led.uf2 /mnt
diff --git a/head/boot2.s b/head/boot2.s
@@ -1,68 +0,0 @@
-.cpu cortex-m0plus
-.thumb
-
- .section .boot2
- .global setup_xip
- .thumb_func
-setup_xip:
- push {r4, lr}
-
- // setup QSPI pad
- ldr r4, pads_qspi_base
- ldr r1, =(0 << 4 | 0 << 1 | 1) // 2mA, schmitt off, slew fast
- str r1, [r4, #0x4] // PADS_QSPI: GPIO_QSPI_SCLK
-
- ldr r4, rom_base
-
- ldrh r0, [r4, #0x14] // rom_func_table
- ldr r1, =('C' | 'X' << 8) // _flash_enter_cmd_xip()
- ldrh r2, [r4, #0x18] // rom_table_lookup
- blx r2
- blx r0
-
- // this code should be rewritten using dma.
- ldr r2, boot2_end
- ldr r3, sram_base
- ldr r0, etext
- sub r0, r0, r3
- add r0, #3
- lsr r0, #2
-sram_cpy:
- ldr r1, [r2, #0]
- str r1, [r3, #0]
- add r2, r2, #0x4
- add r3, r3, #0x4
- sub r0, r0, #0x1
- bne sram_cpy
-
- // exit from boot2
- pop {r4}
- pop {r0}
- cmp r0, #0
- beq initial_boot
- bx r0
-initial_boot:
- ldr r0, sram_base
- ldr r1, m0plus_vtor
- str r0, [r1, #0] // M0PLUS: VTOR
- ldr r1, [r0, #4] // entry point
- ldr r0, [r0, #0] // stack pointer
- mov sp, r0
- bx r1
-
- .align 2
-rom_base:
- .word 0x00000000
-boot2_end:
- .word 0x10000000 + 0x100
-sram_base:
- .word 0x20000000
-pads_qspi_base:
- .word 0x40020000
-m0plus_vtor:
- .word 0xe0000000 + 0xed08
-etext:
- .word _etext
-literals:
- .ltorg
-
diff --git a/head/flash.s b/head/flash.s
@@ -1,108 +0,0 @@
-.cpu cortex-m0plus
-.thumb
-
- .section .text
- .global frerase
- // void frerase(uint32_t ofs, size_t size);
- // erase the region of flash starting at ofs and size bytes long in size.
- // ofs must be aligned in 4K and size must be multiple of 4K
-frerase:
- push {r4, r5, r6, r7, lr}
-
- ldr r4, rom_base
- mov r5, r0
- mov r6, r1
-
- ldrh r0, [r4, #0x14] // rom_func_table
- ldr r1, =('I' | 'F' << 8) // _connect_internal_flash()
- ldrh r2, [r4, #0x18] // rom_table_lookup
- blx r2
- blx r0
-
- ldrh r0, [r4, #0x14] // rom_func_table
- ldr r1, =('E' | 'X' << 8) // _flash_exit_xip()
- ldrh r2, [r4, #0x18] // rom_table_lookup
- blx r2
- blx r0
-
- ldrh r0, [r4, #0x14] // rom_func_table
- ldr r1, =('R' | 'E' << 8) // _flash_range_erase()
- ldrh r2, [r4, #0x18] // rom_table_lookup
- blx r2
- mov r7, r0
- mov r0, r5
- mov r1, r6
- mov r2, #1
- lsl r2, r2, #16 // 64K
- mov r3, #0xd8 // block erase
- blx r7
-
- ldrh r0, [r4, #0x14] // rom_func_table
- ldr r1, =('F' | 'C' << 8) // _flash_flush_cache()
- ldrh r2, [r4, #0x18] // rom_table_lookup
- blx r2
- blx r0
-
- ldrh r0, [r4, #0x14] // rom_func_table
- ldr r1, =('C' | 'X' << 8) // _flash_enter_cmd_xip()
- ldrh r2, [r4, #0x18] // rom_table_lookup
- blx r2
- blx r0
-
- pop {r4, r5, r6, r7, pc}
-
- .global frprog
- // void frprog(uint32_t ofs, uint8_t *data, size_t count);
- // ofs must be aligned in 256 and data must be multiple of 256
-frprog:
- push {r4, r5, r6,r7, lr}
-
- ldr r4, rom_base
- mov r5, r0
- mov r6, r1
- mov r7, r2
-
- ldrh r0, [r4, #0x14] // rom_func_table
- ldr r1, =('I' | 'F' << 8) // _connect_internal_flash()
- ldrh r2, [r4, #0x18] // rom_table_lookup
- blx r2
- blx r0
-
- ldrh r0, [r4, #0x14] // rom_func_table
- ldr r1, =('E' | 'X' << 8) // _flash_exit_xip()
- ldrh r2, [r4, #0x18] // rom_table_lookup
- blx r2
- blx r0
-
- ldrh r0, [r4, #0x14] // rom_func_table
- ldr r1, =('R' | 'P' << 8) // _flash_range_program()
- ldrh r2, [r4, #0x18] // rom_table_lookup
- blx r2
- mov r3, r0
- mov r0, r5
- mov r1, r6
- mov r2, r7
- blx r3
-
- ldrh r0, [r4, #0x14] // rom_func_table
- ldr r1, =('F' | 'C' << 8) // _flash_flush_cache()
- ldrh r2, [r4, #0x18] // rom_table_lookup
- blx r2
- blx r0
-
- ldrh r0, [r4, #0x14] // rom_func_table
- ldr r1, =('C' | 'X' << 8) // _flash_enter_cmd_xip()
- ldrh r2, [r4, #0x18] // rom_table_lookup
- blx r2
- blx r0
-
- pop {r4, r5, r6, r7, pc}
-
- .align 2
-rom_base:
- .word 0x00000000
-xip_base:
- .word 0x10000000
-sram_base:
- .word 0x20000000
-
diff --git a/head/mach.s b/head/mach.s
@@ -1,332 +0,0 @@
-.cpu cortex-m0plus
-.thumb
-
- .section .vectors
-vectors:
- .word 0x20040000 // initial SP
- .word (reset+1) // entry point
-
- .section .text
- .thumb_func
-reset:
- bl main
-hang:
- b hang
-
- .global init
- .thumb_func
-init:
- push {r4, r5, lr}
- // unreset gpio and pll_sys and uart0
- mov r1, #1
- lsl r0, r1, #5 // io_bank0
- lsl r1, r1, #12 // pll_sys
- add r0, r0, r1
- lsl r1, r1, #10 // uart0
- add r0, r0, r1
- bl unreset
- bl wait_unreset
-
- // set gpio functions
- ldr r0, io_bank0_base
- mov r1, #2 // uart0
- mov r2, #5 // sio
- add r0, r0, #0x4 // io_bank0_gpio0_ctrl
- str r1, [r0, #0] // uart0
- add r0, r0, #0x8 // #0xc io_bank0_gpio1_ctrl
- str r1, [r0, #0] // uart0
- add r0, r0, #0xa8 // #0xb4 io_bank0_gpio22_ctrl
- str r2, [r0, #0] // sio
- add r0, r0, #0x10 // #0xc4 io_bank0_gpio24_ctrl
- str r2, [r0, #0] // sio
-
- // enable gpio output
- ldr r0, sio_base
- mov r1, #5
- lsl r1, r1, #22 // gpio22 and gpio24
- str r1, [r0, #0x24]
-
- // enable xosc
- ldr r0, xosc_base
- mov r1, #0xf
- lsl r1, r1, #8
- add r1, r1, #0xab
- lsl r1, r1, #8
- add r1, r1, #0xaa
- lsl r1, r1, #4
- str r1, [r0, #0] // XOSC_CTRL
-
- // set xosc delay
- mov r1, #47
- str r1, [r0, #0xc] // XOSC_STARTUP
-
- // wait for xosc startup
-xosc_stable:
- ldr r1, [r0, #0x4] // XOSC_STATUS
- lsr r1, r1, #31
- beq xosc_stable
-
- // set pll feedback divider
- ldr r0, pll_sys_base
- mov r1, #125
- str r1, [r0, #0x8] // PLL_FBDIV_INT
-
- // power on pll
- ldr r1, atomic_clr
- add r0, r0, r1
- mov r1, #33 // VCOPD | PD
- str r1, [r0, #0x4] // PLL_PWR
-
- // wait for pll locking
- ldr r0, pll_sys_base
-pll_lock:
- ldr r1, [r0, #0] // PLL_CS
- lsr r1, r1, #31
- beq pll_lock
-
- // set post dividers
- ldr r0, pll_sys_base
- ldr r1, atomic_clr
- add r0, r0, r1
- mov r1, #3
- lsl r1, r1, #4
- add r1, r1, #4
- lsl r1, r1, #12
- str r1, [r0, #0xc] // PLL_PRIM
-
- // turn on post dividers
- ldr r0, pll_sys_base
- ldr r1, atomic_clr
- add r0, r0, r1
- mov r1, #8
- str r1, [r0, #0x4] // PLL_PWR
-
- // set sys clock to pll_sys
- ldr r0, clocks_base
- mov r1, #1
- str r1, [r0, #0x3c] // CLOCKS_CLK_SYS_CTRL
- // enable clk_peri
- lsl r1, r1, #11
- str r1, [r0, #0x48]
-
- // enable clk_peri
- ldr r0, clocks_base
- mov r1, #1
- lsl r1, r1, #11
- str r1, [r0, #0x48] // CLOCKS_CLK_PERI_CTRL
-
- // enable uart0
- ldr r0, uart0_base
- ldr r1, atomic_set
- add r0, r0, r1
- mov r1, #1
- str r1, [r0, #0x30] // UART0_UARTCR
- // enable FIFO
- lsl r1, r1, #4
- str r1, [r0, #0x2c] // UART0_UARTLCR_H
- // set baud rate dividers
- mov r1, #67
- str r1, [r0, #0x24] // UART0_UARTIBRD
- mov r1, #52
- str r1, [r0, #0x28] // UART0_UARTFBRD
- // setup uart0
- mov r1, #3 // WLEN = 8
- lsl r1, r1, #5
- str r1, [r0, #0x2c] // UART0_UARTLCR_H
-
- pop {r4, r5, pc}
-
-unreset:
- // unreset subsystems specified by r0
- // args: bit mask to specify the subsystems to unreset
- // return: the bit mask same as the arg
- ldr r1, resets_base
- ldr r2, atomic_clr
- add r1, r1, r2
- str r0, [r1, #0] // RESETS_RESET
- bx lr
-
-wait_unreset:
- // wait for subsystems specified by r0 to reset done
- // args: bit mask to specify the subsystems to wait for
- // return: void
- ldr r1, resets_base
-reset_chk:
- ldr r2, [r1, #0x8] // RESETS_RESET_DONE
- and r0, r0, r2
- beq reset_chk
- bx lr
-
- .global putchar
-putchar:
-uart0_write:
- push {r4, r5, r6, r7, lr}
- mov r4, #0xFF
- and r4, r4, r0
- ldr r5, uart0_base
- mov r6, #32 // TXFF
-uart0_txff:
- ldr r7, [r5, #0x18] // UART0_UARTFR
- and r7, r7, r6
- bne uart0_txff
- str r4, [r5, #0] // UART0_UARTDR
- pop {r4, r5, r6, r7, pc}
-
- .global getchar
-getchar:
-uart0_read:
- push {r4, r5, r6, lr}
- ldr r4, uart0_base
- mov r5, #16
-uart0_rxfe:
- ldr r6, [r4, #0x18] // UART0_UARTFR
- and r6, r6, r5
- bne uart0_rxfe
- ldr r0, [r4, #0] // UART0_UARTDR
- mov r4, #0xFF
- and r0, r0, r4
- pop {r4, r5, r6, pc}
-
- .global print
- // void print(char *);
-print:
- push {r4, r5, lr}
- mov r4, r0
- mov r5, #0xFF
-print_loop:
- ldrb r1, [r4, #0]
- and r1, r1, r5
- beq print_end
- mov r0, r1
- bl uart0_write
- add r4, r4, #1
- b print_loop
-print_end:
- pop {r4, r5, pc}
-
- .global printh
- // void printh(uint32_t);
- // print in hex
-printh:
- push {r4, r5, r6, lr}
- mov r4, r0
- mov r5, #0xF
- mov r6, #28
-printh_loop:
- mov r0, r4
- lsr r0, r0, r6
- and r0, r0, r5
- cmp r0, #10
- blt printh_low
- add r0, #'A' - 10
- b printh_high
-printh_low:
- add r0, #'0'
-printh_high:
- bl putchar
- sub r6, r6, #4
- bge printh_loop
- pop {r4, r5, r6, pc}
-
-
- .global ldr
- // uint32_t ldr(uint32_t addr)
- // load content at addr
-ldr:
- ldr r0, [r0, #0]
- bx lr
-
-
-
-led_pr:
- // print register with 2 leds
- push {r0, r1, r2, r4, lr}
- mov r4, r0
- mov r1, #32
-led_pr_loop:
- mov r2, #1
- and r2, r2, r4
- beq led_pr_0
- bl led_p1
- b led_pr_1
-led_pr_0:
- bl led_p0
-led_pr_1:
- lsr r4, r4, #1
- sub r1, #1
- bne led_pr_loop
- pop {r0, r1, r2, r4, pc}
-
-led_p0:
- // blink led on gpio22
- push {r0, lr}
- mov r0, #1
- lsl r0, r0, #22
- bl led_blink
- pop {r0, pc}
-
-led_p1:
- // blink led on gpio24
- push {r0, lr}
- mov r0, #1
- lsl r0, r0, #24
- bl led_blink
- pop {r0, pc}
-
- .global led_p2
-led_p2:
- // blink led on gpio22 and gpio24
- push {r0, lr}
- mov r0, #5
- lsl r0, r0, #22
- bl led_blink
- pop {r0, pc}
-
-led_blink:
- push {r0, r4, r5, lr}
- ldr r4, sio_base
- mov r5, r0
- str r5, [r4, #0x10] // SIO_GPIO_OUT_SET
- bl delay
- str r5, [r4, #0x18] // SIO_GPIO_OUT_CLR
- bl delay
- pop {r0, r4, r5, pc}
-
- .global delay
-delay:
- push {r0}
- mov r0, #1
- lsl r0, r0, #22
-del_loop:
- sub r0, r0, #1
- bne del_loop
- pop {r0}
- bx lr
-
-// data
-
- .align 2
-atomic_set:
- .word 0x00002000
-atomic_clr:
- .word 0x00003000
-xip_ssi_base:
- .word 0x18000000
-clocks_base:
- .word 0x40008000
-resets_base:
- .word 0x4000c000
-reset_done:
- .word 0x4000c008
-io_bank0_base:
- .word 0x40014000
-xosc_base:
- .word 0x40024000
-pll_sys_base:
- .word 0x40028000
-uart0_base:
- .word 0x40034000
-rosc_base:
- .word 0x40060000
-sio_base:
- .word 0xd0000000
diff --git a/head/main.c b/head/main.c
@@ -1,29 +0,0 @@
-#include <stdint.h>
-#include <stddef.h>
-
-extern void init(void);
-extern void led_p2(void);
-extern void frerase(uint32_t, size_t);
-extern void frprog(uint32_t, uint8_t *, size_t);
-extern uint32_t ldr(uint32_t);
-extern void printh(uint32_t);
-extern void putchar(char);
-
-int
-main(void)
-{
- uint32_t ofs = 4 * 1024;
- size_t size = 4 * 1024;
- size_t count = 256;
- uint8_t data[count];
- for (int i = 0; i < count; i++)
- data[i] = 0xde;
- init();
- frerase(ofs, size);
- frprog(ofs, data, count);
- printh(ldr(0x10001000));
- putchar('\n');
- while(1) {
- led_p2();
- }
-}
diff --git a/head/mc.s b/head/mc.s
@@ -1,89 +0,0 @@
- .global mcfork // int mcfork(void)
-mcfork:
- push {r4, lr}
- ldr r0, =0x20000800
- mov r1, lr
- str r1, [r0, #0]
-mcfork_retry:
- bl mc_fifo_drain
- mov r0, #0
- bl mc_fifo_send
- bl mc_fifo_recv
- cmp r0, #0
- bne mcfork_retry
-
- bl mc_fifo_drain
- mov r0, #0
- bl mc_fifo_send
- bl mc_fifo_recv
- cmp r0, #0
- bne mcfork_retry
-
- mov r0, #1
- bl mc_fifo_send
- bl mc_fifo_recv
- cmp r0, #1
- bne mcfork_retry
-
- ldr r0, =0x10000100 // __vectors
- mov r4, r0
- bl mc_fifo_send
- bl mc_fifo_recv
- cmp r0, r4
- bne mcfork_retry
-
- ldr r0, =0x200007fc // initial sp
- mov r4, r0
- bl mc_fifo_send
- bl mc_fifo_recv
- cmp r0, r4
- bne mcfork_retry
-
- adr r0, mcfork_ent
- add r0, r0, #1 // thumb mode
- mov r4, r0
- bl mc_fifo_send
- bl mc_fifo_recv
- cmp r0, r4
- bne mcfork_retry
- .align 2
-mcfork_ent: // this part doesn't work for cpu1
- ldr r0, sio_base
- ldr r0, [r0, #0]
- pop {r4, pc}
-
-mc_fifo_drain:
- ldr r0, sio_base
-mc_fifo_not_empty:
- ldr r1, [r0, #0x50] // SIO_FIFO_ST
- mov r2, #1
- and r1, r2
- beq mc_fifo_empty
- ldr r3, [r0, #0x58] // SIO_FIFO_RD
- b mc_fifo_not_empty
-mc_fifo_empty:
- sev
- bx lr
-
-mc_fifo_send:
- ldr r1, sio_base
-mc_fifo_full:
- ldr r2, [r1, #0x50] // SIO_FIFO_ST
- mov r3, #2
- and r2, r3
- beq mc_fifo_full
- str r0, [r1, #0x54] // SIO_FIFO_WR
- sev
- bx lr
-
-mc_fifo_recv:
- ldr r1, sio_base
- ldr r2, [r1, #0x50] // SIO_FIFO_ST
- mov r3, #1
- and r2, r3
- bne mc_fifo_redy
- wfe
-mc_fifo_redy:
- ldr r0, [r1, #0x58] // SIO_FIFO_RD
- bx lr
-
diff --git a/head/memmap.ld b/head/memmap.ld
@@ -1,20 +0,0 @@
-MEMORY
-{
- FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 2048k
- SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 264k
-}
-
-SECTIONS
-{
- .boot2 : {
- *(.boot2)
- . = 0x100;
- } > FLASH
-
- .text : AT(ORIGIN(FLASH) + 0x100){
- *(.vectors)
- *(.text)
- _etext = .;
- } > SRAM
-}
-