USB CDC (serial) and USB MSC (strage) Composite Device. http://mbed.org/users/okini3939/notebook/USB_Device/

Dependencies:   ChaNFSSD mbed ChaNFS

Files at this revision

API Documentation at this revision

Comitter:
okini3939
Date:
Fri Dec 23 16:37:58 2011 +0000
Parent:
1:bb08a84162b7
Commit message:

Changed in this revision

USBCDCMSC/USBCDCMSC.cpp Show annotated file Show diff for this revision Revisions of this file
USBCDCMSC/USBCDCMSC.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- 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);
+                }
             }
         }
     }