USB Composite support
Dependents: mbed_cdc_hid_composite
Fork of USBDevice by
Diff: USBSerial/USBCDC.cpp
- 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)