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
src/RamDisk.cpp@9:7e71c20c96e4, 2014-02-20 (annotated)
- 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?
User | Revision | Line number | New 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 |