USB composite device example program, drag-and-drop flash writer.
Dependencies: SWD USBDevice mbed BaseDAP
tests/RamDisk.cpp@0:2385683c867a, 2013-09-17 (annotated)
- Committer:
- va009039
- Date:
- Tue Sep 17 04:33:44 2013 +0000
- Revision:
- 0:2385683c867a
- Child:
- 1:ea8e179320d7
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:2385683c867a | 1 | // RamDisk.cpp 2013/9/16 |
va009039 | 0:2385683c867a | 2 | #include "mbed.h" |
va009039 | 0:2385683c867a | 3 | #include "RamDisk.h" |
va009039 | 0:2385683c867a | 4 | |
va009039 | 0:2385683c867a | 5 | RamDisk::RamDisk() : _head(NULL) |
va009039 | 0:2385683c867a | 6 | { |
va009039 | 0:2385683c867a | 7 | _sectors = 128; // 64KB(512*128) |
va009039 | 0:2385683c867a | 8 | } |
va009039 | 0:2385683c867a | 9 | |
va009039 | 0:2385683c867a | 10 | int RamDisk::read(uint8_t * data, uint32_t block) |
va009039 | 0:2385683c867a | 11 | { |
va009039 | 0:2385683c867a | 12 | SectorData* p = find(block); |
va009039 | 0:2385683c867a | 13 | if (p) { |
va009039 | 0:2385683c867a | 14 | memcpy(data, p->data, 512); |
va009039 | 0:2385683c867a | 15 | return 0; |
va009039 | 0:2385683c867a | 16 | } |
va009039 | 0:2385683c867a | 17 | memset(data, 0x00, 512); |
va009039 | 0:2385683c867a | 18 | return 0; |
va009039 | 0:2385683c867a | 19 | } |
va009039 | 0:2385683c867a | 20 | |
va009039 | 0:2385683c867a | 21 | static bool is_blank(const uint8_t* data) |
va009039 | 0:2385683c867a | 22 | { |
va009039 | 0:2385683c867a | 23 | for(int i = 0; i < 512; i++) { |
va009039 | 0:2385683c867a | 24 | if (data[i]) { |
va009039 | 0:2385683c867a | 25 | return false; |
va009039 | 0:2385683c867a | 26 | } |
va009039 | 0:2385683c867a | 27 | } |
va009039 | 0:2385683c867a | 28 | return true; |
va009039 | 0:2385683c867a | 29 | } |
va009039 | 0:2385683c867a | 30 | |
va009039 | 0:2385683c867a | 31 | int RamDisk::write(const uint8_t * data, uint32_t block) |
va009039 | 0:2385683c867a | 32 | { |
va009039 | 0:2385683c867a | 33 | SectorData* p = find(block); |
va009039 | 0:2385683c867a | 34 | if (p) { |
va009039 | 0:2385683c867a | 35 | memcpy(p->data, data, 512); |
va009039 | 0:2385683c867a | 36 | return 0; |
va009039 | 0:2385683c867a | 37 | } |
va009039 | 0:2385683c867a | 38 | if (is_blank(data)) { |
va009039 | 0:2385683c867a | 39 | return 0; |
va009039 | 0:2385683c867a | 40 | } |
va009039 | 0:2385683c867a | 41 | p = new SectorData; |
va009039 | 0:2385683c867a | 42 | p->block = block; |
va009039 | 0:2385683c867a | 43 | memcpy(p->data, data, 512); |
va009039 | 0:2385683c867a | 44 | p->next = _head; |
va009039 | 0:2385683c867a | 45 | _head = p; |
va009039 | 0:2385683c867a | 46 | return 0; |
va009039 | 0:2385683c867a | 47 | } |
va009039 | 0:2385683c867a | 48 | |
va009039 | 0:2385683c867a | 49 | uint32_t RamDisk::sectors() |
va009039 | 0:2385683c867a | 50 | { |
va009039 | 0:2385683c867a | 51 | return _sectors; |
va009039 | 0:2385683c867a | 52 | } |
va009039 | 0:2385683c867a | 53 | |
va009039 | 0:2385683c867a | 54 | SectorData* RamDisk::find(uint16_t block) |
va009039 | 0:2385683c867a | 55 | { |
va009039 | 0:2385683c867a | 56 | SectorData* p = _head; |
va009039 | 0:2385683c867a | 57 | while(p) { |
va009039 | 0:2385683c867a | 58 | if (p->block == block) { |
va009039 | 0:2385683c867a | 59 | break; |
va009039 | 0:2385683c867a | 60 | } |
va009039 | 0:2385683c867a | 61 | p = p->next; |
va009039 | 0:2385683c867a | 62 | } |
va009039 | 0:2385683c867a | 63 | return p; |
va009039 | 0:2385683c867a | 64 | } |
va009039 | 0:2385683c867a | 65 | |
va009039 | 0:2385683c867a | 66 | void RamDisk::exportData(Stream* pc) |
va009039 | 0:2385683c867a | 67 | { |
va009039 | 0:2385683c867a | 68 | pc->printf("\n\n\n\n\n"); |
va009039 | 0:2385683c867a | 69 | SectorData* p = _head; |
va009039 | 0:2385683c867a | 70 | while(p) { |
va009039 | 0:2385683c867a | 71 | pc->printf("const uint8_t sector_%d[] = {\n", p->block); |
va009039 | 0:2385683c867a | 72 | for(int i = 0; i < 512; i++) { |
va009039 | 0:2385683c867a | 73 | pc->printf("0x%02x,", p->data[i]); |
va009039 | 0:2385683c867a | 74 | if (i%16 == 15) { |
va009039 | 0:2385683c867a | 75 | pc->printf("\n"); |
va009039 | 0:2385683c867a | 76 | } |
va009039 | 0:2385683c867a | 77 | } |
va009039 | 0:2385683c867a | 78 | pc->printf("};\n"); |
va009039 | 0:2385683c867a | 79 | p = p->next; |
va009039 | 0:2385683c867a | 80 | } |
va009039 | 0:2385683c867a | 81 | |
va009039 | 0:2385683c867a | 82 | pc->printf("const SectorIndex sector_index[] = {\n"); |
va009039 | 0:2385683c867a | 83 | p = _head; |
va009039 | 0:2385683c867a | 84 | while(p) { |
va009039 | 0:2385683c867a | 85 | pc->printf("{%d, sector_%d},\n", p->block, p->block); |
va009039 | 0:2385683c867a | 86 | p = p->next; |
va009039 | 0:2385683c867a | 87 | } |
va009039 | 0:2385683c867a | 88 | pc->printf("{-1, NULL},\n"); |
va009039 | 0:2385683c867a | 89 | pc->printf("};\n"); |
va009039 | 0:2385683c867a | 90 | pc->printf("\n\n\n\n\n"); |
va009039 | 0:2385683c867a | 91 | } |