USB composite device example program, drag-and-drop flash writer.

Dependencies:   SWD USBDevice mbed BaseDAP

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?

UserRevisionLine numberNew 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 }