USB composite device example program, drag-and-drop flash writer.
Dependencies: SWD USBDevice mbed BaseDAP
USBMSD_LPC.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 | // USBMSD_LPC.cpp 2013/9/17 |
va009039 | 0:2385683c867a | 2 | #include "mbed.h" |
va009039 | 0:2385683c867a | 3 | #include "USBMSD_LPC.h" |
va009039 | 0:2385683c867a | 4 | #include "mydebug.h" |
va009039 | 0:2385683c867a | 5 | |
va009039 | 0:2385683c867a | 6 | USBMSD_LPC::USBMSD_LPC(PinName swdio, PinName swclk, PinName reset, Serial* usbpc) |
va009039 | 0:2385683c867a | 7 | : _target(swdio, swclk, reset), _pc(usbpc) |
va009039 | 0:2385683c867a | 8 | { |
va009039 | 0:2385683c867a | 9 | _target.setup(); |
va009039 | 0:2385683c867a | 10 | _flash = new Flash(&_target, _pc); |
va009039 | 0:2385683c867a | 11 | _status = 0x01; |
va009039 | 0:2385683c867a | 12 | _prog_mode = false; |
va009039 | 0:2385683c867a | 13 | connect(); |
va009039 | 0:2385683c867a | 14 | } |
va009039 | 0:2385683c867a | 15 | |
va009039 | 0:2385683c867a | 16 | /* virtual */ int USBMSD_LPC::disk_initialize() |
va009039 | 0:2385683c867a | 17 | { |
va009039 | 0:2385683c867a | 18 | _status = 0x00; |
va009039 | 0:2385683c867a | 19 | return 0; |
va009039 | 0:2385683c867a | 20 | } |
va009039 | 0:2385683c867a | 21 | |
va009039 | 0:2385683c867a | 22 | /* virtual */ int USBMSD_LPC::disk_status() |
va009039 | 0:2385683c867a | 23 | { |
va009039 | 0:2385683c867a | 24 | return _status; |
va009039 | 0:2385683c867a | 25 | } |
va009039 | 0:2385683c867a | 26 | |
va009039 | 0:2385683c867a | 27 | /* virtual */ int USBMSD_LPC::disk_read(uint8_t * data, uint64_t block) |
va009039 | 0:2385683c867a | 28 | { |
va009039 | 0:2385683c867a | 29 | DBG("block=%d", (int)block); |
va009039 | 0:2385683c867a | 30 | return _romdisk.read(data, block); |
va009039 | 0:2385683c867a | 31 | } |
va009039 | 0:2385683c867a | 32 | |
va009039 | 0:2385683c867a | 33 | /* virtual */ int USBMSD_LPC::disk_write(const uint8_t * data, uint64_t block) |
va009039 | 0:2385683c867a | 34 | { |
va009039 | 0:2385683c867a | 35 | DBG("block=%d", (int)block); |
va009039 | 0:2385683c867a | 36 | if (_prog_mode == false) { |
va009039 | 0:2385683c867a | 37 | if (_romdisk.is_data(block)) { |
va009039 | 0:2385683c867a | 38 | _addr = 0; |
va009039 | 0:2385683c867a | 39 | flashBinary(_addr, data, 512); |
va009039 | 0:2385683c867a | 40 | _prev_block = block; |
va009039 | 0:2385683c867a | 41 | _addr += 512; |
va009039 | 0:2385683c867a | 42 | _prog_mode = true; |
va009039 | 0:2385683c867a | 43 | _pc->printf("Writing."); |
va009039 | 0:2385683c867a | 44 | } |
va009039 | 0:2385683c867a | 45 | } else { |
va009039 | 0:2385683c867a | 46 | if (!_romdisk.is_data(block)) { |
va009039 | 0:2385683c867a | 47 | _pc->printf("passed.\n"); |
va009039 | 0:2385683c867a | 48 | _target.SoftwareReset(); |
va009039 | 0:2385683c867a | 49 | _prog_mode = false; |
va009039 | 0:2385683c867a | 50 | } else if ((_prev_block+1) != block) { |
va009039 | 0:2385683c867a | 51 | _prog_mode = false; |
va009039 | 0:2385683c867a | 52 | } else { |
va009039 | 0:2385683c867a | 53 | flashBinary(_addr, data, 512); |
va009039 | 0:2385683c867a | 54 | _pc->printf("."); |
va009039 | 0:2385683c867a | 55 | _prev_block = block; |
va009039 | 0:2385683c867a | 56 | _addr += 512; |
va009039 | 0:2385683c867a | 57 | } |
va009039 | 0:2385683c867a | 58 | } |
va009039 | 0:2385683c867a | 59 | return _romdisk.write(data, block); |
va009039 | 0:2385683c867a | 60 | } |
va009039 | 0:2385683c867a | 61 | |
va009039 | 0:2385683c867a | 62 | /* virtual */ uint64_t USBMSD_LPC::disk_sectors() |
va009039 | 0:2385683c867a | 63 | { |
va009039 | 0:2385683c867a | 64 | return _romdisk.sectors(); |
va009039 | 0:2385683c867a | 65 | } |
va009039 | 0:2385683c867a | 66 | |
va009039 | 0:2385683c867a | 67 | /* virtual */ uint64_t USBMSD_LPC::disk_size() |
va009039 | 0:2385683c867a | 68 | { |
va009039 | 0:2385683c867a | 69 | return _romdisk.sectors() * 512; |
va009039 | 0:2385683c867a | 70 | } |
va009039 | 0:2385683c867a | 71 | |
va009039 | 0:2385683c867a | 72 | void USBMSD_LPC::flashBinary(int addr, const uint8_t* buf, int size) |
va009039 | 0:2385683c867a | 73 | { |
va009039 | 0:2385683c867a | 74 | DBG("addr=%d(%d)", addr, size); |
va009039 | 0:2385683c867a | 75 | if (addr == 0) { |
va009039 | 0:2385683c867a | 76 | _flash->init(); |
va009039 | 0:2385683c867a | 77 | _flash->eraseAll(); |
va009039 | 0:2385683c867a | 78 | } |
va009039 | 0:2385683c867a | 79 | _flash->write(addr, buf, size); |
va009039 | 0:2385683c867a | 80 | } |