semihost server example program
Dependencies: SWD mbed USBLocalFileSystem BaseDAP USBDAP
LPCXpresso LPC11U68 | LPCXpresso LPC1549 | FRDM-KL46Z | EA LPC4088 QSB app-board | LPC1768 app-board | LPC810 | LPC1114FN28 | |
---|---|---|---|---|---|---|---|
server | server | server | server | server | client | client | |
SWDIO | D12 | D12 | D12 | p25 | p21 | p4(P0_2) | p12 |
SWCLK | D10 | D10 | D10 | p26 | p22 | p3(P0_3) | p3 |
nRESET *option | D6 | D6 | D6 | p34 | p30 | p1(P0_5) | p23 |
GND | GND | GND | GND | p1 | p1 | p7 | p22 |
3.3V | P3V3 | P3V3 | P3V3 | p44 | p40 | p6 | p21 |
flash write | SW2(P0_1) | SW3(P1_9) | SW1 | p14 joystick center | p14 joystick center |
client example:
Import programlpc810-semihost_helloworld
semihost client example program
Diff: Flash.cpp
- Revision:
- 2:32e9437348ad
- Parent:
- 0:27d35fa263b5
- Child:
- 3:d7a7cde0bfb8
--- a/Flash.cpp Mon Sep 02 17:33:08 2013 +0000 +++ b/Flash.cpp Thu Sep 05 09:34:12 2013 +0000 @@ -1,4 +1,4 @@ -// Flash.cpp 2013/9/1 +// Flash.cpp 2013/9/5 #include "Flash.h" #include "Target2.h" #include "mydebug.h" @@ -37,14 +37,17 @@ if (!_write_to_ram(ram, sizeof(buf), buf)) { break; } - if (remoteIAP(IAP_CMD_PREPARE_SECTOR, _sector(addr), _sector(addr)) != IAP_CMD_SUCCESS) { + if (remoteIAP(PREPARE_SECTOR, _sector(addr), _sector(addr)) != CMD_SUCCESS) { + _pc->printf("faild. PREPARE_SECTOR %d %d\n", _sector(addr), _sector(addr)); break; } - if (remoteIAP(IAP_CMD_COPY_RAM_TO_FLASH, addr, ram, sizeof(buf), IAP_CCLK) != IAP_CMD_SUCCESS) { + if (remoteIAP(COPY_RAM_TO_FLASH, addr, ram, sizeof(buf), IAP_CCLK) != CMD_SUCCESS) { + _pc->printf("faild. COPY_RAM_TO_FLASH %d %d %d %dn", addr, ram, sizeof(buf)); break; } if (addr >= 512) { - if (remoteIAP(IAP_CMD_COMPARE, addr, ram, sizeof(buf)) != IAP_CMD_SUCCESS) { + if (remoteIAP(COMPARE, addr, ram, sizeof(buf)) != CMD_SUCCESS) { + _pc->printf("faild. COMPARE %d %d %d", addr, ram, sizeof(buf)); break; } } @@ -61,13 +64,17 @@ { _pc->printf("Erasing."); for(int sector = 0; sector <= 7; sector++) { - if (remoteIAP(IAP_CMD_PREPARE_SECTOR, sector, sector) != IAP_CMD_SUCCESS) { + IAP_STATUS status = remoteIAP(PREPARE_SECTOR, sector, sector); + if (status != CMD_SUCCESS) { + _pc->printf("faild. PREPARE_SECTOR %d %d status=%d\n", sector, sector, status); return false; } - if (remoteIAP(IAP_CMD_ERASE_SECTOR, sector, sector, IAP_CCLK) != IAP_CMD_SUCCESS) { + if (remoteIAP(ERASE_SECTOR, sector, sector, IAP_CCLK) != CMD_SUCCESS) { + _pc->printf("faild. ERASE_SECTOR %d %d %d\n", sector, sector, IAP_CCLK); return false; } - if (remoteIAP(IAP_CMD_BLANK_CHECK, sector, sector, IAP_CCLK) != IAP_CMD_SUCCESS) { + if (remoteIAP(BLANK_CHECK, sector, sector, IAP_CCLK) != CMD_SUCCESS) { + _pc->printf("faild. BLANK_CHECK %d %d %d\n", sector, sector, IAP_CCLK); return false; } _pc->printf("."); @@ -100,7 +107,7 @@ return true; } -uint32_t Flash::remoteIAP(uint32_t cmd, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3) +Flash::IAP_STATUS Flash::remoteIAP(Flash::IAP_CMD cmd, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3) { struct { uint32_t bkpt; // +0 @@ -112,7 +119,7 @@ } IAP; // +44 } ram; - ram.bkpt = 0xe00abe00; + ram.bkpt = 0xe00abe00; // bpkt #00 ram.IAP.cmd = cmd; ram.IAP.par[0] = p0; ram.IAP.par[1] = p1; @@ -122,14 +129,14 @@ _target->wait_status(TARGET_HALTED); const uint32_t ram_addr = 0x10000100; _target->writeMemory(ram_addr, (uint32_t*)&ram, sizeof(ram)/sizeof(uint32_t)); - _target->r0 = ram_addr + 4; - _target->r1 = ram_addr + 24; - _target->sp = 0x10001000-256; + _target->r0 = ram_addr + 4; // command addr + _target->r1 = ram_addr + 24; // status addr + _target->sp = 0x10000400-32; // IAP use ram top 32bytes _target->lr = ram_addr + 1; // return to bkpt _target->pc = 0x1fff1ff1; // IAP_Call _target->resume(); _target->wait_status(TARGET_HALTED); - return _target->readMemory(ram_addr + 24); + return (IAP_STATUS)_target->readMemory(ram_addr + 24); } bool Flash::verify(const char* filename)