USB CDC (serial) and USB MSC (strage) Composite Device. http://mbed.org/users/okini3939/notebook/USB_Device/
Dependencies: ChaNFSSD mbed ChaNFS
Revision 2:5db90410bb90, committed 2011-12-23
- Comitter:
- okini3939
- Date:
- Fri Dec 23 16:37:58 2011 +0000
- Parent:
- 1:bb08a84162b7
- Commit message:
Changed in this revision
--- a/USBCDCMSC/USBCDCMSC.cpp Fri Dec 23 15:39:13 2011 +0000 +++ b/USBCDCMSC/USBCDCMSC.cpp Fri Dec 23 16:37:58 2011 +0000 @@ -27,6 +27,7 @@ #define CDC_SET_LINE_CODING 0x20 #define CDC_GET_LINE_CODING 0x21 #define CDC_SET_CONTROL_LINE_STATE 0x22 +#define CDC_SEND_BREAK 0x23 #define MAX_CDC_REPORT_SIZE MAX_PACKET_SIZE_EPBULK @@ -77,9 +78,11 @@ USBCDCMSC::USBCDCMSC(SDFileSystem *sd, uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release), cdcbuf(128), _sd(sd) { + cdcbreak = 0; _status = NO_INIT; connect(); - USBDevice::connect(); +// USBDevice::connect(); + USBHAL::connect(); } bool USBCDCMSC::USBCallback_request(void) { @@ -106,6 +109,10 @@ case CDC_SET_CONTROL_LINE_STATE: success = true; break; + case CDC_SEND_BREAK: + cdcbreak = 1; + success = true; + break; case MSC_REQUEST_RESET: reset(); success = true; @@ -411,7 +418,7 @@ } //connect the device - USBDevice::connect(); +// USBDevice::connect(); return true; } @@ -838,6 +845,12 @@ return true; } +int USBCDCMSC::isBreak () { + int ret = cdcbreak; + cdcbreak = 0; + return ret; +} + int USBCDCMSC::disk_initialize() { if (_sd->disk_initialize()) { _status |= NO_DISK;
--- a/USBCDCMSC/USBCDCMSC.h Fri Dec 23 15:39:13 2011 +0000 +++ b/USBCDCMSC/USBCDCMSC.h Fri Dec 23 16:37:58 2011 +0000 @@ -191,7 +191,7 @@ FunctionPointer rx; CircBuffer<uint8_t> cdcbuf; - + int cdcbreak; // MSC Bulk-only Stage enum Stage { @@ -265,6 +265,8 @@ void reset(); void fail(); + int isBreak(); + int disk_initialize(); int disk_write(const char *buffer, int block_number); int disk_read(char *buffer, int block_number);
--- a/main.cpp Fri Dec 23 15:39:13 2011 +0000 +++ b/main.cpp Fri Dec 23 16:37:58 2011 +0000 @@ -3,6 +3,7 @@ #include "SDFileSystem.h" #include <new> +DigitalOut myled(LED1); Serial pc(USBTX, USBRX); SDFileSystem sd(p5, p6, p7, p8, "sd"); USBCDCMSC cdcmsc(&sd); @@ -75,27 +76,45 @@ } int main() { - int c; + int c, u = 0; + Timer timer; set_new_handler(no_memory); // new handler function readfile("/sd/test.txt"); + timer.start(); while(1) { - if (cdcmsc.available()) { + if (timer.read_ms() > 500) { + myled = myled ? 0 : 1; + timer.reset(); + } + + if (u != cdcmsc.configured()) { + u = cdcmsc.configured(); + printf("configured %d\r\n", u); + } + + if (u && cdcmsc.available()) { // CDC -> pc serial c = cdcmsc.getc(); - pc.putc(c); if (c == '?') { listdir(&cdcmsc); + } else { + pc.putc(c); } } if (pc.readable()) { // PC serial -> CDC c = pc.getc(); - cdcmsc.putc(c); if (c == '?') { listdir(&pc); + } else { + if (u) { + cdcmsc.putc(c); + } else { + pc.putc(c); + } } } }