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:
Thu Feb 20 09:43:03 2014 +0000
Revision:
9:7e71c20c96e4
Parent:
7:acfd2dbff157
update ramdisk

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 7:acfd2dbff157 1 #include "RamDisk.h"
va009039 7:acfd2dbff157 2
va009039 7:acfd2dbff157 3 #if (DEBUG2 > 3)
va009039 7:acfd2dbff157 4 #define RAMDISK_DBG(...) do{fprintf(stderr,"[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);fprintf(stderr,"\r\n");} while(0);
va009039 7:acfd2dbff157 5 #else
va009039 7:acfd2dbff157 6 #define RAMDISK_DBG(...)
va009039 7:acfd2dbff157 7 #endif
va009039 7:acfd2dbff157 8
va009039 9:7e71c20c96e4 9 RamDisk::RamDisk(int sectors):_sectors(sectors)
va009039 7:acfd2dbff157 10 {
va009039 9:7e71c20c96e4 11 onUpdate = NULL;
va009039 7:acfd2dbff157 12 format();
va009039 7:acfd2dbff157 13 }
va009039 7:acfd2dbff157 14
va009039 7:acfd2dbff157 15 /* virtual */ uint32_t RamDisk::storage_sectors()
va009039 7:acfd2dbff157 16 {
va009039 7:acfd2dbff157 17 return _sectors;
va009039 7:acfd2dbff157 18 }
va009039 7:acfd2dbff157 19
va009039 7:acfd2dbff157 20 /* virtual */ uint32_t RamDisk::storage_size()
va009039 7:acfd2dbff157 21 {
va009039 7:acfd2dbff157 22 return _sectors * 512;
va009039 7:acfd2dbff157 23 }
va009039 7:acfd2dbff157 24
va009039 7:acfd2dbff157 25 /* virtual */ int RamDisk::storage_read(uint8_t * data, uint32_t block)
va009039 7:acfd2dbff157 26 {
va009039 7:acfd2dbff157 27 RAMDISK_DBG("R block=%d", block);
va009039 9:7e71c20c96e4 28 update();
va009039 7:acfd2dbff157 29 memset(data, 0x00, 512);
va009039 7:acfd2dbff157 30 if (_sector_image.count(block) > 0) {
va009039 7:acfd2dbff157 31 uint8_t* buf = _sector_image[block];
va009039 7:acfd2dbff157 32 int size = buf[0]|(buf[1]<<8);
va009039 9:7e71c20c96e4 33 size &= 0x7fff; // remove ROM area bit
va009039 7:acfd2dbff157 34 memcpy(data, buf + 2, size);
va009039 7:acfd2dbff157 35 }
va009039 7:acfd2dbff157 36 return 0;
va009039 7:acfd2dbff157 37 }
va009039 7:acfd2dbff157 38
va009039 7:acfd2dbff157 39 static int block_size(const uint8_t* data)
va009039 7:acfd2dbff157 40 {
va009039 7:acfd2dbff157 41 for(int i = 512-1; i >= 0; i--) {
va009039 7:acfd2dbff157 42 if (data[i] != 0x00) {
va009039 7:acfd2dbff157 43 return i+1;
va009039 7:acfd2dbff157 44 }
va009039 7:acfd2dbff157 45 }
va009039 7:acfd2dbff157 46 return 0;
va009039 7:acfd2dbff157 47 }
va009039 7:acfd2dbff157 48
va009039 7:acfd2dbff157 49 /* virtual */ int RamDisk::storage_write(const uint8_t * data, uint32_t block)
va009039 7:acfd2dbff157 50 {
va009039 9:7e71c20c96e4 51 update();
va009039 7:acfd2dbff157 52 int size = block_size(data);
va009039 7:acfd2dbff157 53 if (_sector_image.count(block) > 0) {
va009039 7:acfd2dbff157 54 uint8_t* buf = _sector_image[block];
va009039 9:7e71c20c96e4 55 if (!(buf[1] & 0x80)) { // ROM area
va009039 7:acfd2dbff157 56 free(buf);
va009039 7:acfd2dbff157 57 }
va009039 7:acfd2dbff157 58 buf = (uint8_t*)malloc(size + 2);
va009039 7:acfd2dbff157 59 if (buf == NULL) {
va009039 7:acfd2dbff157 60 RAMDISK_DBG("DISK FULL");
va009039 7:acfd2dbff157 61 exit(1);
va009039 7:acfd2dbff157 62 return 1;
va009039 7:acfd2dbff157 63 }
va009039 7:acfd2dbff157 64 _sector_image[block] = buf;
va009039 7:acfd2dbff157 65 buf[0] = size;
va009039 7:acfd2dbff157 66 buf[1] = size>>8;
va009039 7:acfd2dbff157 67 memcpy(buf + 2, data, size);
va009039 7:acfd2dbff157 68 RAMDISK_DBG("W block=%d size=%d", (int)block, size);
va009039 7:acfd2dbff157 69 } else if (size > 0) {
va009039 7:acfd2dbff157 70 uint8_t* buf = (uint8_t*)malloc(size + 2);
va009039 7:acfd2dbff157 71 if (buf == NULL) {
va009039 7:acfd2dbff157 72 RAMDISK_DBG("DISK FULL");
va009039 7:acfd2dbff157 73 exit(1);
va009039 7:acfd2dbff157 74 return 1;
va009039 7:acfd2dbff157 75 }
va009039 7:acfd2dbff157 76 _sector_image[block] = (uint8_t*)buf;
va009039 7:acfd2dbff157 77 buf[0] = size;
va009039 7:acfd2dbff157 78 buf[1] = size>>8;
va009039 7:acfd2dbff157 79
va009039 7:acfd2dbff157 80 memcpy(buf + 2, data, size);
va009039 7:acfd2dbff157 81 RAMDISK_DBG("W block=%d size=%d NEW %d", (int)block, size, _sector_image.size());
va009039 7:acfd2dbff157 82 } else {
va009039 7:acfd2dbff157 83 RAMDISK_DBG("W block=%d BLANK", (int)block);
va009039 7:acfd2dbff157 84 }
va009039 7:acfd2dbff157 85 return 0;
va009039 7:acfd2dbff157 86 }
va009039 7:acfd2dbff157 87
va009039 7:acfd2dbff157 88 void RamDisk::dump(int mode)
va009039 7:acfd2dbff157 89 {
va009039 7:acfd2dbff157 90 printf("static const uint8_t block_image[] = { // %d blocks\n", _sector_image.size());
va009039 7:acfd2dbff157 91 for(int i = 0; i < _sector_image.size(); i++) {
va009039 7:acfd2dbff157 92 int block = _sector_image.getKey(i);
va009039 7:acfd2dbff157 93 uint8_t* buf = _sector_image[block];
va009039 7:acfd2dbff157 94 int size = buf[0]|(buf[1]<<8);
va009039 9:7e71c20c96e4 95 size &= 0x7fff;
va009039 9:7e71c20c96e4 96 printf("0x%02x,0x%02x,0x%02x|0x80, // block=%d, size=%d, ROM area\n",
va009039 7:acfd2dbff157 97 block, buf[0], buf[1], block, size);
va009039 7:acfd2dbff157 98 if (mode == 1) {
va009039 7:acfd2dbff157 99 for(int j = 0; j < size; j++) {
va009039 7:acfd2dbff157 100 printf("0x%02x,", buf[j+2]);
va009039 7:acfd2dbff157 101 if ((j % 16) == 15 || j == size-1) {
va009039 7:acfd2dbff157 102 printf("\n");
va009039 7:acfd2dbff157 103 }
va009039 7:acfd2dbff157 104 }
va009039 7:acfd2dbff157 105 }
va009039 7:acfd2dbff157 106 }
va009039 7:acfd2dbff157 107 printf("0xff};\n");
va009039 7:acfd2dbff157 108 }
va009039 7:acfd2dbff157 109