Suga koubou
/
USB_CDC
USBCDC.cpp
- Committer:
- okini3939
- Date:
- 2011-11-09
- Revision:
- 1:e5b352a3e0a9
- Parent:
- 0:d644bf01b0cb
File content as of revision 1:e5b352a3e0a9:
#include "stdint.h" #include "USBCDC.h" #include "USBBusInterface.h" #include "USBDevice.h" void USBCDC::attach(void (*fptr)(char*, int)) { cdc_evt = fptr; } USBCDC::USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) { cdc_evt = NULL; } bool USBCDC::EPBULK_OUT_callback() { uint8_t buf[64]; uint16_t len; read(EPBULK_OUT, buf, &len, MAX_PACKET_SIZE_EPBULK); if (cdc_evt) { cdc_evt((char*)buf, len); } // We reactivate the endpoint to receive next characters readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK); return true; } bool USBCDC::USBCallback_request () { bool success = false; CONTROL_TRANSFER *transfer = getTransferPtr(); // DBG("USBCallback_request: type %x, request %x\r\n", transfer->setup.bmRequestType.Type, transfer->setup.bRequest); /* Process standard requests */ if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE)) { switch (transfer->setup.bRequest) { default: break; } } if (transfer->setup.bmRequestType.Type == CLASS_TYPE) { switch (transfer->setup.bRequest) { case 0x20: // CDC set line coding case 0x22: // CDC set control line state case 0x23: // CDC Alt-B // DBG("val=%x idx=%x len=%x\r\n", transfer->setup.wValue, transfer->setup.wIndex, transfer->setup.wLength); success = true; break; case 0x21: // CDC get line coding static uint8_t LineConfig[] = {0x00, 0xc0, 0x01, 0x00, 0, 0, 8}; transfer->remaining = 7; transfer->ptr = LineConfig; transfer->direction = DEVICE_TO_HOST; success = true; break; default: break; } } return success; } bool USBCDC::USBCallback_setConfiguration(uint8_t configuration) { // Called in ISR context // Set configuration. Return false if the // configuration is not supported. if (configuration != DEFAULT_CONFIGURATION) { return false; } addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT); // Configure endpoints > 0 addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK); addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK); // We activate the endpoint to be able to receive data readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK); return true; } uint8_t * USBCDC::stringIinterfaceDesc() { static uint8_t stringIinterfaceDescriptor[] = { 14, //bLength STRING_DESCRIPTOR, //bDescriptorType 0x03 'C',0,'D',0,'C',0,'D',0,'E',0,'V',0 //bString iInterface - Audio }; return stringIinterfaceDescriptor; } uint8_t * USBCDC::stringIproductDesc() { static uint8_t stringIproductDescriptor[] = { 24, //bLength STRING_DESCRIPTOR, //bDescriptorType 0x03 'M',0,'b',0,'e',0,'d',0,' ',0,'D',0,'e',0,'v',0,'i',0,'c',0,'e',0 //bString iProduct - Mbed Audio }; return stringIproductDescriptor; } uint8_t * USBCDC::configurationDesc() { static uint8_t configDescriptor[] = { // configuration descriptor 0x09, 0x02, 67, 0x00, 0x02, 0x01, 0x00, 0xC0, 0x32, // CDC // control class interface 0x09, 0x04, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00, // header functional descriptor 0x05, 0x24, 0x00, 0x10, 0x01, // call management functional descriptor 0x05, 0x24, 0x01, 0x01, 0x01, // ACM functional descriptor 0x04, 0x24, 0x02, 0x02, // union functional descriptor 0x05, 0x24, 0x06, 0x00, 0x01, // notification EP 0x07, 0x05, 0x81, 0x03, 0x10, 0x00, 0x0A, // data class interface descriptor 0x09, 0x04, 0x01, 0x00, 0x02, 0x0A, 0x00, 0x00, 0x00, // data EP OUT 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, // data EP IN 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, }; return configDescriptor; } uint8_t * USBCDC::deviceDesc() { static uint8_t deviceDescriptor[] = { DEVICE_DESCRIPTOR_LENGTH, /* bLength */ DEVICE_DESCRIPTOR, /* bDescriptorType */ LSB(0x01), /* bcdUSB (LSB) */ MSB(0x01), /* bcdUSB (MSB) */ 0x02, /* bDeviceClass */ 0x00, /* bDeviceSubClass */ 0x00, /* bDeviceprotocol */ MAX_PACKET_SIZE_EP0, /* bMaxPacketSize0 */ LSB(VENDOR_ID), /* idVendor (LSB) */ MSB(VENDOR_ID), /* idVendor (MSB) */ LSB(PRODUCT_ID), /* idProduct (LSB) */ MSB(PRODUCT_ID), /* idProduct (MSB) */ LSB(PRODUCT_RELEASE), /* bcdDevice (LSB) */ MSB(PRODUCT_RELEASE), /* bcdDevice (MSB) */ STRING_OFFSET_IMANUFACTURER, /* iManufacturer */ STRING_OFFSET_IPRODUCT, /* iProduct */ STRING_OFFSET_ISERIAL, /* iSerialNumber */ 0x01 /* bNumConfigurations */ }; return deviceDescriptor; }