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