rp2040

RP2040 Programming without SDK
Log | Files | Refs

commit db4adbf4153bb9ca97e14da193171b999b4bd9d1
parent 6e0e105d09cf12db227f7df63dc5965be158c5d5
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Tue, 18 Apr 2023 10:19:28 +0900

divide flash operations to a different file

Diffstat:
MMakefile | 5++---
Aflash.s | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mmach.s | 76----------------------------------------------------------------------------
3 files changed, 85 insertions(+), 79 deletions(-)

diff --git a/Makefile b/Makefile @@ -5,7 +5,6 @@ OBJCOPY = arm-none-eabi-objcopy ELF2UF2 = ../pico-sdk/build/elf2uf2/elf2uf2 MCPU = -mcpu=cortex-m0plus - ASFLAGS = $(MCPU) CFLAGS = $(MCPU) -ffreestanding -nostartfiles -O0 -fpic -mthumb -c LDFLAGS = --no-relax -nostdlib @@ -21,8 +20,8 @@ clean: .s.o: $(AS) $(ASFLAGS) -o $@ $< -led.elf: boot2.o main.o mach.o memmap.ld - $(LD) $(LDFLAGS) -o $@ -T memmap.ld boot2.o mach.o main.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 $@ diff --git a/flash.s b/flash.s @@ -0,0 +1,83 @@ +.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, lr} + + ldr r4, rom_base + + 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 r5, r0 + mov r0, #0 + mov r1, #1 + lsl r1, r1, #12 + lsl r2, r1, #4 + mov r3, #0xd8 + blx r5 + + 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, =('R' | 'P' << 8) // _flash_enter_cmd_xip() + ldrh r2, [r4, #0x18] // rom_table_lookup + blx r2 + mov r3, r0 + mov r0, #0 + ldr r1, sram_base + mov r2, #1 + lsl r2, r2, #12 + add r1, r1, r2 + ldr r2, =0xdeadbeef + str r2, [r1, #0] + mov r2, #1 + lsl r2, r2, #8 + 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 + + ldr r3, xip_base + ldr r0, [r3, #0] + bl printh + + .align 2 +rom_base: + .word 0x00000000 +xip_base: + .word 0x10000000 +sram_base: + .word 0x20000000 + diff --git a/mach.s b/mach.s @@ -134,76 +134,6 @@ pll_lock: lsl r1, r1, #5 str r1, [r0, #0x2c] // UART0_UARTLCR_H -/* -flash_operation: - ldr r3, xip_base - ldr r0, [r3, #0] - bl printh - - ldr r4, rom_base - - 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 r5, r0 - mov r0, #0 - mov r1, #1 - lsl r1, r1, #12 - lsl r2, r1, #4 - mov r3, #0xd8 - blx r5 - - 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, =('R' | 'P' << 8) // _flash_enter_cmd_xip() - ldrh r2, [r4, #0x18] // rom_table_lookup - blx r2 - mov r3, r0 - mov r0, #0 - ldr r1, sram_base - mov r2, #1 - lsl r2, r2, #12 - add r1, r1, r2 - ldr r2, =0xdeadbeef - str r2, [r1, #0] - mov r2, #1 - lsl r2, r2, #8 - 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 - - ldr r3, xip_base - ldr r0, [r3, #0] - bl printh -*/ pop {r4, r5, pc} unreset: @@ -370,14 +300,8 @@ atomic_set: .word 0x00002000 atomic_clr: .word 0x00003000 -rom_base: - .word 0x00000000 -xip_base: - .word 0x10000000 xip_ssi_base: .word 0x18000000 -sram_base: - .word 0x20000000 clocks_base: .word 0x40008000 resets_base: