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

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)