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 // 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 }