dynamic load and run users binary file. self write the flash memory.

Dependencies:   mbed

Committer:
okini3939
Date:
Mon Dec 26 15:42:50 2011 +0000
Revision:
0:f8cf4fdf6ab4
Child:
1:fbb938b95cef

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:f8cf4fdf6ab4 1 /*
okini3939 0:f8cf4fdf6ab4 2 dynamic load the binary file.
okini3939 0:f8cf4fdf6ab4 3 binary -> Flash 0x00078000 & run
okini3939 0:f8cf4fdf6ab4 4
okini3939 0:f8cf4fdf6ab4 5 lpc17xx.ld
okini3939 0:f8cf4fdf6ab4 6 IROM (rx) : ORIGIN = 0x00078000, LENGTH = 32k
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 0:f8cf4fdf6ab4 12
okini3939 0:f8cf4fdf6ab4 13 compiled.bin --> test.dat
okini3939 0:f8cf4fdf6ab4 14 */
okini3939 0:f8cf4fdf6ab4 15 #include "mbed.h"
okini3939 0:f8cf4fdf6ab4 16 #include "IAP.h"
okini3939 0:f8cf4fdf6ab4 17 #include <new>
okini3939 0:f8cf4fdf6ab4 18
okini3939 0:f8cf4fdf6ab4 19 #define MEM_SIZE 256
okini3939 0:f8cf4fdf6ab4 20 #define TARGET_SECTOR 29
okini3939 0:f8cf4fdf6ab4 21
okini3939 0:f8cf4fdf6ab4 22 LocalFileSystem local("local");
okini3939 0:f8cf4fdf6ab4 23
okini3939 0:f8cf4fdf6ab4 24 void memdump( char *p, int n );
okini3939 0:f8cf4fdf6ab4 25 int isprint( int c );
okini3939 0:f8cf4fdf6ab4 26
okini3939 0:f8cf4fdf6ab4 27 IAP iap;
okini3939 0:f8cf4fdf6ab4 28
okini3939 0:f8cf4fdf6ab4 29 extern "C"
okini3939 0:f8cf4fdf6ab4 30 void Default_Handler() {
okini3939 0:f8cf4fdf6ab4 31 printf("Default Handler!\n");
okini3939 0:f8cf4fdf6ab4 32 exit(-1);
okini3939 0:f8cf4fdf6ab4 33 }
okini3939 0:f8cf4fdf6ab4 34
okini3939 0:f8cf4fdf6ab4 35 extern "C"
okini3939 0:f8cf4fdf6ab4 36 void HardFault_Handler() {
okini3939 0:f8cf4fdf6ab4 37 printf("Hard Fault!\n");
okini3939 0:f8cf4fdf6ab4 38 exit(-1);
okini3939 0:f8cf4fdf6ab4 39 }
okini3939 0:f8cf4fdf6ab4 40
okini3939 0:f8cf4fdf6ab4 41 void no_memory () {
okini3939 0:f8cf4fdf6ab4 42 printf("panic: can't allocate to memory!\r\n");
okini3939 0:f8cf4fdf6ab4 43 exit(-1);
okini3939 0:f8cf4fdf6ab4 44 }
okini3939 0:f8cf4fdf6ab4 45
okini3939 0:f8cf4fdf6ab4 46 int jump (int vect) {
okini3939 0:f8cf4fdf6ab4 47 void (*func)();
okini3939 0:f8cf4fdf6ab4 48 unsigned int *p;
okini3939 0:f8cf4fdf6ab4 49
okini3939 0:f8cf4fdf6ab4 50 p = (unsigned int *)(sector_start_adress[ TARGET_SECTOR ] + 4 * vect);
okini3939 0:f8cf4fdf6ab4 51 func = (void (*)())*p;
okini3939 0:f8cf4fdf6ab4 52 printf( "func %08x (%d)\r\n", (unsigned int)func, vect);
okini3939 0:f8cf4fdf6ab4 53 func();
okini3939 0:f8cf4fdf6ab4 54 return 0;
okini3939 0:f8cf4fdf6ab4 55 }
okini3939 0:f8cf4fdf6ab4 56
okini3939 0:f8cf4fdf6ab4 57 void SysTick_Handler(void) {
okini3939 0:f8cf4fdf6ab4 58 jump(15);
okini3939 0:f8cf4fdf6ab4 59 }
okini3939 0:f8cf4fdf6ab4 60
okini3939 0:f8cf4fdf6ab4 61 int main() {
okini3939 0:f8cf4fdf6ab4 62 FILE *fp;
okini3939 0:f8cf4fdf6ab4 63 int i, r, s;
okini3939 0:f8cf4fdf6ab4 64 char buf[MEM_SIZE];
okini3939 0:f8cf4fdf6ab4 65 char *heap;
okini3939 0:f8cf4fdf6ab4 66
okini3939 0:f8cf4fdf6ab4 67 set_new_handler(no_memory); // new handler function
okini3939 0:f8cf4fdf6ab4 68
okini3939 0:f8cf4fdf6ab4 69 printf( "device-ID = 0x%08X, serial# = 0x%08X, CPU running %dkHz\r\n", iap.read_ID(), iap.read_serial(), SystemCoreClock / 1000 );
okini3939 0:f8cf4fdf6ab4 70 printf( "user reserved flash area: start_address=0x%08X, size=%d bytes\r\n", iap.reserved_flash_area_start(), iap.reserved_flash_area_size() );
okini3939 0:f8cf4fdf6ab4 71
okini3939 0:f8cf4fdf6ab4 72 r = iap.blank_check( TARGET_SECTOR, TARGET_SECTOR );
okini3939 0:f8cf4fdf6ab4 73 printf( "blank check result = 0x%08X\r\n", r );
okini3939 0:f8cf4fdf6ab4 74
okini3939 0:f8cf4fdf6ab4 75 // erase sector, if required
okini3939 0:f8cf4fdf6ab4 76
okini3939 0:f8cf4fdf6ab4 77 if ( r == SECTOR_NOT_BLANK ) {
okini3939 0:f8cf4fdf6ab4 78 iap.prepare( TARGET_SECTOR, TARGET_SECTOR );
okini3939 0:f8cf4fdf6ab4 79 r = iap.erase( TARGET_SECTOR, TARGET_SECTOR );
okini3939 0:f8cf4fdf6ab4 80 printf( "erase result = 0x%08X\r\n", r );
okini3939 0:f8cf4fdf6ab4 81 }
okini3939 0:f8cf4fdf6ab4 82
okini3939 0:f8cf4fdf6ab4 83 // copy File to Flash
okini3939 0:f8cf4fdf6ab4 84 fp = fopen("/local/test.dat", "r");
okini3939 0:f8cf4fdf6ab4 85 if (fp) {
okini3939 0:f8cf4fdf6ab4 86 iap.prepare( TARGET_SECTOR, TARGET_SECTOR );
okini3939 0:f8cf4fdf6ab4 87 s = 0;
okini3939 0:f8cf4fdf6ab4 88 for (i = 0;; i ++) {
okini3939 0:f8cf4fdf6ab4 89 r = fread(buf, sizeof(char), MEM_SIZE, fp);
okini3939 0:f8cf4fdf6ab4 90 if (r <= 0) break;
okini3939 0:f8cf4fdf6ab4 91 s = s + r;
okini3939 0:f8cf4fdf6ab4 92 r = iap.write(buf, sector_start_adress[TARGET_SECTOR] + MEM_SIZE * i, MEM_SIZE);
okini3939 0:f8cf4fdf6ab4 93 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 );
okini3939 0:f8cf4fdf6ab4 94 }
okini3939 0:f8cf4fdf6ab4 95 fclose(fp);
okini3939 0:f8cf4fdf6ab4 96 printf("writable %d bytes. (%d)\r\n", s, i);
okini3939 0:f8cf4fdf6ab4 97 }
okini3939 0:f8cf4fdf6ab4 98
okini3939 0:f8cf4fdf6ab4 99 memdump( sector_start_adress[ TARGET_SECTOR ], 16);
okini3939 0:f8cf4fdf6ab4 100
okini3939 0:f8cf4fdf6ab4 101 heap = (char*)malloc(2);
okini3939 0:f8cf4fdf6ab4 102 printf("stack %08x, heap %08x\r\n", (unsigned int)&heap, (unsigned int)heap);
okini3939 0:f8cf4fdf6ab4 103
okini3939 0:f8cf4fdf6ab4 104 {
okini3939 0:f8cf4fdf6ab4 105 register unsigned int _control __asm("control");
okini3939 0:f8cf4fdf6ab4 106 register unsigned int _msp __asm("msp");
okini3939 0:f8cf4fdf6ab4 107 register unsigned int _psp __asm("psp");
okini3939 0:f8cf4fdf6ab4 108 printf("MSP %08x, PSP %08x, CONTROL %x\r\n", _msp, _psp, _control & 3);
okini3939 0:f8cf4fdf6ab4 109 }
okini3939 0:f8cf4fdf6ab4 110
okini3939 0:f8cf4fdf6ab4 111 jump(1);
okini3939 0:f8cf4fdf6ab4 112
okini3939 0:f8cf4fdf6ab4 113 printf("exit\r\n");
okini3939 0:f8cf4fdf6ab4 114 return 0;
okini3939 0:f8cf4fdf6ab4 115 }
okini3939 0:f8cf4fdf6ab4 116
okini3939 0:f8cf4fdf6ab4 117
okini3939 0:f8cf4fdf6ab4 118 void memdump( char *base, int n ) {
okini3939 0:f8cf4fdf6ab4 119 unsigned int *p;
okini3939 0:f8cf4fdf6ab4 120
okini3939 0:f8cf4fdf6ab4 121 printf( " memdump from 0x%08X for %d bytes", (unsigned long)base, n );
okini3939 0:f8cf4fdf6ab4 122
okini3939 0:f8cf4fdf6ab4 123 p = (unsigned int *)((unsigned int)base & ~(unsigned int)0x3);
okini3939 0:f8cf4fdf6ab4 124
okini3939 0:f8cf4fdf6ab4 125 for ( int i = 0; i < (n >> 2); i++, p++ ) {
okini3939 0:f8cf4fdf6ab4 126 if ( !(i % 4) )
okini3939 0:f8cf4fdf6ab4 127 printf( "\r\n 0x%08X :", (unsigned int)p );
okini3939 0:f8cf4fdf6ab4 128
okini3939 0:f8cf4fdf6ab4 129 printf( " %08X", *p );
okini3939 0:f8cf4fdf6ab4 130 }
okini3939 0:f8cf4fdf6ab4 131
okini3939 0:f8cf4fdf6ab4 132 printf( "\r\n" );
okini3939 0:f8cf4fdf6ab4 133 }