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

Dependencies:   mbed

Committer:
okini3939
Date:
Tue Dec 27 17:02:56 2011 +0000
Revision:
3:5cf31386b95d
Parent:
2:c56b5e682f0c

        

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 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 3:5cf31386b95d 120 if (loadbinary("/local/test.dat")) {
okini3939 3:5cf31386b95d 121 printf("error loadbinary\r\n");
okini3939 3:5cf31386b95d 122 return -1;
okini3939 3:5cf31386b95d 123 }
okini3939 0:f8cf4fdf6ab4 124
okini3939 1:fbb938b95cef 125 // memdump( sector_start_adress[ TARGET_SECTOR ], 48 * 4);
okini3939 0:f8cf4fdf6ab4 126
okini3939 1:fbb938b95cef 127 heap = new char(2);
okini3939 1:fbb938b95cef 128 delete[] heap;
okini3939 0:f8cf4fdf6ab4 129 printf("stack %08x, heap %08x\r\n", (unsigned int)&heap, (unsigned int)heap);
okini3939 0:f8cf4fdf6ab4 130
okini3939 0:f8cf4fdf6ab4 131 {
okini3939 0:f8cf4fdf6ab4 132 register unsigned int _control __asm("control");
okini3939 0:f8cf4fdf6ab4 133 register unsigned int _msp __asm("msp");
okini3939 0:f8cf4fdf6ab4 134 register unsigned int _psp __asm("psp");
okini3939 0:f8cf4fdf6ab4 135 printf("MSP %08x, PSP %08x, CONTROL %x\r\n", _msp, _psp, _control & 3);
okini3939 0:f8cf4fdf6ab4 136 }
okini3939 0:f8cf4fdf6ab4 137
okini3939 0:f8cf4fdf6ab4 138 jump(1);
okini3939 0:f8cf4fdf6ab4 139
okini3939 0:f8cf4fdf6ab4 140 printf("exit\r\n");
okini3939 1:fbb938b95cef 141
okini3939 1:fbb938b95cef 142 heap = new char(2);
okini3939 1:fbb938b95cef 143 delete[] heap;
okini3939 1:fbb938b95cef 144 printf("stack %08x, heap %08x\r\n", (unsigned int)&heap, (unsigned int)heap);
okini3939 1:fbb938b95cef 145
okini3939 0:f8cf4fdf6ab4 146 return 0;
okini3939 0:f8cf4fdf6ab4 147 }
okini3939 0:f8cf4fdf6ab4 148
okini3939 0:f8cf4fdf6ab4 149
okini3939 0:f8cf4fdf6ab4 150 void memdump( char *base, int n ) {
okini3939 0:f8cf4fdf6ab4 151 unsigned int *p;
okini3939 0:f8cf4fdf6ab4 152
okini3939 0:f8cf4fdf6ab4 153 printf( " memdump from 0x%08X for %d bytes", (unsigned long)base, n );
okini3939 0:f8cf4fdf6ab4 154
okini3939 0:f8cf4fdf6ab4 155 p = (unsigned int *)((unsigned int)base & ~(unsigned int)0x3);
okini3939 0:f8cf4fdf6ab4 156
okini3939 0:f8cf4fdf6ab4 157 for ( int i = 0; i < (n >> 2); i++, p++ ) {
okini3939 0:f8cf4fdf6ab4 158 if ( !(i % 4) )
okini3939 0:f8cf4fdf6ab4 159 printf( "\r\n 0x%08X :", (unsigned int)p );
okini3939 0:f8cf4fdf6ab4 160
okini3939 0:f8cf4fdf6ab4 161 printf( " %08X", *p );
okini3939 0:f8cf4fdf6ab4 162 }
okini3939 0:f8cf4fdf6ab4 163
okini3939 0:f8cf4fdf6ab4 164 printf( "\r\n" );
okini3939 0:f8cf4fdf6ab4 165 }