USB Composite support

Dependents:   mbed_cdc_hid_composite

Fork of USBDevice by mbed official

Revision:
55:7c559fcb1d17
Parent:
25:7c72828865f3
--- a/USBDevice/USBDevice.h	Fri May 22 08:45:47 2015 +0100
+++ b/USBDevice/USBDevice.h	Sun May 31 15:36:50 2015 +0000
@@ -22,11 +22,13 @@
 #include "mbed.h"
 #include "USBDevice_Types.h"
 #include "USBHAL.h"
+#include "USBInterface.h"
+
 
 class USBDevice: public USBHAL
 {
 public:
-    USBDevice(uint16_t vendor_id, uint16_t product_id, uint16_t product_release);
+    USBDevice(uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001);
 
     /*
     * Check if the device is configured
@@ -126,6 +128,7 @@
     */
     virtual void USBCallback_busReset(void) {};
 
+
     /*
     * Called by USBDevice on Endpoint0 request. Warning: Called in ISR context
     * This is used to handle extensions to standard requests
@@ -133,7 +136,12 @@
     *
     * @returns true if class handles this request
     */
-    virtual bool USBCallback_request() { return false; };
+    virtual bool USBCallback_request() {
+        if (_intf)
+            return _intf->USBCallback_request();
+        else
+            return false;
+    };
 
     /*
     * Called by USBDevice on Endpoint0 request completion
@@ -145,7 +153,10 @@
     * @param buf buffer received on endpoint 0
     * @param length length of this buffer
     */
-    virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length) {};
+    virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length) {
+        if (_intf)
+            _intf->USBCallback_requestCompleted(buf, length);
+    };
 
     /*
     * Called by USBDevice layer. Set configuration of the device.
@@ -153,7 +164,11 @@
     *
     * @param configuration Number of the configuration
     */
-    virtual bool USBCallback_setConfiguration(uint8_t configuration) { return false; };
+    virtual bool USBCallback_setConfiguration(uint8_t configuration) {
+        if (_intf)
+            return _intf->USBCallback_setConfiguration(configuration);
+        return false;
+    };
 
     /*
      * Called by USBDevice layer. Set interface/alternate of the device.
@@ -176,7 +191,11 @@
     *
     * @returns pointer to the configuration descriptor
     */
-    virtual uint8_t * configurationDesc(){return NULL;};
+    virtual uint8_t * configurationDesc(){
+        if (_intf)
+            return _intf->configurationDesc();
+        return NULL;
+    };
 
     /*
     * Get string lang id descriptor
@@ -227,7 +246,16 @@
     */
     virtual uint16_t reportDescLength() { return 0; };
 
+    CONTROL_TRANSFER * getTransferPtr(void);
 
+    virtual bool bind(USBInterface *intf) {
+        _intf = intf;
+        return true;
+    }
+
+    uint16_t VENDOR_ID;
+    uint16_t PRODUCT_ID;
+    uint16_t PRODUCT_RELEASE;
 
 protected:
     virtual void busReset(void);
@@ -237,11 +265,7 @@
     virtual void connectStateChanged(unsigned int connected);
     virtual void suspendStateChanged(unsigned int suspended);
     uint8_t * findDescriptor(uint8_t descriptorType);
-    CONTROL_TRANSFER * getTransferPtr(void);
 
-    uint16_t VENDOR_ID;
-    uint16_t PRODUCT_ID;
-    uint16_t PRODUCT_RELEASE;
 
 private:
     bool addRateFeedbackEndpoint(uint8_t endpoint, uint32_t maxPacket);
@@ -265,6 +289,8 @@
 
     uint16_t currentInterface;
     uint8_t currentAlternate;
+
+    USBInterface *_intf;
 };