diff options
Diffstat (limited to 'hexedit')
| -rw-r--r-- | hexedit/Makefile | 17 | ||||
| -rw-r--r-- | hexedit/clocks.s | 31 | ||||
| -rw-r--r-- | hexedit/gpio.s | 23 | ||||
| -rw-r--r-- | hexedit/hexedit.s | 25 | ||||
| -rw-r--r-- | hexedit/main.s | 16 | ||||
| -rw-r--r-- | hexedit/pico_ram_only.ld | 13 | ||||
| -rw-r--r-- | hexedit/uart.s | 116 | ||||
| -rw-r--r-- | hexedit/xosc.s | 23 | 
8 files changed, 264 insertions, 0 deletions
| diff --git a/hexedit/Makefile b/hexedit/Makefile new file mode 100644 index 0000000..95f49ae --- /dev/null +++ b/hexedit/Makefile @@ -0,0 +1,17 @@ +all: build + +build: echo.uf2 + +echo.uf2: echo.elf +	../elf/elf2uf2 echo.elf echo.uf2 + +objects = main.o xosc.o clocks.o gpio.o uart.o + +echo.elf: $(objects) +	arm-none-eabi-ld -T pico_ram_only.ld -o echo.elf $(objects) + +$(objects): %.o: %.s +	arm-none-eabi-as -o $@ $< + +clean: +	rm echo.elf echo.uf2 *.o diff --git a/hexedit/clocks.s b/hexedit/clocks.s new file mode 100644 index 0000000..83bc9ff --- /dev/null +++ b/hexedit/clocks.s @@ -0,0 +1,31 @@ +.syntax unified +.cpu cortex-m0plus +.thumb + +.equ CLOCKS_BASE, 0x40008000 +.equ CLK_REF_CTRL_OFST,  0x30 +.equ CLK_SYS_CTRL_OFST,  0x3c +.equ CLK_PERI_CTRL_OFST, 0x48 + +.type setup_clocks, %function +.global setup_clocks + +setup_clocks: + +  ldr r1, =CLOCKS_BASE + +  // Reference clock +  movs r0, 0x2 // src = xosc +  str r0, [r1, CLK_REF_CTRL_OFST] + +  // System clock +  movs r0, 0x0 // src = clk_ref +  str r0, [r1, CLK_SYS_CTRL_OFST] + +  // Peripheral clock +  movs r0, 1 // set enable +  lsls r0, 11 +  adds r0, 0x4 << 5 // src = xosc +  str r0, [r1, CLK_PERI_CTRL_OFST] + +  bx lr diff --git a/hexedit/gpio.s b/hexedit/gpio.s new file mode 100644 index 0000000..32e2c37 --- /dev/null +++ b/hexedit/gpio.s @@ -0,0 +1,23 @@ +.syntax unified +.cpu cortex-m0plus +.thumb + +.equ RESETS_BASE, 0x4000c000 +.equ RESET_OFST,      0x0 +.equ RESET_DONE_OFST, 0x8 + +.equ ATOMIC_CLEAR,    0x3000 + +.type setup_gpio, %function +.global setup_gpio + +setup_gpio: +  ldr r1, =(RESETS_BASE + ATOMIC_CLEAR) +  movs r0, 0b1 << 5 // IO_BANK0 +  str r0, [r1, RESET_OFST] +  ldr r1, =RESETS_BASE +1: +  ldr r2, [r1, RESET_DONE_OFST] +  tst r2, r0 +  beq 1b +  bx lr diff --git a/hexedit/hexedit.s b/hexedit/hexedit.s new file mode 100644 index 0000000..0bc03a9 --- /dev/null +++ b/hexedit/hexedit.s @@ -0,0 +1,25 @@ +.syntax unified +.cpu cortex-m0plus +.thumb + +.type hexedit, %function +.global hexedit + +hexedit: +  ldr r2, =0x20000100 +  movs r1, 0 +getchar: +  bl uart_recv +  cmp r0, 'g +  beq stop +  subs r0, '0 // The ASCII char '0' +  bmi next +  lsls r1, 4 +  adds r1, r0 +  b getchar +next: +  ldr r0, [r2, 0] +  adds r2, 4 +  b hexedit +stop: +  b 0x20000100 diff --git a/hexedit/main.s b/hexedit/main.s new file mode 100644 index 0000000..5e294d4 --- /dev/null +++ b/hexedit/main.s @@ -0,0 +1,16 @@ +.syntax unified +.cpu cortex-m0plus +.thumb + +.type main, %function +.global main + +main: +  bl start_xosc +  bl setup_clocks +  bl setup_gpio +  bl setup_uart +1: +  bl uart_recv +  bl uart_send +  b 1b diff --git a/hexedit/pico_ram_only.ld b/hexedit/pico_ram_only.ld new file mode 100644 index 0000000..eb2450e --- /dev/null +++ b/hexedit/pico_ram_only.ld @@ -0,0 +1,13 @@ +ENTRY(main) + +MEMORY { +  FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 2M +  SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 264K +} + +SECTIONS { +  .text : { +    *(.text) +    . = ALIGN(4); +  } > SRAM +} diff --git a/hexedit/uart.s b/hexedit/uart.s new file mode 100644 index 0000000..9804e53 --- /dev/null +++ b/hexedit/uart.s @@ -0,0 +1,116 @@ +.syntax unified +.cpu cortex-m0plus +.thumb + +.equ RESETS_BASE, 0x4000c000 +.equ RESET_OFST,      0x0 +.equ RESET_DONE_OFST, 0x8 + +.equ IO_BANK0_BASE, 0x40014000 +.equ GPIO0_CTRL_OFST, 0x04 +.equ GPIO1_CTRL_OFST, 0x0c + +.equ UART0_BASE, 0x40034000 +.equ UARTDR_OFST,     0x00 +.equ UARTFR_OFST,     0x18 +.equ UARTIBRD_OFST,   0x24 +.equ UARTFBRD_OFST,   0x28 +.equ UARTLCR_H_OFST,  0x2c +.equ UARTCR_OFST,     0x30 + +.equ ATOMIC_SET,    0x2000 +.equ ATOMIC_CLEAR,  0x3000 + +.type setup_uart, %function +.global setup_uart + +setup_uart: + +  // Deassert reset +  ldr r1, =(RESETS_BASE + ATOMIC_CLEAR) +  movs r0, 0b1 // UART0 +  lsls r0, 22 +  str r0, [r1, RESET_OFST] +  ldr r1, =RESETS_BASE +1: +  ldr r2, [r1, RESET_DONE_OFST] +  tst r2, r0 +  beq 1b + +  // Configure and enable +  ldr r1, =UART0_BASE +  movs r0, 6 +  str r0, [r1, UARTIBRD_OFST] +  movs r0, 33 +  str r0, [r1, UARTFBRD_OFST] +  movs r0, 0b111 << 4 // 0b11 = word len 8 bits, 0b1 = FIFO enabled +  str r0, [r1, UARTLCR_H_OFST] +  ldr r1, =(UART0_BASE + ATOMIC_SET) +  movs r0, 0b1 // UART enable +  str r0, [r1, UARTCR_OFST] + +  // Configure GPIO 0 and 1 as TX and RX +  ldr r1, =IO_BANK0_BASE +  movs r0, 2 // UART function +  str r0, [r1, GPIO0_CTRL_OFST] +  str r0, [r1, GPIO1_CTRL_OFST] + +  bx lr + +.type uart_send, %function +.global uart_send + +uart_send: +  ldr r1, =UART0_BASE +  movs r3, 0b1 << 5 // TX FIFO full +1: +  ldr r2, [r1, UARTFR_OFST] +  tst r2, r3 +  bne 1b +  strb r0, [r1, UARTDR_OFST] +  bx lr + +.type uart_recv, %function +.global uart_recv + +uart_recv: +  ldr r1, =UART0_BASE +  movs r3, 0b1 << 4 // RX FIFO empty +1: +  ldr r2, [r1, UARTFR_OFST] +  tst r2, r3 +  bne 1b +  ldrb r0, [r1, UARTDR_OFST] +  bx lr + +.type send_hex, %function +.global send_hex + +send_hex: +  push {lr} +  movs r4, r0 +  movs r0, '0 +  bl uart_send +  movs r0, 'x +  bl uart_send +  movs r5, 8 // eight nibbles in a word +0: +  movs r0, 28 // rotate left 4 +  rors r4, r0 +  movs r0, 0xF // lowest nibble mask +  ands r0, r4 +  cmp r0, 0x9 // number or letter? +  bhi 1f +  adds r0, '0 +  b 2f +1: +  adds r0, 'A - 0xA +2: +  bl uart_send +  subs r5, 1 +  bne 0b +  movs r0, '\r +  bl uart_send +  movs r0, '\n +  bl uart_send +  pop {pc} diff --git a/hexedit/xosc.s b/hexedit/xosc.s new file mode 100644 index 0000000..63760da --- /dev/null +++ b/hexedit/xosc.s @@ -0,0 +1,23 @@ +.syntax unified +.cpu cortex-m0plus +.thumb + +.equ XOSC_BASE, 0x40024000 +.equ CTRL_OFST, 0x0 +.equ STATUS_OFST, 0x4 +.equ STARTUP_OFST, 0xc + +.type start_xosc, %function +.global start_xosc + +start_xosc: +  ldr r1, =XOSC_BASE +  movs r0, 47 // startup delay for 12Mhz crystal +  str r0, [r1, STARTUP_OFST] +  ldr r0, =0x00fabaa0 // enable +  str r0, [r1, CTRL_OFST] +1: +  ldr r0, [r1, STATUS_OFST] +  lsrs r0, 31 // stable bit +  beq 1b +  bx lr | 
