Suga koubou
/
USB_CDC
USBCDC.cpp@0:d644bf01b0cb, 2011-11-08 (annotated)
- Committer:
- okini3939
- Date:
- Tue Nov 08 15:46:25 2011 +0000
- Revision:
- 0:d644bf01b0cb
- Child:
- 1:e5b352a3e0a9
Who changed what in which revision?
User | Revision | Line number | New 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 | } |