Suga koubou
/
DynamicLoad
dynamic load and run users binary file. self write the flash memory.
main.cpp@2:c56b5e682f0c, 2011-12-27 (annotated)
- Committer:
- okini3939
- Date:
- Tue Dec 27 16:57:59 2011 +0000
- Revision:
- 2:c56b5e682f0c
- Parent:
- 1:fbb938b95cef
- Child:
- 3:5cf31386b95d
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:f8cf4fdf6ab4 | 1 | /* |
okini3939 | 0:f8cf4fdf6ab4 | 2 | dynamic load the binary file. |
okini3939 | 2:c56b5e682f0c | 3 | binary -> Flash 0x00040000 & run |
okini3939 | 0:f8cf4fdf6ab4 | 4 | |
okini3939 | 0:f8cf4fdf6ab4 | 5 | lpc17xx.ld |
okini3939 | 1:fbb938b95cef | 6 | IROM (rx) : ORIGIN = 0x00040000, LENGTH = 256k |
okini3939 | 0:f8cf4fdf6ab4 | 7 | IRAM0 (rwx) : ORIGIN = 0x10002000, LENGTH = 24k |
okini3939 | 0:f8cf4fdf6ab4 | 8 | |
okini3939 | 0:f8cf4fdf6ab4 | 9 | startup_LPC17xx.c |
okini3939 | 0:f8cf4fdf6ab4 | 10 | //void Reset_Handler(void) __attribute__((__interrupt__)); |
okini3939 | 0:f8cf4fdf6ab4 | 11 | void Reset_Handler(void); |
okini3939 | 1:fbb938b95cef | 12 | // SystemInit(); |
okini3939 | 0:f8cf4fdf6ab4 | 13 | |
okini3939 | 0:f8cf4fdf6ab4 | 14 | compiled.bin --> test.dat |
okini3939 | 0:f8cf4fdf6ab4 | 15 | */ |
okini3939 | 1:fbb938b95cef | 16 | #include "mbed.h" |
okini3939 | 1:fbb938b95cef | 17 | #include "IAP.h" |
okini3939 | 0:f8cf4fdf6ab4 | 18 | #include <new> |
okini3939 | 0:f8cf4fdf6ab4 | 19 | |
okini3939 | 1:fbb938b95cef | 20 | #define BUF_SIZE 512 |
okini3939 | 1:fbb938b95cef | 21 | #define TARGET_SECTOR 22 |
okini3939 | 1:fbb938b95cef | 22 | #define TARGET_SECTOR_NUM 8 |
okini3939 | 0:f8cf4fdf6ab4 | 23 | |
okini3939 | 0:f8cf4fdf6ab4 | 24 | LocalFileSystem local("local"); |
okini3939 | 0:f8cf4fdf6ab4 | 25 | |
okini3939 | 0:f8cf4fdf6ab4 | 26 | void memdump( char *p, int n ); |
okini3939 | 0:f8cf4fdf6ab4 | 27 | |
okini3939 | 0:f8cf4fdf6ab4 | 28 | IAP iap; |
okini3939 | 0:f8cf4fdf6ab4 | 29 | |
okini3939 | 0:f8cf4fdf6ab4 | 30 | extern "C" |
okini3939 | 0:f8cf4fdf6ab4 | 31 | void HardFault_Handler() { |
okini3939 | 1:fbb938b95cef | 32 | register unsigned int _msp __asm("msp"); |
okini3939 | 1:fbb938b95cef | 33 | printf("Hard Fault! %x (%x)\r\n", SCB->HFSR, *((unsigned int *)(_msp + 24))); |
okini3939 | 1:fbb938b95cef | 34 | printf(" - %x\r\n", (*(volatile uint32_t*)0xe000ed24)); |
okini3939 | 1:fbb938b95cef | 35 | // printf("Hard Fault! %x\r\n", SCB->HFSR); |
okini3939 | 0:f8cf4fdf6ab4 | 36 | exit(-1); |
okini3939 | 0:f8cf4fdf6ab4 | 37 | } |
okini3939 | 0:f8cf4fdf6ab4 | 38 | |
okini3939 | 0:f8cf4fdf6ab4 | 39 | void no_memory () { |
okini3939 | 0:f8cf4fdf6ab4 | 40 | printf("panic: can't allocate to memory!\r\n"); |
okini3939 | 0:f8cf4fdf6ab4 | 41 | exit(-1); |
okini3939 | 0:f8cf4fdf6ab4 | 42 | } |
okini3939 | 0:f8cf4fdf6ab4 | 43 | |
okini3939 | 1:fbb938b95cef | 44 | void jump (int vect) { |
okini3939 | 0:f8cf4fdf6ab4 | 45 | void (*func)(); |
okini3939 | 0:f8cf4fdf6ab4 | 46 | unsigned int *p; |
okini3939 | 0:f8cf4fdf6ab4 | 47 | |
okini3939 | 1:fbb938b95cef | 48 | p = (unsigned int *)(sector_start_adress[TARGET_SECTOR] + 4 * vect); |
okini3939 | 0:f8cf4fdf6ab4 | 49 | func = (void (*)())*p; |
okini3939 | 1:fbb938b95cef | 50 | // printf("jump vector %d (%08x)\r\n", vect, func); |
okini3939 | 1:fbb938b95cef | 51 | if ((char*)*p >= sector_start_adress[TARGET_SECTOR] && (char*)*p < sector_start_adress[TARGET_SECTOR] + FLASH_SECTOR_SIZE_16_TO_29 * TARGET_SECTOR_NUM) { |
okini3939 | 1:fbb938b95cef | 52 | func(); |
okini3939 | 1:fbb938b95cef | 53 | } |
okini3939 | 0:f8cf4fdf6ab4 | 54 | } |
okini3939 | 0:f8cf4fdf6ab4 | 55 | |
okini3939 | 1:fbb938b95cef | 56 | int loadbinary (char *filename) { |
okini3939 | 1:fbb938b95cef | 57 | int i, r, num, sector, size = 0; |
okini3939 | 1:fbb938b95cef | 58 | FILE *fp; |
okini3939 | 1:fbb938b95cef | 59 | char buf[BUF_SIZE]; |
okini3939 | 1:fbb938b95cef | 60 | |
okini3939 | 1:fbb938b95cef | 61 | fp = fopen(filename, "r"); |
okini3939 | 1:fbb938b95cef | 62 | if (! fp) return -1; |
okini3939 | 1:fbb938b95cef | 63 | |
okini3939 | 1:fbb938b95cef | 64 | for (sector = TARGET_SECTOR; sector < TARGET_SECTOR + TARGET_SECTOR_NUM; sector ++) { |
okini3939 | 1:fbb938b95cef | 65 | if (iap.blank_check(sector, sector) == SECTOR_NOT_BLANK) { |
okini3939 | 1:fbb938b95cef | 66 | iap.prepare(sector, sector); |
okini3939 | 1:fbb938b95cef | 67 | r = iap.erase(sector, sector); |
okini3939 | 1:fbb938b95cef | 68 | if (r) { |
okini3939 | 1:fbb938b95cef | 69 | printf("iap.erase (%d) %d %x\r\n", r, sector, i); |
okini3939 | 1:fbb938b95cef | 70 | goto error; |
okini3939 | 1:fbb938b95cef | 71 | } |
okini3939 | 1:fbb938b95cef | 72 | printf("iap erase %d\r\n", sector); |
okini3939 | 1:fbb938b95cef | 73 | } |
okini3939 | 1:fbb938b95cef | 74 | |
okini3939 | 1:fbb938b95cef | 75 | for (i = 0; i < FLASH_SECTOR_SIZE_16_TO_29; i += BUF_SIZE) { |
okini3939 | 1:fbb938b95cef | 76 | num = fread(buf, sizeof(char), BUF_SIZE, fp); |
okini3939 | 1:fbb938b95cef | 77 | if (num <= 0) { |
okini3939 | 1:fbb938b95cef | 78 | // EOF |
okini3939 | 1:fbb938b95cef | 79 | goto exit; |
okini3939 | 1:fbb938b95cef | 80 | } |
okini3939 | 1:fbb938b95cef | 81 | |
okini3939 | 1:fbb938b95cef | 82 | // write Flash |
okini3939 | 1:fbb938b95cef | 83 | r = iap.prepare(sector, sector); |
okini3939 | 1:fbb938b95cef | 84 | if (r) { |
okini3939 | 1:fbb938b95cef | 85 | printf("iap.prepare (%d) %d %x\r\n", r, sector, i); |
okini3939 | 1:fbb938b95cef | 86 | goto error; |
okini3939 | 1:fbb938b95cef | 87 | } |
okini3939 | 1:fbb938b95cef | 88 | r = iap.write(buf, sector_start_adress[sector] + i, BUF_SIZE); |
okini3939 | 1:fbb938b95cef | 89 | if (r) { |
okini3939 | 1:fbb938b95cef | 90 | printf("iap.write (%d) %d %x\r\n", r, sector, i); |
okini3939 | 1:fbb938b95cef | 91 | goto error; |
okini3939 | 1:fbb938b95cef | 92 | } |
okini3939 | 1:fbb938b95cef | 93 | r = iap.compare(buf, sector_start_adress[sector] + i, BUF_SIZE); |
okini3939 | 1:fbb938b95cef | 94 | if (r) { |
okini3939 | 1:fbb938b95cef | 95 | printf("iap.compare (%d) %d %x\r\n", r, sector, i); |
okini3939 | 1:fbb938b95cef | 96 | goto error; |
okini3939 | 1:fbb938b95cef | 97 | } |
okini3939 | 1:fbb938b95cef | 98 | size += num; |
okini3939 | 1:fbb938b95cef | 99 | } |
okini3939 | 1:fbb938b95cef | 100 | } |
okini3939 | 1:fbb938b95cef | 101 | |
okini3939 | 1:fbb938b95cef | 102 | exit: |
okini3939 | 1:fbb938b95cef | 103 | printf("write %d bytes, end sector %d\r\n", size, sector); |
okini3939 | 1:fbb938b95cef | 104 | fclose(fp); |
okini3939 | 1:fbb938b95cef | 105 | return 0; |
okini3939 | 1:fbb938b95cef | 106 | |
okini3939 | 1:fbb938b95cef | 107 | error: |
okini3939 | 1:fbb938b95cef | 108 | printf("write error\r\n"); |
okini3939 | 1:fbb938b95cef | 109 | fclose(fp); |
okini3939 | 1:fbb938b95cef | 110 | return r; |
okini3939 | 0:f8cf4fdf6ab4 | 111 | } |
okini3939 | 0:f8cf4fdf6ab4 | 112 | |
okini3939 | 0:f8cf4fdf6ab4 | 113 | int main() { |
okini3939 | 0:f8cf4fdf6ab4 | 114 | char *heap; |
okini3939 | 0:f8cf4fdf6ab4 | 115 | |
okini3939 | 0:f8cf4fdf6ab4 | 116 | set_new_handler(no_memory); // new handler function |
okini3939 | 0:f8cf4fdf6ab4 | 117 | |
okini3939 | 0:f8cf4fdf6ab4 | 118 | printf( "device-ID = 0x%08X, serial# = 0x%08X, CPU running %dkHz\r\n", iap.read_ID(), iap.read_serial(), SystemCoreClock / 1000 ); |
okini3939 | 0:f8cf4fdf6ab4 | 119 | |
okini3939 | 1:fbb938b95cef | 120 | loadbinary("/local/test.dat"); |
okini3939 | 0:f8cf4fdf6ab4 | 121 | |
okini3939 | 1:fbb938b95cef | 122 | // memdump( sector_start_adress[ TARGET_SECTOR ], 48 * 4); |
okini3939 | 0:f8cf4fdf6ab4 | 123 | |
okini3939 | 1:fbb938b95cef | 124 | heap = new char(2); |
okini3939 | 1:fbb938b95cef | 125 | delete[] heap; |
okini3939 | 0:f8cf4fdf6ab4 | 126 | printf("stack %08x, heap %08x\r\n", (unsigned int)&heap, (unsigned int)heap); |
okini3939 | 0:f8cf4fdf6ab4 | 127 | |
okini3939 | 0:f8cf4fdf6ab4 | 128 | { |
okini3939 | 0:f8cf4fdf6ab4 | 129 | register unsigned int _control __asm("control"); |
okini3939 | 0:f8cf4fdf6ab4 | 130 | register unsigned int _msp __asm("msp"); |
okini3939 | 0:f8cf4fdf6ab4 | 131 | register unsigned int _psp __asm("psp"); |
okini3939 | 0:f8cf4fdf6ab4 | 132 | printf("MSP %08x, PSP %08x, CONTROL %x\r\n", _msp, _psp, _control & 3); |
okini3939 | 0:f8cf4fdf6ab4 | 133 | } |
okini3939 | 0:f8cf4fdf6ab4 | 134 | |
okini3939 | 0:f8cf4fdf6ab4 | 135 | jump(1); |
okini3939 | 0:f8cf4fdf6ab4 | 136 | |
okini3939 | 0:f8cf4fdf6ab4 | 137 | printf("exit\r\n"); |
okini3939 | 1:fbb938b95cef | 138 | |
okini3939 | 1:fbb938b95cef | 139 | heap = new char(2); |
okini3939 | 1:fbb938b95cef | 140 | delete[] heap; |
okini3939 | 1:fbb938b95cef | 141 | printf("stack %08x, heap %08x\r\n", (unsigned int)&heap, (unsigned int)heap); |
okini3939 | 1:fbb938b95cef | 142 | |
okini3939 | 0:f8cf4fdf6ab4 | 143 | return 0; |
okini3939 | 0:f8cf4fdf6ab4 | 144 | } |
okini3939 | 0:f8cf4fdf6ab4 | 145 | |
okini3939 | 0:f8cf4fdf6ab4 | 146 | |
okini3939 | 0:f8cf4fdf6ab4 | 147 | void memdump( char *base, int n ) { |
okini3939 | 0:f8cf4fdf6ab4 | 148 | unsigned int *p; |
okini3939 | 0:f8cf4fdf6ab4 | 149 | |
okini3939 | 0:f8cf4fdf6ab4 | 150 | printf( " memdump from 0x%08X for %d bytes", (unsigned long)base, n ); |
okini3939 | 0:f8cf4fdf6ab4 | 151 | |
okini3939 | 0:f8cf4fdf6ab4 | 152 | p = (unsigned int *)((unsigned int)base & ~(unsigned int)0x3); |
okini3939 | 0:f8cf4fdf6ab4 | 153 | |
okini3939 | 0:f8cf4fdf6ab4 | 154 | for ( int i = 0; i < (n >> 2); i++, p++ ) { |
okini3939 | 0:f8cf4fdf6ab4 | 155 | if ( !(i % 4) ) |
okini3939 | 0:f8cf4fdf6ab4 | 156 | printf( "\r\n 0x%08X :", (unsigned int)p ); |
okini3939 | 0:f8cf4fdf6ab4 | 157 | |
okini3939 | 0:f8cf4fdf6ab4 | 158 | printf( " %08X", *p ); |
okini3939 | 0:f8cf4fdf6ab4 | 159 | } |
okini3939 | 0:f8cf4fdf6ab4 | 160 | |
okini3939 | 0:f8cf4fdf6ab4 | 161 | printf( "\r\n" ); |
okini3939 | 0:f8cf4fdf6ab4 | 162 | } |