Emulation of LocalFileSystem with virtual COM.
Dependents: KL46Z-lpc81isp lpcterm2
#include "USBLocalFileSystem.h" int main() { USBLocalFileSystem* usb_local = new USBLocalFileSystem(); // RamDisk(64KB) while(1) { usb_local->lock(true); usb_local->remount(); char filename[32]; if (usb_local->find(filename, sizeof(filename), "*.TXT")) { FILE* fp = fopen(filename, "r"); if (fp) { int c; while((c = fgetc(fp)) != EOF) { usb_local->putc(c); } fclose(fp); } } usb_local->lock(false); wait_ms(1000*5); } }
Sample application:
Import programKL46Z-lpc81isp
ISP example program.
Import programlpcterm2
semihost server example program
src/RamDisk.cpp@2:97c314eae8b8, 2014-05-06 (annotated)
- Committer:
- va009039
- Date:
- Tue May 06 15:42:30 2014 +0900
- Branch:
- branch
- Revision:
- 2:97c314eae8b8
- Parent:
- 0:39eb4d5b97df
add USB MSD block operation.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:39eb4d5b97df | 1 | #include "RamDisk.h" |
va009039 | 0:39eb4d5b97df | 2 | |
va009039 | 0:39eb4d5b97df | 3 | #if (DEBUG2 > 3) |
va009039 | 0:39eb4d5b97df | 4 | #define RAMDISK_DBG(...) do{fprintf(stderr,"[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);fprintf(stderr,"\r\n");} while(0); |
va009039 | 0:39eb4d5b97df | 5 | #else |
va009039 | 0:39eb4d5b97df | 6 | #define RAMDISK_DBG(...) |
va009039 | 0:39eb4d5b97df | 7 | #endif |
va009039 | 0:39eb4d5b97df | 8 | |
va009039 | 0:39eb4d5b97df | 9 | RamDisk::RamDisk(int sectors):_sectors(sectors) |
va009039 | 0:39eb4d5b97df | 10 | { |
va009039 | 0:39eb4d5b97df | 11 | format(); |
va009039 | 0:39eb4d5b97df | 12 | } |
va009039 | 0:39eb4d5b97df | 13 | |
va009039 | 0:39eb4d5b97df | 14 | /* virtual */ uint32_t RamDisk::storage_sectors() |
va009039 | 0:39eb4d5b97df | 15 | { |
va009039 |
2:97c314eae8b8 | 16 | report_sectors_count++; |
va009039 | 0:39eb4d5b97df | 17 | return _sectors; |
va009039 | 0:39eb4d5b97df | 18 | } |
va009039 | 0:39eb4d5b97df | 19 | |
va009039 | 0:39eb4d5b97df | 20 | /* virtual */ uint32_t RamDisk::storage_size() |
va009039 | 0:39eb4d5b97df | 21 | { |
va009039 |
2:97c314eae8b8 | 22 | report_size_count++; |
va009039 | 0:39eb4d5b97df | 23 | return _sectors * 512; |
va009039 | 0:39eb4d5b97df | 24 | } |
va009039 | 0:39eb4d5b97df | 25 | |
va009039 | 0:39eb4d5b97df | 26 | /* virtual */ int RamDisk::storage_read(uint8_t * data, uint32_t block) |
va009039 | 0:39eb4d5b97df | 27 | { |
va009039 | 0:39eb4d5b97df | 28 | RAMDISK_DBG("R block=%d", block); |
va009039 |
2:97c314eae8b8 | 29 | report_read_count++; |
va009039 | 0:39eb4d5b97df | 30 | memset(data, 0x00, 512); |
va009039 | 0:39eb4d5b97df | 31 | if (_sector_image.count(block) > 0) { |
va009039 | 0:39eb4d5b97df | 32 | uint8_t* buf = _sector_image[block]; |
va009039 | 0:39eb4d5b97df | 33 | int size = buf[0]|(buf[1]<<8); |
va009039 | 0:39eb4d5b97df | 34 | size &= 0x7fff; // remove ROM area bit |
va009039 | 0:39eb4d5b97df | 35 | memcpy(data, buf + 2, size); |
va009039 | 0:39eb4d5b97df | 36 | } |
va009039 | 0:39eb4d5b97df | 37 | return 0; |
va009039 | 0:39eb4d5b97df | 38 | } |
va009039 | 0:39eb4d5b97df | 39 | |
va009039 | 0:39eb4d5b97df | 40 | static int block_size(const uint8_t* data) |
va009039 | 0:39eb4d5b97df | 41 | { |
va009039 | 0:39eb4d5b97df | 42 | for(int i = 512-1; i >= 0; i--) { |
va009039 | 0:39eb4d5b97df | 43 | if (data[i] != 0x00) { |
va009039 | 0:39eb4d5b97df | 44 | return i+1; |
va009039 | 0:39eb4d5b97df | 45 | } |
va009039 | 0:39eb4d5b97df | 46 | } |
va009039 | 0:39eb4d5b97df | 47 | return 0; |
va009039 | 0:39eb4d5b97df | 48 | } |
va009039 | 0:39eb4d5b97df | 49 | |
va009039 | 0:39eb4d5b97df | 50 | /* virtual */ int RamDisk::storage_write(const uint8_t * data, uint32_t block) |
va009039 | 0:39eb4d5b97df | 51 | { |
va009039 |
2:97c314eae8b8 | 52 | report_write_count++; |
va009039 | 0:39eb4d5b97df | 53 | int size = block_size(data); |
va009039 | 0:39eb4d5b97df | 54 | if (_sector_image.count(block) > 0) { |
va009039 | 0:39eb4d5b97df | 55 | uint8_t* buf = _sector_image[block]; |
va009039 | 0:39eb4d5b97df | 56 | if (!(buf[1] & 0x80)) { // ROM area |
va009039 | 0:39eb4d5b97df | 57 | free(buf); |
va009039 | 0:39eb4d5b97df | 58 | } |
va009039 | 0:39eb4d5b97df | 59 | buf = (uint8_t*)malloc(size + 2); |
va009039 | 0:39eb4d5b97df | 60 | if (buf == NULL) { |
va009039 | 0:39eb4d5b97df | 61 | RAMDISK_DBG("DISK FULL"); |
va009039 | 0:39eb4d5b97df | 62 | exit(1); |
va009039 | 0:39eb4d5b97df | 63 | return 1; |
va009039 | 0:39eb4d5b97df | 64 | } |
va009039 | 0:39eb4d5b97df | 65 | _sector_image[block] = buf; |
va009039 | 0:39eb4d5b97df | 66 | buf[0] = size; |
va009039 | 0:39eb4d5b97df | 67 | buf[1] = size>>8; |
va009039 | 0:39eb4d5b97df | 68 | memcpy(buf + 2, data, size); |
va009039 | 0:39eb4d5b97df | 69 | RAMDISK_DBG("W block=%d size=%d", (int)block, size); |
va009039 | 0:39eb4d5b97df | 70 | } else if (size > 0) { |
va009039 | 0:39eb4d5b97df | 71 | uint8_t* buf = (uint8_t*)malloc(size + 2); |
va009039 | 0:39eb4d5b97df | 72 | if (buf == NULL) { |
va009039 | 0:39eb4d5b97df | 73 | RAMDISK_DBG("DISK FULL"); |
va009039 | 0:39eb4d5b97df | 74 | exit(1); |
va009039 | 0:39eb4d5b97df | 75 | return 1; |
va009039 | 0:39eb4d5b97df | 76 | } |
va009039 | 0:39eb4d5b97df | 77 | _sector_image[block] = (uint8_t*)buf; |
va009039 | 0:39eb4d5b97df | 78 | buf[0] = size; |
va009039 | 0:39eb4d5b97df | 79 | buf[1] = size>>8; |
va009039 | 0:39eb4d5b97df | 80 | |
va009039 | 0:39eb4d5b97df | 81 | memcpy(buf + 2, data, size); |
va009039 | 0:39eb4d5b97df | 82 | RAMDISK_DBG("W block=%d size=%d NEW %d", (int)block, size, _sector_image.size()); |
va009039 | 0:39eb4d5b97df | 83 | } else { |
va009039 | 0:39eb4d5b97df | 84 | RAMDISK_DBG("W block=%d BLANK", (int)block); |
va009039 | 0:39eb4d5b97df | 85 | } |
va009039 | 0:39eb4d5b97df | 86 | return 0; |
va009039 | 0:39eb4d5b97df | 87 | } |
va009039 | 0:39eb4d5b97df | 88 | |
va009039 | 0:39eb4d5b97df | 89 | void RamDisk::dump(int mode) |
va009039 | 0:39eb4d5b97df | 90 | { |
va009039 | 0:39eb4d5b97df | 91 | printf("static const uint8_t block_image[] = { // %d blocks\n", _sector_image.size()); |
va009039 | 0:39eb4d5b97df | 92 | for(int i = 0; i < _sector_image.size(); i++) { |
va009039 | 0:39eb4d5b97df | 93 | int block = _sector_image.getKey(i); |
va009039 | 0:39eb4d5b97df | 94 | uint8_t* buf = _sector_image[block]; |
va009039 | 0:39eb4d5b97df | 95 | int size = buf[0]|(buf[1]<<8); |
va009039 | 0:39eb4d5b97df | 96 | size &= 0x7fff; |
va009039 | 0:39eb4d5b97df | 97 | printf("0x%02x,0x%02x,0x%02x|0x80, // block=%d, size=%d, ROM area\n", |
va009039 | 0:39eb4d5b97df | 98 | block, buf[0], buf[1], block, size); |
va009039 | 0:39eb4d5b97df | 99 | if (mode == 1) { |
va009039 | 0:39eb4d5b97df | 100 | for(int j = 0; j < size; j++) { |
va009039 | 0:39eb4d5b97df | 101 | printf("0x%02x,", buf[j+2]); |
va009039 | 0:39eb4d5b97df | 102 | if ((j % 16) == 15 || j == size-1) { |
va009039 | 0:39eb4d5b97df | 103 | printf("\n"); |
va009039 | 0:39eb4d5b97df | 104 | } |
va009039 | 0:39eb4d5b97df | 105 | } |
va009039 | 0:39eb4d5b97df | 106 | } |
va009039 | 0:39eb4d5b97df | 107 | } |
va009039 | 0:39eb4d5b97df | 108 | printf("0xff};\n"); |
va009039 | 0:39eb4d5b97df | 109 | } |
va009039 | 0:39eb4d5b97df | 110 |