semihost server example program

Dependencies:   SWD mbed USBLocalFileSystem BaseDAP USBDAP

/media/uploads/va009039/kl46z-lpc800-360x480.jpg

LPCXpresso
LPC11U68
LPCXpresso
LPC1549
FRDM-KL46ZEA LPC4088 QSB
app-board
LPC1768
app-board
LPC810LPC1114FN28
serverserverserverserverserverclientclient
SWDIOD12D12D12p25p21p4(P0_2)p12
SWCLKD10D10D10p26p22p3(P0_3)p3
nRESET
*option
D6D6D6p34p30p1(P0_5)p23
GNDGNDGNDGNDp1p1p7p22
3.3VP3V3P3V3P3V3p44p40p6p21
flash writeSW2(P0_1)SW3(P1_9)SW1p14
joystick
center
p14
joystick
center

client example:

Import programlpc810-semihost_helloworld

semihost client example program

Committer:
va009039
Date:
Sun Sep 01 08:25:28 2013 +0000
Revision:
0:27d35fa263b5
Child:
2:32e9437348ad
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:27d35fa263b5 1 // Flash.cpp 2013/9/1
va009039 0:27d35fa263b5 2 #include "Flash.h"
va009039 0:27d35fa263b5 3 #include "Target2.h"
va009039 0:27d35fa263b5 4 #include "mydebug.h"
va009039 0:27d35fa263b5 5
va009039 0:27d35fa263b5 6 Flash::Flash(Target2* target, Serial* usbpc) :_target(target),_pc(usbpc)
va009039 0:27d35fa263b5 7 {
va009039 0:27d35fa263b5 8 _setup();
va009039 0:27d35fa263b5 9 }
va009039 0:27d35fa263b5 10
va009039 0:27d35fa263b5 11 void Flash::_setup()
va009039 0:27d35fa263b5 12 {
va009039 0:27d35fa263b5 13 _target->halt();
va009039 0:27d35fa263b5 14 _target->wait_status(TARGET_HALTED);
va009039 0:27d35fa263b5 15 }
va009039 0:27d35fa263b5 16
va009039 0:27d35fa263b5 17 bool Flash::write(const char* filename)
va009039 0:27d35fa263b5 18 {
va009039 0:27d35fa263b5 19 FILE* fp = fopen(filename, "rb");
va009039 0:27d35fa263b5 20 if (fp == NULL) {
va009039 0:27d35fa263b5 21 _pc->printf("file open error [%s]\n", filename);
va009039 0:27d35fa263b5 22 return false;
va009039 0:27d35fa263b5 23 }
va009039 0:27d35fa263b5 24 _pc->printf("Writing.");
va009039 0:27d35fa263b5 25 uint8_t buf[256];
va009039 0:27d35fa263b5 26 bool passed = false;
va009039 0:27d35fa263b5 27 for(int addr = 0; addr < 0x8000; addr += sizeof(buf)) {
va009039 0:27d35fa263b5 28 if (feof(fp)) {
va009039 0:27d35fa263b5 29 passed = true;
va009039 0:27d35fa263b5 30 break;
va009039 0:27d35fa263b5 31 }
va009039 0:27d35fa263b5 32 fread(buf, sizeof(buf), 1, fp);
va009039 0:27d35fa263b5 33 if (!_patch(buf, sizeof(buf), addr)) {
va009039 0:27d35fa263b5 34 break;
va009039 0:27d35fa263b5 35 }
va009039 0:27d35fa263b5 36 const int ram = 0x10000200;
va009039 0:27d35fa263b5 37 if (!_write_to_ram(ram, sizeof(buf), buf)) {
va009039 0:27d35fa263b5 38 break;
va009039 0:27d35fa263b5 39 }
va009039 0:27d35fa263b5 40 if (remoteIAP(IAP_CMD_PREPARE_SECTOR, _sector(addr), _sector(addr)) != IAP_CMD_SUCCESS) {
va009039 0:27d35fa263b5 41 break;
va009039 0:27d35fa263b5 42 }
va009039 0:27d35fa263b5 43 if (remoteIAP(IAP_CMD_COPY_RAM_TO_FLASH, addr, ram, sizeof(buf), IAP_CCLK) != IAP_CMD_SUCCESS) {
va009039 0:27d35fa263b5 44 break;
va009039 0:27d35fa263b5 45 }
va009039 0:27d35fa263b5 46 if (addr >= 512) {
va009039 0:27d35fa263b5 47 if (remoteIAP(IAP_CMD_COMPARE, addr, ram, sizeof(buf)) != IAP_CMD_SUCCESS) {
va009039 0:27d35fa263b5 48 break;
va009039 0:27d35fa263b5 49 }
va009039 0:27d35fa263b5 50 }
va009039 0:27d35fa263b5 51 _pc->printf(".");
va009039 0:27d35fa263b5 52 }
va009039 0:27d35fa263b5 53 fclose(fp);
va009039 0:27d35fa263b5 54 if (passed) {
va009039 0:27d35fa263b5 55 _pc->printf("passed.\n");
va009039 0:27d35fa263b5 56 }
va009039 0:27d35fa263b5 57 return passed;
va009039 0:27d35fa263b5 58 }
va009039 0:27d35fa263b5 59
va009039 0:27d35fa263b5 60 bool Flash::eraseAll()
va009039 0:27d35fa263b5 61 {
va009039 0:27d35fa263b5 62 _pc->printf("Erasing.");
va009039 0:27d35fa263b5 63 for(int sector = 0; sector <= 7; sector++) {
va009039 0:27d35fa263b5 64 if (remoteIAP(IAP_CMD_PREPARE_SECTOR, sector, sector) != IAP_CMD_SUCCESS) {
va009039 0:27d35fa263b5 65 return false;
va009039 0:27d35fa263b5 66 }
va009039 0:27d35fa263b5 67 if (remoteIAP(IAP_CMD_ERASE_SECTOR, sector, sector, IAP_CCLK) != IAP_CMD_SUCCESS) {
va009039 0:27d35fa263b5 68 return false;
va009039 0:27d35fa263b5 69 }
va009039 0:27d35fa263b5 70 if (remoteIAP(IAP_CMD_BLANK_CHECK, sector, sector, IAP_CCLK) != IAP_CMD_SUCCESS) {
va009039 0:27d35fa263b5 71 return false;
va009039 0:27d35fa263b5 72 }
va009039 0:27d35fa263b5 73 _pc->printf(".");
va009039 0:27d35fa263b5 74 }
va009039 0:27d35fa263b5 75 _pc->printf("passed.\n");
va009039 0:27d35fa263b5 76 return true;
va009039 0:27d35fa263b5 77 }
va009039 0:27d35fa263b5 78
va009039 0:27d35fa263b5 79 bool Flash::_write_to_ram(int addr, int size, uint8_t* buf)
va009039 0:27d35fa263b5 80 {
va009039 0:27d35fa263b5 81 _target->writeMemory(addr, (uint32_t*)buf, size / sizeof(uint32_t));
va009039 0:27d35fa263b5 82 return true;
va009039 0:27d35fa263b5 83 }
va009039 0:27d35fa263b5 84
va009039 0:27d35fa263b5 85 int Flash::_sector(int addr)
va009039 0:27d35fa263b5 86 {
va009039 0:27d35fa263b5 87 return addr / 4096;
va009039 0:27d35fa263b5 88 }
va009039 0:27d35fa263b5 89
va009039 0:27d35fa263b5 90 bool Flash::_patch(uint8_t* buf, int size, int addr)
va009039 0:27d35fa263b5 91 {
va009039 0:27d35fa263b5 92 const int crp_start = 0x2fc; // Code Read Protection location
va009039 0:27d35fa263b5 93 if (crp_start >= addr && crp_start < addr+size) {
va009039 0:27d35fa263b5 94 uint32_t pat = *reinterpret_cast<uint32_t*>(crp_start-addr+buf);
va009039 0:27d35fa263b5 95 if (pat != 0xffffffff) { // NO_CRP ?
va009039 0:27d35fa263b5 96 _pc->printf("\nCAUTION: CRP Pattern is not NO_CRP; %08x\n", pat);
va009039 0:27d35fa263b5 97 return false;
va009039 0:27d35fa263b5 98 }
va009039 0:27d35fa263b5 99 }
va009039 0:27d35fa263b5 100 return true;
va009039 0:27d35fa263b5 101 }
va009039 0:27d35fa263b5 102
va009039 0:27d35fa263b5 103 uint32_t Flash::remoteIAP(uint32_t cmd, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3)
va009039 0:27d35fa263b5 104 {
va009039 0:27d35fa263b5 105 struct {
va009039 0:27d35fa263b5 106 uint32_t bkpt; // +0
va009039 0:27d35fa263b5 107 struct { // IAP Structure
va009039 0:27d35fa263b5 108 uint32_t cmd; // +4 Command
va009039 0:27d35fa263b5 109 uint32_t par[4]; // +8 Parameters
va009039 0:27d35fa263b5 110 uint32_t stat; // +24 Status
va009039 0:27d35fa263b5 111 uint32_t res[4]; // +28 Result
va009039 0:27d35fa263b5 112 } IAP; // +44
va009039 0:27d35fa263b5 113 } ram;
va009039 0:27d35fa263b5 114
va009039 0:27d35fa263b5 115 ram.bkpt = 0xe00abe00;
va009039 0:27d35fa263b5 116 ram.IAP.cmd = cmd;
va009039 0:27d35fa263b5 117 ram.IAP.par[0] = p0;
va009039 0:27d35fa263b5 118 ram.IAP.par[1] = p1;
va009039 0:27d35fa263b5 119 ram.IAP.par[2] = p2;
va009039 0:27d35fa263b5 120 ram.IAP.par[3] = p3;
va009039 0:27d35fa263b5 121 _target->halt();
va009039 0:27d35fa263b5 122 _target->wait_status(TARGET_HALTED);
va009039 0:27d35fa263b5 123 const uint32_t ram_addr = 0x10000100;
va009039 0:27d35fa263b5 124 _target->writeMemory(ram_addr, (uint32_t*)&ram, sizeof(ram)/sizeof(uint32_t));
va009039 0:27d35fa263b5 125 _target->r0 = ram_addr + 4;
va009039 0:27d35fa263b5 126 _target->r1 = ram_addr + 24;
va009039 0:27d35fa263b5 127 _target->sp = 0x10001000-256;
va009039 0:27d35fa263b5 128 _target->lr = ram_addr + 1; // return to bkpt
va009039 0:27d35fa263b5 129 _target->pc = 0x1fff1ff1; // IAP_Call
va009039 0:27d35fa263b5 130 _target->resume();
va009039 0:27d35fa263b5 131 _target->wait_status(TARGET_HALTED);
va009039 0:27d35fa263b5 132 return _target->readMemory(ram_addr + 24);
va009039 0:27d35fa263b5 133 }
va009039 0:27d35fa263b5 134
va009039 0:27d35fa263b5 135 bool Flash::verify(const char* filename)
va009039 0:27d35fa263b5 136 {
va009039 0:27d35fa263b5 137 FILE* fp = fopen(filename, "rb");
va009039 0:27d35fa263b5 138 if (fp == NULL) {
va009039 0:27d35fa263b5 139 _pc->printf("file open error [%s]\n", filename);
va009039 0:27d35fa263b5 140 return false;
va009039 0:27d35fa263b5 141 }
va009039 0:27d35fa263b5 142 _pc->printf("Verifying.");
va009039 0:27d35fa263b5 143 uint8_t buf[256];
va009039 0:27d35fa263b5 144 bool passed = false;
va009039 0:27d35fa263b5 145 for(int addr = 0; addr < 0x8000; addr++) {
va009039 0:27d35fa263b5 146 int c = fgetc(fp);
va009039 0:27d35fa263b5 147 if (c == EOF) {
va009039 0:27d35fa263b5 148 passed = true;
va009039 0:27d35fa263b5 149 break;
va009039 0:27d35fa263b5 150 }
va009039 0:27d35fa263b5 151 if ((addr % sizeof(buf)) == 0) {
va009039 0:27d35fa263b5 152 _target->readMemory(addr, (uint32_t*)buf, sizeof(buf)/sizeof(uint32_t));
va009039 0:27d35fa263b5 153 _pc->printf(".");
va009039 0:27d35fa263b5 154 }
va009039 0:27d35fa263b5 155 if (c != buf[addr % sizeof(buf)]) {
va009039 0:27d35fa263b5 156 _pc->printf("\nError at %08x(%02x:%02x)\n", addr, c, buf[addr % sizeof(buf)]);
va009039 0:27d35fa263b5 157 if (addr >= 512) {
va009039 0:27d35fa263b5 158 break;
va009039 0:27d35fa263b5 159 }
va009039 0:27d35fa263b5 160 }
va009039 0:27d35fa263b5 161 }
va009039 0:27d35fa263b5 162 fclose(fp);
va009039 0:27d35fa263b5 163 if (passed) {
va009039 0:27d35fa263b5 164 _pc->printf("passed.\n");
va009039 0:27d35fa263b5 165 }
va009039 0:27d35fa263b5 166 return passed;
va009039 0:27d35fa263b5 167 }