Dependencies:   mbed

Committer:
okini3939
Date:
Wed Nov 09 09:30:28 2011 +0000
Revision:
1:e5b352a3e0a9
Parent:
0:d644bf01b0cb

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:d644bf01b0cb 1 #include "stdint.h"
okini3939 0:d644bf01b0cb 2 #include "USBCDC.h"
okini3939 0:d644bf01b0cb 3 #include "USBBusInterface.h"
okini3939 0:d644bf01b0cb 4 #include "USBDevice.h"
okini3939 0:d644bf01b0cb 5
okini3939 0:d644bf01b0cb 6 void USBCDC::attach(void (*fptr)(char*, int)) {
okini3939 0:d644bf01b0cb 7 cdc_evt = fptr;
okini3939 0:d644bf01b0cb 8 }
okini3939 0:d644bf01b0cb 9
okini3939 0:d644bf01b0cb 10 USBCDC::USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {
okini3939 0:d644bf01b0cb 11 cdc_evt = NULL;
okini3939 0:d644bf01b0cb 12 }
okini3939 0:d644bf01b0cb 13
okini3939 0:d644bf01b0cb 14 bool USBCDC::EPBULK_OUT_callback() {
okini3939 0:d644bf01b0cb 15 uint8_t buf[64];
okini3939 0:d644bf01b0cb 16 uint16_t len;
okini3939 0:d644bf01b0cb 17
okini3939 0:d644bf01b0cb 18 read(EPBULK_OUT, buf, &len, MAX_PACKET_SIZE_EPBULK);
okini3939 0:d644bf01b0cb 19
okini3939 0:d644bf01b0cb 20 if (cdc_evt) {
okini3939 0:d644bf01b0cb 21 cdc_evt((char*)buf, len);
okini3939 0:d644bf01b0cb 22 }
okini3939 0:d644bf01b0cb 23
okini3939 0:d644bf01b0cb 24 // We reactivate the endpoint to receive next characters
okini3939 0:d644bf01b0cb 25 readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
okini3939 0:d644bf01b0cb 26 return true;
okini3939 0:d644bf01b0cb 27 }
okini3939 0:d644bf01b0cb 28
okini3939 0:d644bf01b0cb 29 bool USBCDC::USBCallback_request () {
okini3939 0:d644bf01b0cb 30 bool success = false;
okini3939 0:d644bf01b0cb 31 CONTROL_TRANSFER *transfer = getTransferPtr();
okini3939 0:d644bf01b0cb 32
okini3939 0:d644bf01b0cb 33 // DBG("USBCallback_request: type %x, request %x\r\n", transfer->setup.bmRequestType.Type, transfer->setup.bRequest);
okini3939 0:d644bf01b0cb 34 /* Process standard requests */
okini3939 0:d644bf01b0cb 35 if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE))
okini3939 0:d644bf01b0cb 36 {
okini3939 0:d644bf01b0cb 37 switch (transfer->setup.bRequest)
okini3939 0:d644bf01b0cb 38 {
okini3939 0:d644bf01b0cb 39 default:
okini3939 0:d644bf01b0cb 40 break;
okini3939 0:d644bf01b0cb 41 }
okini3939 0:d644bf01b0cb 42 }
okini3939 0:d644bf01b0cb 43
okini3939 0:d644bf01b0cb 44 if (transfer->setup.bmRequestType.Type == CLASS_TYPE)
okini3939 0:d644bf01b0cb 45 {
okini3939 0:d644bf01b0cb 46 switch (transfer->setup.bRequest)
okini3939 0:d644bf01b0cb 47 {
okini3939 0:d644bf01b0cb 48 case 0x20: // CDC set line coding
okini3939 0:d644bf01b0cb 49 case 0x22: // CDC set control line state
okini3939 0:d644bf01b0cb 50 case 0x23: // CDC Alt-B
okini3939 0:d644bf01b0cb 51 // DBG("val=%x idx=%x len=%x\r\n", transfer->setup.wValue, transfer->setup.wIndex, transfer->setup.wLength);
okini3939 0:d644bf01b0cb 52 success = true;
okini3939 0:d644bf01b0cb 53 break;
okini3939 0:d644bf01b0cb 54 case 0x21: // CDC get line coding
okini3939 0:d644bf01b0cb 55 static uint8_t LineConfig[] = {0x00, 0xc0, 0x01, 0x00, 0, 0, 8};
okini3939 0:d644bf01b0cb 56 transfer->remaining = 7;
okini3939 0:d644bf01b0cb 57 transfer->ptr = LineConfig;
okini3939 0:d644bf01b0cb 58 transfer->direction = DEVICE_TO_HOST;
okini3939 0:d644bf01b0cb 59 success = true;
okini3939 0:d644bf01b0cb 60 break;
okini3939 0:d644bf01b0cb 61 default:
okini3939 0:d644bf01b0cb 62 break;
okini3939 0:d644bf01b0cb 63 }
okini3939 0:d644bf01b0cb 64 }
okini3939 0:d644bf01b0cb 65
okini3939 0:d644bf01b0cb 66 return success;
okini3939 0:d644bf01b0cb 67 }
okini3939 0:d644bf01b0cb 68
okini3939 0:d644bf01b0cb 69 bool USBCDC::USBCallback_setConfiguration(uint8_t configuration) {
okini3939 0:d644bf01b0cb 70 // Called in ISR context
okini3939 0:d644bf01b0cb 71 // Set configuration. Return false if the
okini3939 0:d644bf01b0cb 72 // configuration is not supported.
okini3939 0:d644bf01b0cb 73 if (configuration != DEFAULT_CONFIGURATION) {
okini3939 0:d644bf01b0cb 74 return false;
okini3939 0:d644bf01b0cb 75 }
okini3939 0:d644bf01b0cb 76
okini3939 0:d644bf01b0cb 77 addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
okini3939 0:d644bf01b0cb 78
okini3939 0:d644bf01b0cb 79 // Configure endpoints > 0
okini3939 0:d644bf01b0cb 80 addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
okini3939 0:d644bf01b0cb 81 addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
okini3939 0:d644bf01b0cb 82
okini3939 0:d644bf01b0cb 83 // We activate the endpoint to be able to receive data
okini3939 0:d644bf01b0cb 84 readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
okini3939 0:d644bf01b0cb 85
okini3939 0:d644bf01b0cb 86 return true;
okini3939 0:d644bf01b0cb 87 }
okini3939 0:d644bf01b0cb 88
okini3939 0:d644bf01b0cb 89
okini3939 0:d644bf01b0cb 90 uint8_t * USBCDC::stringIinterfaceDesc() {
okini3939 0:d644bf01b0cb 91 static uint8_t stringIinterfaceDescriptor[] = {
okini3939 0:d644bf01b0cb 92 14, //bLength
okini3939 0:d644bf01b0cb 93 STRING_DESCRIPTOR, //bDescriptorType 0x03
okini3939 0:d644bf01b0cb 94 'C',0,'D',0,'C',0,'D',0,'E',0,'V',0 //bString iInterface - Audio
okini3939 0:d644bf01b0cb 95 };
okini3939 0:d644bf01b0cb 96 return stringIinterfaceDescriptor;
okini3939 0:d644bf01b0cb 97 }
okini3939 0:d644bf01b0cb 98
okini3939 0:d644bf01b0cb 99 uint8_t * USBCDC::stringIproductDesc() {
okini3939 0:d644bf01b0cb 100 static uint8_t stringIproductDescriptor[] = {
okini3939 0:d644bf01b0cb 101 24, //bLength
okini3939 0:d644bf01b0cb 102 STRING_DESCRIPTOR, //bDescriptorType 0x03
okini3939 0:d644bf01b0cb 103 '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
okini3939 0:d644bf01b0cb 104 };
okini3939 0:d644bf01b0cb 105 return stringIproductDescriptor;
okini3939 0:d644bf01b0cb 106 }
okini3939 0:d644bf01b0cb 107
okini3939 0:d644bf01b0cb 108
okini3939 0:d644bf01b0cb 109 uint8_t * USBCDC::configurationDesc() {
okini3939 0:d644bf01b0cb 110 static uint8_t configDescriptor[] = {
okini3939 0:d644bf01b0cb 111 // configuration descriptor
okini3939 0:d644bf01b0cb 112 0x09, 0x02, 67, 0x00, 0x02, 0x01, 0x00, 0xC0, 0x32,
okini3939 0:d644bf01b0cb 113
okini3939 0:d644bf01b0cb 114 // CDC
okini3939 0:d644bf01b0cb 115 // control class interface
okini3939 0:d644bf01b0cb 116 0x09, 0x04, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00,
okini3939 0:d644bf01b0cb 117 // header functional descriptor
okini3939 0:d644bf01b0cb 118 0x05, 0x24, 0x00, 0x10, 0x01,
okini3939 0:d644bf01b0cb 119 // call management functional descriptor
okini3939 0:d644bf01b0cb 120 0x05, 0x24, 0x01, 0x01, 0x01,
okini3939 0:d644bf01b0cb 121 // ACM functional descriptor
okini3939 0:d644bf01b0cb 122 0x04, 0x24, 0x02, 0x02,
okini3939 0:d644bf01b0cb 123 // union functional descriptor
okini3939 0:d644bf01b0cb 124 0x05, 0x24, 0x06, 0x00, 0x01,
okini3939 0:d644bf01b0cb 125 // notification EP
okini3939 0:d644bf01b0cb 126 0x07, 0x05, 0x81, 0x03, 0x10, 0x00, 0x0A,
okini3939 0:d644bf01b0cb 127 // data class interface descriptor
okini3939 0:d644bf01b0cb 128 0x09, 0x04, 0x01, 0x00, 0x02, 0x0A, 0x00, 0x00, 0x00,
okini3939 0:d644bf01b0cb 129 // data EP OUT
okini3939 0:d644bf01b0cb 130 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00,
okini3939 0:d644bf01b0cb 131 // data EP IN
okini3939 0:d644bf01b0cb 132 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00,
okini3939 0:d644bf01b0cb 133 };
okini3939 0:d644bf01b0cb 134 return configDescriptor;
okini3939 0:d644bf01b0cb 135 }
okini3939 1:e5b352a3e0a9 136
okini3939 1:e5b352a3e0a9 137 uint8_t * USBCDC::deviceDesc() {
okini3939 1:e5b352a3e0a9 138 static uint8_t deviceDescriptor[] = {
okini3939 1:e5b352a3e0a9 139 DEVICE_DESCRIPTOR_LENGTH, /* bLength */
okini3939 1:e5b352a3e0a9 140 DEVICE_DESCRIPTOR, /* bDescriptorType */
okini3939 1:e5b352a3e0a9 141 LSB(0x01), /* bcdUSB (LSB) */
okini3939 1:e5b352a3e0a9 142 MSB(0x01), /* bcdUSB (MSB) */
okini3939 1:e5b352a3e0a9 143 0x02, /* bDeviceClass */
okini3939 1:e5b352a3e0a9 144 0x00, /* bDeviceSubClass */
okini3939 1:e5b352a3e0a9 145 0x00, /* bDeviceprotocol */
okini3939 1:e5b352a3e0a9 146 MAX_PACKET_SIZE_EP0, /* bMaxPacketSize0 */
okini3939 1:e5b352a3e0a9 147 LSB(VENDOR_ID), /* idVendor (LSB) */
okini3939 1:e5b352a3e0a9 148 MSB(VENDOR_ID), /* idVendor (MSB) */
okini3939 1:e5b352a3e0a9 149 LSB(PRODUCT_ID), /* idProduct (LSB) */
okini3939 1:e5b352a3e0a9 150 MSB(PRODUCT_ID), /* idProduct (MSB) */
okini3939 1:e5b352a3e0a9 151 LSB(PRODUCT_RELEASE), /* bcdDevice (LSB) */
okini3939 1:e5b352a3e0a9 152 MSB(PRODUCT_RELEASE), /* bcdDevice (MSB) */
okini3939 1:e5b352a3e0a9 153 STRING_OFFSET_IMANUFACTURER, /* iManufacturer */
okini3939 1:e5b352a3e0a9 154 STRING_OFFSET_IPRODUCT, /* iProduct */
okini3939 1:e5b352a3e0a9 155 STRING_OFFSET_ISERIAL, /* iSerialNumber */
okini3939 1:e5b352a3e0a9 156 0x01 /* bNumConfigurations */
okini3939 1:e5b352a3e0a9 157 };
okini3939 1:e5b352a3e0a9 158 return deviceDescriptor;
okini3939 1:e5b352a3e0a9 159 }