Suga koubou
/
DynamicLoad
dynamic load and run users binary file. self write the flash memory.
Diff: main.cpp
- Revision:
- 0:f8cf4fdf6ab4
- Child:
- 1:fbb938b95cef
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Dec 26 15:42:50 2011 +0000 @@ -0,0 +1,133 @@ +/* + dynamic load the binary file. + binary -> Flash 0x00078000 & run + + lpc17xx.ld + IROM (rx) : ORIGIN = 0x00078000, LENGTH = 32k + IRAM0 (rwx) : ORIGIN = 0x10002000, LENGTH = 24k + + startup_LPC17xx.c + //void Reset_Handler(void) __attribute__((__interrupt__)); + void Reset_Handler(void); + + compiled.bin --> test.dat +*/ +#include "mbed.h" +#include "IAP.h" +#include <new> + +#define MEM_SIZE 256 +#define TARGET_SECTOR 29 + +LocalFileSystem local("local"); + +void memdump( char *p, int n ); +int isprint( int c ); + +IAP iap; + +extern "C" +void Default_Handler() { + printf("Default Handler!\n"); + exit(-1); +} + +extern "C" +void HardFault_Handler() { + printf("Hard Fault!\n"); + exit(-1); +} + +void no_memory () { + printf("panic: can't allocate to memory!\r\n"); + exit(-1); +} + +int jump (int vect) { + void (*func)(); + unsigned int *p; + + p = (unsigned int *)(sector_start_adress[ TARGET_SECTOR ] + 4 * vect); + func = (void (*)())*p; + printf( "func %08x (%d)\r\n", (unsigned int)func, vect); + func(); + return 0; +} + +void SysTick_Handler(void) { + jump(15); +} + +int main() { + FILE *fp; + int i, r, s; + char buf[MEM_SIZE]; + char *heap; + + set_new_handler(no_memory); // new handler function + + printf( "device-ID = 0x%08X, serial# = 0x%08X, CPU running %dkHz\r\n", iap.read_ID(), iap.read_serial(), SystemCoreClock / 1000 ); + printf( "user reserved flash area: start_address=0x%08X, size=%d bytes\r\n", iap.reserved_flash_area_start(), iap.reserved_flash_area_size() ); + + r = iap.blank_check( TARGET_SECTOR, TARGET_SECTOR ); + printf( "blank check result = 0x%08X\r\n", r ); + + // erase sector, if required + + if ( r == SECTOR_NOT_BLANK ) { + iap.prepare( TARGET_SECTOR, TARGET_SECTOR ); + r = iap.erase( TARGET_SECTOR, TARGET_SECTOR ); + printf( "erase result = 0x%08X\r\n", r ); + } + + // copy File to Flash + fp = fopen("/local/test.dat", "r"); + if (fp) { + iap.prepare( TARGET_SECTOR, TARGET_SECTOR ); + s = 0; + for (i = 0;; i ++) { + r = fread(buf, sizeof(char), MEM_SIZE, fp); + if (r <= 0) break; + s = s + r; + r = iap.write(buf, sector_start_adress[TARGET_SECTOR] + MEM_SIZE * i, MEM_SIZE); + printf( "copied: File(0x%08X)->Flash(0x%08X) for %d bytes. (result=0x%08X)\n", buf, sector_start_adress[ TARGET_SECTOR ] + MEM_SIZE * i, MEM_SIZE, r ); + } + fclose(fp); + printf("writable %d bytes. (%d)\r\n", s, i); + } + + memdump( sector_start_adress[ TARGET_SECTOR ], 16); + + heap = (char*)malloc(2); + printf("stack %08x, heap %08x\r\n", (unsigned int)&heap, (unsigned int)heap); + + { + register unsigned int _control __asm("control"); + register unsigned int _msp __asm("msp"); + register unsigned int _psp __asm("psp"); + printf("MSP %08x, PSP %08x, CONTROL %x\r\n", _msp, _psp, _control & 3); + } + + jump(1); + + printf("exit\r\n"); + return 0; +} + + +void memdump( char *base, int n ) { + unsigned int *p; + + printf( " memdump from 0x%08X for %d bytes", (unsigned long)base, n ); + + p = (unsigned int *)((unsigned int)base & ~(unsigned int)0x3); + + for ( int i = 0; i < (n >> 2); i++, p++ ) { + if ( !(i % 4) ) + printf( "\r\n 0x%08X :", (unsigned int)p ); + + printf( " %08X", *p ); + } + + printf( "\r\n" ); +}