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:
Mon Sep 02 17:33:08 2013 +0000
Revision:
1:eb30547ba84d
Child:
2:32e9437348ad
add semihost

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 1:eb30547ba84d 1 // Semihost.cpp 2013/9/3
va009039 1:eb30547ba84d 2 #include "Semihost.h"
va009039 1:eb30547ba84d 3 #include "mydebug.h"
va009039 1:eb30547ba84d 4
va009039 1:eb30547ba84d 5 Semihost::Semihost(Target2* target, Serial* usbpc) : _target(target),_pc(usbpc)
va009039 1:eb30547ba84d 6 {
va009039 1:eb30547ba84d 7 _dirpath = "/local";
va009039 1:eb30547ba84d 8 }
va009039 1:eb30547ba84d 9
va009039 1:eb30547ba84d 10 void Semihost::mount(const char* dirpath)
va009039 1:eb30547ba84d 11 {
va009039 1:eb30547ba84d 12 _dirpath = (char*)dirpath;
va009039 1:eb30547ba84d 13 }
va009039 1:eb30547ba84d 14
va009039 1:eb30547ba84d 15 int Semihost::poll()
va009039 1:eb30547ba84d 16 {
va009039 1:eb30547ba84d 17 if (_target->getStatus() != TARGET_HALTED) {
va009039 1:eb30547ba84d 18 return 0;
va009039 1:eb30547ba84d 19 }
va009039 1:eb30547ba84d 20 uint32_t pc = _target->pc;
va009039 1:eb30547ba84d 21 if (pc & 1) {
va009039 1:eb30547ba84d 22 return 0;
va009039 1:eb30547ba84d 23 }
va009039 1:eb30547ba84d 24 if (rd<uint16_t>(pc) != 0xbeab) { // BKPT #171
va009039 1:eb30547ba84d 25 return 0;
va009039 1:eb30547ba84d 26 }
va009039 1:eb30547ba84d 27 _target->r0 = exec(_target->r0, _target->r1);
va009039 1:eb30547ba84d 28 _target->pc = pc + 3; // skip bkpt #171
va009039 1:eb30547ba84d 29 _target->resume();
va009039 1:eb30547ba84d 30 return 0;
va009039 1:eb30547ba84d 31 }
va009039 1:eb30547ba84d 32
va009039 1:eb30547ba84d 33 int Semihost::exec(uint32_t reason, uint32_t arg)
va009039 1:eb30547ba84d 34 {
va009039 1:eb30547ba84d 35 int result = 0;
va009039 1:eb30547ba84d 36 switch(reason) {
va009039 1:eb30547ba84d 37 case 0x01: result = sys_open(arg); break;
va009039 1:eb30547ba84d 38 case 0x02: result = sys_close(arg); break;
va009039 1:eb30547ba84d 39 case 0x03: result = sys_writec(arg); break;
va009039 1:eb30547ba84d 40 case 0x04: result = sys_write0(arg); break;
va009039 1:eb30547ba84d 41 case 0x05: result = sys_write(arg); break;
va009039 1:eb30547ba84d 42 case 0x06: result = sys_read(arg); break;
va009039 1:eb30547ba84d 43 case 0x07: result = sys_readc(arg); break;
va009039 1:eb30547ba84d 44 case 0x09: result = sys_istty(arg); break;
va009039 1:eb30547ba84d 45 case 0x0a: result = sys_fseek(arg); break;
va009039 1:eb30547ba84d 46 case 0x0b: result = sys_ensure(arg); break;
va009039 1:eb30547ba84d 47 case 0x0c: result = sys_flen(arg); break;
va009039 1:eb30547ba84d 48 case 0x0e: result = sys_remove(arg); break;
va009039 1:eb30547ba84d 49 case 0x0f: result = sys_rename(arg); break;
va009039 1:eb30547ba84d 50 case 0x18: result = sys_exit(arg); break;
va009039 1:eb30547ba84d 51
va009039 1:eb30547ba84d 52 case 0x100: result = usr_xffind(arg); break;
va009039 1:eb30547ba84d 53 case 0x101: result = usr_uid(arg); break;
va009039 1:eb30547ba84d 54 case 0x102: result = usr_reset(arg); break;
va009039 1:eb30547ba84d 55 case 0x103: result = usr_vbus(arg); break;
va009039 1:eb30547ba84d 56 case 0x104: result = usr_powerdown(arg); break;
va009039 1:eb30547ba84d 57 case 0x105: result = usr_disabledebug(arg); break;
va009039 1:eb30547ba84d 58
va009039 1:eb30547ba84d 59 default:
va009039 1:eb30547ba84d 60 _pc->printf("[semihost]error reason=%08x arg=%08x\n", reason, arg);
va009039 1:eb30547ba84d 61 result = -1;
va009039 1:eb30547ba84d 62 }
va009039 1:eb30547ba84d 63 return result;
va009039 1:eb30547ba84d 64 }
va009039 1:eb30547ba84d 65
va009039 1:eb30547ba84d 66 int Semihost::sys_open(uint32_t arg) // 0x01
va009039 1:eb30547ba84d 67 {
va009039 1:eb30547ba84d 68 char name[64];
va009039 1:eb30547ba84d 69 _build_name(name, sizeof(name), arg, arg+8);
va009039 1:eb30547ba84d 70 const char* mode[] = {"r", "rb", "r+", "r+b", "w", "wb", "w+", "w+b", "a", "ab", "a+", "a+b"};
va009039 1:eb30547ba84d 71 uint32_t mode_index = rd<uint32_t>(arg+4);
va009039 1:eb30547ba84d 72 FILE* fp = fopen(name, mode[mode_index]);
va009039 1:eb30547ba84d 73 if (fp) {
va009039 1:eb30547ba84d 74 return (uint32_t)fp;
va009039 1:eb30547ba84d 75 }
va009039 1:eb30547ba84d 76 _pc->printf("\n[semihost]file open error [%s]\n", name);
va009039 1:eb30547ba84d 77 return -1;
va009039 1:eb30547ba84d 78 }
va009039 1:eb30547ba84d 79
va009039 1:eb30547ba84d 80 int Semihost::sys_close(uint32_t arg) // 0x02
va009039 1:eb30547ba84d 81 {
va009039 1:eb30547ba84d 82 FILE* fp = reinterpret_cast<FILE*>(rd<uint32_t>(arg));
va009039 1:eb30547ba84d 83 int r = fclose(fp);
va009039 1:eb30547ba84d 84 if (r == 0) {
va009039 1:eb30547ba84d 85 return 0;
va009039 1:eb30547ba84d 86 }
va009039 1:eb30547ba84d 87 return -1;
va009039 1:eb30547ba84d 88 }
va009039 1:eb30547ba84d 89
va009039 1:eb30547ba84d 90 int Semihost::sys_writec(uint32_t arg) // 0x03
va009039 1:eb30547ba84d 91 {
va009039 1:eb30547ba84d 92 uint32_t p = rd<uint32_t>(arg);
va009039 1:eb30547ba84d 93 _pc->putc(rd<uint8_t>(p) & 0xff);
va009039 1:eb30547ba84d 94 return 0;
va009039 1:eb30547ba84d 95 }
va009039 1:eb30547ba84d 96
va009039 1:eb30547ba84d 97 int Semihost::sys_write0(uint32_t arg) // 0x04
va009039 1:eb30547ba84d 98 {
va009039 1:eb30547ba84d 99 uint32_t p = rd<uint32_t>(arg);
va009039 1:eb30547ba84d 100 while(1) {
va009039 1:eb30547ba84d 101 uint8_t c = rd<uint8_t>(p++);
va009039 1:eb30547ba84d 102 if (c == '\0') {
va009039 1:eb30547ba84d 103 break;
va009039 1:eb30547ba84d 104 }
va009039 1:eb30547ba84d 105 _pc->putc(c & 0xff);
va009039 1:eb30547ba84d 106 }
va009039 1:eb30547ba84d 107 return 0;
va009039 1:eb30547ba84d 108 }
va009039 1:eb30547ba84d 109
va009039 1:eb30547ba84d 110 int Semihost::sys_write(uint32_t arg) // 0x05
va009039 1:eb30547ba84d 111 {
va009039 1:eb30547ba84d 112 FILE* fp = reinterpret_cast<FILE*>(rd<uint32_t>(arg));
va009039 1:eb30547ba84d 113 uint32_t p = rd<uint32_t>(arg+4);
va009039 1:eb30547ba84d 114 int count = rd<uint32_t>(arg+8);
va009039 1:eb30547ba84d 115 while(count > 0) {
va009039 1:eb30547ba84d 116 uint8_t c = rd<uint8_t>(p++);
va009039 1:eb30547ba84d 117 if (fputc(c, fp) == EOF) {
va009039 1:eb30547ba84d 118 return count;
va009039 1:eb30547ba84d 119 }
va009039 1:eb30547ba84d 120 count--;
va009039 1:eb30547ba84d 121 }
va009039 1:eb30547ba84d 122 return 0;
va009039 1:eb30547ba84d 123 }
va009039 1:eb30547ba84d 124
va009039 1:eb30547ba84d 125 int Semihost::sys_read(uint32_t arg) // 0x06
va009039 1:eb30547ba84d 126 {
va009039 1:eb30547ba84d 127 FILE* fp = reinterpret_cast<FILE*>(rd<uint32_t>(arg));
va009039 1:eb30547ba84d 128 uint32_t p = rd<uint32_t>(arg+4);
va009039 1:eb30547ba84d 129 int count = rd<uint32_t>(arg+8);
va009039 1:eb30547ba84d 130 while(count > 0) {
va009039 1:eb30547ba84d 131 int c = fgetc(fp);
va009039 1:eb30547ba84d 132 if (c == EOF) {
va009039 1:eb30547ba84d 133 return count;
va009039 1:eb30547ba84d 134 }
va009039 1:eb30547ba84d 135 wr<uint8_t>(p++, c);
va009039 1:eb30547ba84d 136 count--;
va009039 1:eb30547ba84d 137 }
va009039 1:eb30547ba84d 138 return 0;
va009039 1:eb30547ba84d 139 }
va009039 1:eb30547ba84d 140
va009039 1:eb30547ba84d 141 int Semihost::sys_readc(uint32_t arg) // 0x07
va009039 1:eb30547ba84d 142 {
va009039 1:eb30547ba84d 143 return _pc->getc() & 0xff;
va009039 1:eb30547ba84d 144 }
va009039 1:eb30547ba84d 145
va009039 1:eb30547ba84d 146 int Semihost::sys_istty(uint32_t arg) // 0x09
va009039 1:eb30547ba84d 147 {
va009039 1:eb30547ba84d 148 FILE* fp = reinterpret_cast<FILE*>(rd<uint32_t>(arg));
va009039 1:eb30547ba84d 149 return 0;
va009039 1:eb30547ba84d 150 }
va009039 1:eb30547ba84d 151
va009039 1:eb30547ba84d 152 int Semihost::sys_fseek(uint32_t arg) // 0x0a
va009039 1:eb30547ba84d 153 {
va009039 1:eb30547ba84d 154 FILE* fp = reinterpret_cast<FILE*>(rd<uint32_t>(arg));
va009039 1:eb30547ba84d 155 int offset = rd<uint32_t>(arg+4);
va009039 1:eb30547ba84d 156 return fseek(fp, offset, SEEK_SET);
va009039 1:eb30547ba84d 157 }
va009039 1:eb30547ba84d 158
va009039 1:eb30547ba84d 159 int Semihost::sys_ensure(uint32_t arg) // 0x0b
va009039 1:eb30547ba84d 160 {
va009039 1:eb30547ba84d 161 FILE* fp = reinterpret_cast<FILE*>(rd<uint32_t>(arg));
va009039 1:eb30547ba84d 162 return -1;
va009039 1:eb30547ba84d 163 }
va009039 1:eb30547ba84d 164
va009039 1:eb30547ba84d 165 int Semihost::sys_flen(uint32_t arg) // 0x0c
va009039 1:eb30547ba84d 166 {
va009039 1:eb30547ba84d 167 FILE* fp = reinterpret_cast<FILE*>(rd<uint32_t>(arg));
va009039 1:eb30547ba84d 168 return ftell(fp);
va009039 1:eb30547ba84d 169 }
va009039 1:eb30547ba84d 170
va009039 1:eb30547ba84d 171 int Semihost::sys_remove(uint32_t arg) // 0x0e
va009039 1:eb30547ba84d 172 {
va009039 1:eb30547ba84d 173
va009039 1:eb30547ba84d 174 char name[64];
va009039 1:eb30547ba84d 175 _build_name(name, sizeof(name), arg, arg+4);
va009039 1:eb30547ba84d 176 return remove(name);
va009039 1:eb30547ba84d 177 }
va009039 1:eb30547ba84d 178
va009039 1:eb30547ba84d 179 int Semihost::sys_rename(uint32_t arg) // 0x0f
va009039 1:eb30547ba84d 180 {
va009039 1:eb30547ba84d 181 char oldname[64];
va009039 1:eb30547ba84d 182 char newname[64];
va009039 1:eb30547ba84d 183 _build_name(oldname, sizeof(oldname), arg, arg+4);
va009039 1:eb30547ba84d 184 _build_name(newname, sizeof(newname), arg+8, arg+12);
va009039 1:eb30547ba84d 185 return rename(oldname, newname);
va009039 1:eb30547ba84d 186 }
va009039 1:eb30547ba84d 187
va009039 1:eb30547ba84d 188 int Semihost::sys_exit(uint32_t arg) // 0x18
va009039 1:eb30547ba84d 189 {
va009039 1:eb30547ba84d 190 _pc->printf("\n[semihost]EXIT!!!\n");
va009039 1:eb30547ba84d 191 return -1;
va009039 1:eb30547ba84d 192 }
va009039 1:eb30547ba84d 193
va009039 1:eb30547ba84d 194 void Semihost::_build_name(char* buf, int size, uint32_t arg1, uint32_t arg2)
va009039 1:eb30547ba84d 195 {
va009039 1:eb30547ba84d 196 strcpy(buf, _dirpath);
va009039 1:eb30547ba84d 197 uint32_t p = rd<uint32_t>(arg1);
va009039 1:eb30547ba84d 198 int len = rd<uint32_t>(arg2);
va009039 1:eb30547ba84d 199 int pos = strlen(buf);
va009039 1:eb30547ba84d 200 if (buf[pos-1] != '/') {
va009039 1:eb30547ba84d 201 buf[pos++] = '/';
va009039 1:eb30547ba84d 202 buf[pos] = '\0';
va009039 1:eb30547ba84d 203 }
va009039 1:eb30547ba84d 204 for(int i = 0; i < len && pos < size-1; i++) {
va009039 1:eb30547ba84d 205 buf[pos++] = rd<uint8_t>(p++);
va009039 1:eb30547ba84d 206 }
va009039 1:eb30547ba84d 207 buf[pos] = '\0';
va009039 1:eb30547ba84d 208 }
va009039 1:eb30547ba84d 209
va009039 1:eb30547ba84d 210 int Semihost::usr_xffind(uint32_t arg) // 0x100
va009039 1:eb30547ba84d 211 {
va009039 1:eb30547ba84d 212 return -1;
va009039 1:eb30547ba84d 213 }
va009039 1:eb30547ba84d 214
va009039 1:eb30547ba84d 215 int Semihost::usr_uid(uint32_t arg) // 0x101
va009039 1:eb30547ba84d 216 {
va009039 1:eb30547ba84d 217 uint32_t uid = rd<uint32_t>(arg);
va009039 1:eb30547ba84d 218 uint32_t len = rd<uint32_t>(arg+4);
va009039 1:eb30547ba84d 219 const uint8_t mac[] = {0x00, 0x02, 0xf7, 0xf0, 0x00, 0x00};
va009039 1:eb30547ba84d 220 for(int i = 0; i < sizeof(mac) && i < len; i++) {
va009039 1:eb30547ba84d 221 wr<uint8_t>(uid+i, mac[i]);
va009039 1:eb30547ba84d 222 }
va009039 1:eb30547ba84d 223 return 0;
va009039 1:eb30547ba84d 224 }
va009039 1:eb30547ba84d 225
va009039 1:eb30547ba84d 226 int Semihost::usr_reset(uint32_t arg) // 0x102
va009039 1:eb30547ba84d 227 {
va009039 1:eb30547ba84d 228 _target->Reset();
va009039 1:eb30547ba84d 229 _target->setup();
va009039 1:eb30547ba84d 230 return 0;
va009039 1:eb30547ba84d 231 }
va009039 1:eb30547ba84d 232
va009039 1:eb30547ba84d 233 int Semihost::usr_vbus(uint32_t arg) // 0x103
va009039 1:eb30547ba84d 234 {
va009039 1:eb30547ba84d 235 return -1;
va009039 1:eb30547ba84d 236 }
va009039 1:eb30547ba84d 237
va009039 1:eb30547ba84d 238 int Semihost::usr_powerdown(uint32_t arg) // 0x104
va009039 1:eb30547ba84d 239 {
va009039 1:eb30547ba84d 240 return -1;
va009039 1:eb30547ba84d 241 }
va009039 1:eb30547ba84d 242
va009039 1:eb30547ba84d 243 int Semihost::usr_disabledebug(uint32_t arg) // 0x105
va009039 1:eb30547ba84d 244 {
va009039 1:eb30547ba84d 245 return -1;
va009039 1:eb30547ba84d 246 }