rp2040

RP2040 Programming without SDK
Log | Files | Refs

flash.s (2364B)


      1 .cpu cortex-m0plus
      2 .thumb
      3 
      4 	.section .text
      5 	.global frerase
      6 	// void frerase(uint32_t ofs, size_t size);
      7 	// erase the region of flash starting at ofs and size bytes long in size.
      8 	// ofs must be aligned in 4K and size must be multiple of 4K
      9 frerase:
     10 	push {r4, r5, r6, r7, lr}
     11 
     12 	ldr r4, rom_base
     13 	mov r5, r0
     14 	mov r6, r1
     15 
     16 	ldrh r0, [r4, #0x14] // rom_func_table
     17 	ldr r1, =('I' | 'F' << 8) // _connect_internal_flash()
     18 	ldrh r2, [r4, #0x18] // rom_table_lookup
     19 	blx r2
     20 	blx r0
     21 
     22 	ldrh r0, [r4, #0x14] // rom_func_table
     23 	ldr r1, =('E' | 'X' << 8) // _flash_exit_xip()
     24 	ldrh r2, [r4, #0x18] // rom_table_lookup
     25 	blx r2
     26 	blx r0
     27 
     28 	ldrh r0, [r4, #0x14] // rom_func_table
     29 	ldr r1, =('R' | 'E' << 8) // _flash_range_erase()
     30 	ldrh r2, [r4, #0x18] // rom_table_lookup
     31 	blx r2
     32 	mov r7, r0
     33 	mov r0, r5
     34 	mov r1, r6
     35 	mov r2, #1
     36 	lsl r2, r2, #16 // 64K
     37 	mov r3, #0xd8   // block erase
     38 	blx r7
     39 
     40 	ldrh r0, [r4, #0x14] // rom_func_table
     41 	ldr r1, =('F' | 'C' << 8) // _flash_flush_cache()
     42 	ldrh r2, [r4, #0x18] // rom_table_lookup
     43 	blx r2
     44 	blx r0
     45 
     46 	ldrh r0, [r4, #0x14] // rom_func_table
     47 	ldr r1, =('C' | 'X' << 8) // _flash_enter_cmd_xip()
     48 	ldrh r2, [r4, #0x18] // rom_table_lookup
     49 	blx r2
     50 	blx r0
     51 
     52 	pop {r4, r5, r6, r7, pc}
     53 
     54 	.global frprog
     55 	// void frprog(uint32_t ofs, uint8_t *data, size_t count);
     56 	// ofs must be aligned in 256 and data must be multiple of 256
     57 frprog:
     58 	push {r4, r5, r6,r7, lr}
     59 
     60 	ldr r4, rom_base
     61 	mov r5, r0
     62 	mov r6, r1
     63 	mov r7, r2
     64 
     65 	ldrh r0, [r4, #0x14] // rom_func_table
     66 	ldr r1, =('I' | 'F' << 8) // _connect_internal_flash()
     67 	ldrh r2, [r4, #0x18] // rom_table_lookup
     68 	blx r2
     69 	blx r0
     70 
     71 	ldrh r0, [r4, #0x14] // rom_func_table
     72 	ldr r1, =('E' | 'X' << 8) // _flash_exit_xip()
     73 	ldrh r2, [r4, #0x18] // rom_table_lookup
     74 	blx r2
     75 	blx r0
     76 
     77 	ldrh r0, [r4, #0x14] // rom_func_table
     78 	ldr r1, =('R' | 'P' << 8) // _flash_range_program()
     79 	ldrh r2, [r4, #0x18] // rom_table_lookup
     80 	blx r2
     81 	mov r3, r0
     82 	mov r0, r5
     83 	mov r1, r6
     84 	mov r2, r7
     85 	blx r3
     86 
     87 	ldrh r0, [r4, #0x14] // rom_func_table
     88 	ldr r1, =('F' | 'C' << 8) // _flash_flush_cache()
     89 	ldrh r2, [r4, #0x18] // rom_table_lookup
     90 	blx r2
     91 	blx r0
     92 
     93 	ldrh r0, [r4, #0x14] // rom_func_table
     94 	ldr r1, =('C' | 'X' << 8) // _flash_enter_cmd_xip()
     95 	ldrh r2, [r4, #0x18] // rom_table_lookup
     96 	blx r2
     97 	blx r0
     98 
     99 	pop {r4, r5, r6, r7, pc}
    100 
    101 	.align 2
    102 rom_base:
    103 	.word 0x00000000
    104 xip_base:
    105 	.word 0x10000000
    106 sram_base:
    107 	.word 0x20000000
    108