USB device stack

Dependents:   mbed-mX-USB-TEST1 USBMSD_SD_HID_HelloWorld HidTest MIDI_usb_bridge ... more

Legacy Warning

This is an mbed 2 library. To learn more about mbed OS 5, visit the docs.

Pull requests against this repository are no longer supported. Please raise against mbed OS 5 as documented above.

Files at this revision

API Documentation at this revision

Comitter:
mbed_official
Date:
Tue Nov 05 09:45:23 2013 +0000
Parent:
14:d495202c90f4
Child:
16:4f6df64750bd
Commit message:
Synchronized with git revision cf71d0831be92a7fff88da13626ef25dd94fa185

Changed in this revision

USBSerial/USBCDC.cpp Show annotated file Show diff for this revision Revisions of this file
USBSerial/USBCDC.h Show annotated file Show diff for this revision Revisions of this file
USBSerial/USBSerial.h Show annotated file Show diff for this revision Revisions of this file
--- a/USBSerial/USBCDC.cpp	Thu Sep 12 14:45:27 2013 +0100
+++ b/USBSerial/USBCDC.cpp	Tue Nov 05 09:45:23 2013 +0000
@@ -52,6 +52,7 @@
                 break;
             case CDC_SET_LINE_CODING:
                 transfer->remaining = 7;
+                transfer->notify = true;
                 success = true;
                 terminal_connected = true;
                 break;
@@ -67,6 +68,31 @@
     return success;
 }
 
+void USBCDC::USBCallback_requestCompleted(uint8_t *buf, uint32_t length) {
+    // Request of setting line coding has 7 bytes
+    if (length != 7) {
+        return;
+    }
+    
+    CONTROL_TRANSFER * transfer = getTransferPtr();
+ 
+    /* Process class-specific requests */
+    if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
+        if (transfer->setup.bRequest == CDC_SET_LINE_CODING) {
+            if (memcmp(cdc_line_coding, buf, 7)) {
+                memcpy(cdc_line_coding, buf, 7); 
+ 
+                int baud = buf[0] + (buf[1] << 8)
+                         + (buf[2] << 16) + (buf[3] << 24);
+                int stop = buf[4];
+                int bits = buf[6];
+                int parity = buf[5];
+
+                lineCodingChanged(baud, bits, parity, stop);
+            }
+        }
+    }
+}
 
 // Called in ISR context
 // Set configuration. Return false if the
--- a/USBSerial/USBCDC.h	Thu Sep 12 14:45:27 2013 +0100
+++ b/USBSerial/USBCDC.h	Tue Nov 05 09:45:23 2013 +0000
@@ -99,9 +99,21 @@
     * @returns true if successful
     */
     bool readEP_NB(uint8_t * buffer, uint32_t * size);
+
+    /*
+    * Called by USBCallback_requestCompleted when CDC line coding is changed
+    * Warning: Called in ISR
+    *
+    * @param baud The baud rate
+    * @param bits The number of bits in a word (5-8)
+    * @param parity The parity
+    * @param stop The number of stop bits (1 or 2)
+    */
+    virtual void lineCodingChanged(int baud, int bits, int parity, int stop) {};
     
 protected:
     virtual bool USBCallback_request();
+    virtual void USBCallback_requestCompleted(uint8_t *buf, uint32_t length);
     virtual bool USBCallback_setConfiguration(uint8_t configuration);
     volatile bool terminal_connected;
 
--- a/USBSerial/USBSerial.h	Thu Sep 12 14:45:27 2013 +0100
+++ b/USBSerial/USBSerial.h	Tue Nov 05 09:45:23 2013 +0000
@@ -55,7 +55,9 @@
     * @param product_release Your preoduct_release (default: 0x0001)
     *
     */
-    USBSerial(uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001): USBCDC(vendor_id, product_id, product_release), buf(128){ };
+    USBSerial(uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001): USBCDC(vendor_id, product_id, product_release), buf(128){
+        settingsChangedCallback = 0;
+    };
 
 
     /**
@@ -79,6 +81,22 @@
     * @returns the number of bytes available
     */
     uint8_t available(); 
+
+    /** Determine if there is a character available to read
+     *
+     *  @returns
+     *    1 if there is a character available to read,
+     *    0 otherwise
+     */
+    int readable() { return available() ? 1 : 0; }
+    
+    /** Determine if there is space available to write a character
+     *
+     *  @returns
+     *    1 if there is space to write a character,
+     *    0 otherwise
+     */
+    int writeable() { return 1; } // always return 1, for write operation is blocking
     
     /**
     * Write a block of data. 
@@ -110,19 +128,33 @@
      *
      * @param fptr function pointer
      */
-    void attach(void (*fn)(void)) {
-        if(fn != NULL) {
-            rx.attach(fn);
+    void attach(void (*fptr)(void)) {
+        if(fptr != NULL) {
+            rx.attach(fptr);
         }
     }
 
+    /**
+     * Attach a callback to call when serial's settings are changed.
+     *
+     * @param fptr function pointer
+     */
+    void attach(void (*fptr)(int baud, int bits, int parity, int stop)) {
+        settingsChangedCallback = fptr;
+    }
 
 protected:
     virtual bool EP2_OUT_callback();
+    virtual void lineCodingChanged(int baud, int bits, int parity, int stop){
+        if (settingsChangedCallback) {
+            settingsChangedCallback(baud, bits, parity, stop);
+        }
+    }
 
 private:
     FunctionPointer rx;
     CircBuffer<uint8_t> buf;
+    void (*settingsChangedCallback)(int baud, int bits, int parity, int stop);
 };
 
 #endif