USB Composite support

Dependents:   mbed_cdc_hid_composite

Fork of USBDevice by mbed official

Revision:
55:7c559fcb1d17
Parent:
44:d2638fcd76d9
--- a/USBSerial/USBCDC.cpp	Fri May 22 08:45:47 2015 +0100
+++ b/USBSerial/USBCDC.cpp	Sun May 31 15:36:50 2015 +0000
@@ -33,16 +33,19 @@
 
 #define MAX_CDC_REPORT_SIZE MAX_PACKET_SIZE_EPBULK
 
-USBCDC::USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect_blocking): USBDevice(vendor_id, product_id, product_release) {
+USBCDC::USBCDC(USBDevice *usb, uint8_t ep_int_in, uint8_t ep_bulk_in, uint8_t ep_bulk_out, bool connect_blocking):
+        _usb(usb),
+        _ep_int_in(ep_int_in), _ep_bulk_in(ep_bulk_in), _ep_bulk_out(ep_bulk_out) {
     terminal_connected = false;
-    USBDevice::connect(connect_blocking);
+    _usb->bind(this);
+    _usb->connect(connect_blocking);
 }
 
 bool USBCDC::USBCallback_request(void) {
     /* Called in ISR context */
 
     bool success = false;
-    CONTROL_TRANSFER * transfer = getTransferPtr();
+    CONTROL_TRANSFER * transfer = _usb->getTransferPtr();
 
     /* Process class-specific requests */
 
@@ -81,7 +84,7 @@
         return;
     }
 
-    CONTROL_TRANSFER * transfer = getTransferPtr();
+    CONTROL_TRANSFER * transfer = _usb->getTransferPtr();
 
     /* Process class-specific requests */
     if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
@@ -110,31 +113,31 @@
     }
 
     // Configure endpoints > 0
-    addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
-    addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
-    addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
+    _usb->addEndpoint(_ep_int_in, MAX_PACKET_SIZE_EPINT);
+    _usb->addEndpoint(_ep_bulk_in, MAX_PACKET_SIZE_EPBULK);
+    _usb->addEndpoint(_ep_bulk_out, MAX_PACKET_SIZE_EPBULK);
 
     // We activate the endpoint to be able to recceive data
-    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
+    _usb->readStart(_ep_bulk_out, MAX_PACKET_SIZE_EPBULK);
     return true;
 }
 
 bool USBCDC::send(uint8_t * buffer, uint32_t size) {
-    return USBDevice::write(EPBULK_IN, buffer, size, MAX_CDC_REPORT_SIZE);
+    return _usb->write(_ep_bulk_in, buffer, size, MAX_CDC_REPORT_SIZE);
 }
 
 bool USBCDC::readEP(uint8_t * buffer, uint32_t * size) {
-    if (!USBDevice::readEP(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))
+    if (!_usb->readEP(_ep_bulk_out, buffer, size, MAX_CDC_REPORT_SIZE))
         return false;
-    if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))
+    if (!_usb->readStart(_ep_bulk_out, MAX_CDC_REPORT_SIZE))
         return false;
     return true;
 }
 
 bool USBCDC::readEP_NB(uint8_t * buffer, uint32_t * size) {
-    if (!USBDevice::readEP_NB(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))
+    if (!_usb->readEP_NB(_ep_bulk_out, buffer, size, MAX_CDC_REPORT_SIZE))
         return false;
-    if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))
+    if (!_usb->readStart(_ep_bulk_out, MAX_CDC_REPORT_SIZE))
         return false;
     return true;
 }
@@ -149,8 +152,8 @@
         0,                    // bDeviceSubClass
         0,                    // bDeviceProtocol
         MAX_PACKET_SIZE_EP0,  // bMaxPacketSize0
-        (uint8_t)(LSB(VENDOR_ID)), (uint8_t)(MSB(VENDOR_ID)),  // idVendor
-        (uint8_t)(LSB(PRODUCT_ID)), (uint8_t)(MSB(PRODUCT_ID)),// idProduct
+        (uint8_t)(LSB(_usb->VENDOR_ID)), (uint8_t)(MSB(_usb->VENDOR_ID)),  // idVendor
+        (uint8_t)(LSB(_usb->PRODUCT_ID)), (uint8_t)(MSB(_usb->PRODUCT_ID)),// idProduct
         0x00, 0x01,           // bcdDevice
         1,                    // iManufacturer
         2,                    // iProduct
@@ -244,7 +247,7 @@
         // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
         ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
         ENDPOINT_DESCRIPTOR,            // bDescriptorType
-        PHY_TO_DESC(EPINT_IN),          // bEndpointAddress
+        PHY_TO_DESC(_ep_int_in),          // bEndpointAddress
         E_INTERRUPT,                    // bmAttributes (0x03=intr)
         LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)
         MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)
@@ -267,7 +270,7 @@
         // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
         ENDPOINT_DESCRIPTOR_LENGTH, // bLength
         ENDPOINT_DESCRIPTOR,        // bDescriptorType
-        PHY_TO_DESC(EPBULK_IN),     // bEndpointAddress
+        PHY_TO_DESC(_ep_bulk_in),     // bEndpointAddress
         E_BULK,                     // bmAttributes (0x02=bulk)
         LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
         MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
@@ -276,7 +279,7 @@
         // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
         ENDPOINT_DESCRIPTOR_LENGTH, // bLength
         ENDPOINT_DESCRIPTOR,        // bDescriptorType
-        PHY_TO_DESC(EPBULK_OUT),    // bEndpointAddress
+        PHY_TO_DESC(_ep_bulk_out),    // bEndpointAddress
         E_BULK,                     // bmAttributes (0x02=bulk)
         LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
         MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)