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:
M | Makefile | | | 5 | ++--- |
A | flash.s | | | 83 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
M | mach.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: