adding additional features

Committer:
sam_grove
Date:
Wed Jun 26 20:35:10 2013 +0000
Revision:
0:2d90573426d7
add dynamic connection and terminal status feedback to the embedded application

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 0:2d90573426d7 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
sam_grove 0:2d90573426d7 2 *
sam_grove 0:2d90573426d7 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
sam_grove 0:2d90573426d7 4 * and associated documentation files (the "Software"), to deal in the Software without
sam_grove 0:2d90573426d7 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
sam_grove 0:2d90573426d7 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
sam_grove 0:2d90573426d7 7 * Software is furnished to do so, subject to the following conditions:
sam_grove 0:2d90573426d7 8 *
sam_grove 0:2d90573426d7 9 * The above copyright notice and this permission notice shall be included in all copies or
sam_grove 0:2d90573426d7 10 * substantial portions of the Software.
sam_grove 0:2d90573426d7 11 *
sam_grove 0:2d90573426d7 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
sam_grove 0:2d90573426d7 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
sam_grove 0:2d90573426d7 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
sam_grove 0:2d90573426d7 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
sam_grove 0:2d90573426d7 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sam_grove 0:2d90573426d7 17 */
sam_grove 0:2d90573426d7 18
sam_grove 0:2d90573426d7 19 #include "stdint.h"
sam_grove 0:2d90573426d7 20 #include "USBCDC.h"
sam_grove 0:2d90573426d7 21
sam_grove 0:2d90573426d7 22 static uint8_t cdc_line_coding[7] = {0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08};
sam_grove 0:2d90573426d7 23 // baud[0,1] stop[x], parity[x], bits[6]
sam_grove 0:2d90573426d7 24
sam_grove 0:2d90573426d7 25 #define DEFAULT_CONFIGURATION (1)
sam_grove 0:2d90573426d7 26
sam_grove 0:2d90573426d7 27 #define CDC_SET_LINE_CODING 0x20
sam_grove 0:2d90573426d7 28 #define CDC_GET_LINE_CODING 0x21
sam_grove 0:2d90573426d7 29 #define CDC_SET_CONTROL_LINE_STATE 0x22
sam_grove 0:2d90573426d7 30
sam_grove 0:2d90573426d7 31 #define MAX_CDC_REPORT_SIZE MAX_PACKET_SIZE_EPBULK
sam_grove 0:2d90573426d7 32
sam_grove 0:2d90573426d7 33 USBCDC::USBCDC( uint16_t vendor_id, uint16_t product_id, uint16_t product_release ): USBDevice( vendor_id, product_id, product_release )
sam_grove 0:2d90573426d7 34 {
sam_grove 0:2d90573426d7 35 // Moving this up into the USBSerial class
sam_grove 0:2d90573426d7 36 //USBDevice::connect();
sam_grove 0:2d90573426d7 37 terminal_status = 0;
sam_grove 0:2d90573426d7 38 }
sam_grove 0:2d90573426d7 39
sam_grove 0:2d90573426d7 40 uint8_t USBCDC::terminalIsOpen( void )
sam_grove 0:2d90573426d7 41 {
sam_grove 0:2d90573426d7 42 return ( terminal_status ) ? 1 : 0;
sam_grove 0:2d90573426d7 43 }
sam_grove 0:2d90573426d7 44
sam_grove 0:2d90573426d7 45 bool USBCDC::USBCallback_request( void )
sam_grove 0:2d90573426d7 46 {
sam_grove 0:2d90573426d7 47 /* Called in ISR context */
sam_grove 0:2d90573426d7 48 bool success = false;
sam_grove 0:2d90573426d7 49 CONTROL_TRANSFER *transfer = getTransferPtr();
sam_grove 0:2d90573426d7 50
sam_grove 0:2d90573426d7 51 /* Process class-specific requests */
sam_grove 0:2d90573426d7 52
sam_grove 0:2d90573426d7 53 if ( transfer->setup.bmRequestType.Type == CLASS_TYPE )
sam_grove 0:2d90573426d7 54 {
sam_grove 0:2d90573426d7 55 switch ( transfer->setup.bRequest )
sam_grove 0:2d90573426d7 56 {
sam_grove 0:2d90573426d7 57 case CDC_GET_LINE_CODING:
sam_grove 0:2d90573426d7 58 transfer->remaining = 7;
sam_grove 0:2d90573426d7 59 transfer->ptr = cdc_line_coding;
sam_grove 0:2d90573426d7 60 transfer->direction = DEVICE_TO_HOST;
sam_grove 0:2d90573426d7 61 success = true;
sam_grove 0:2d90573426d7 62 break;
sam_grove 0:2d90573426d7 63
sam_grove 0:2d90573426d7 64 case CDC_SET_LINE_CODING:
sam_grove 0:2d90573426d7 65 transfer->remaining = 7;
sam_grove 0:2d90573426d7 66 success = true;
sam_grove 0:2d90573426d7 67 break;
sam_grove 0:2d90573426d7 68
sam_grove 0:2d90573426d7 69 case CDC_SET_CONTROL_LINE_STATE:
sam_grove 0:2d90573426d7 70 // Look at DTR to determine if the terminal is opened on the PC
sam_grove 0:2d90573426d7 71 terminal_status = ( uint8_t )transfer->setup.wValue & 0x01;
sam_grove 0:2d90573426d7 72 success = true;
sam_grove 0:2d90573426d7 73 break;
sam_grove 0:2d90573426d7 74
sam_grove 0:2d90573426d7 75 default:
sam_grove 0:2d90573426d7 76 break;
sam_grove 0:2d90573426d7 77 }
sam_grove 0:2d90573426d7 78 }
sam_grove 0:2d90573426d7 79
sam_grove 0:2d90573426d7 80 return success;
sam_grove 0:2d90573426d7 81 }
sam_grove 0:2d90573426d7 82
sam_grove 0:2d90573426d7 83
sam_grove 0:2d90573426d7 84 // Called in ISR context
sam_grove 0:2d90573426d7 85 // Set configuration. Return false if the
sam_grove 0:2d90573426d7 86 // configuration is not supported.
sam_grove 0:2d90573426d7 87 bool USBCDC::USBCallback_setConfiguration( uint8_t configuration )
sam_grove 0:2d90573426d7 88 {
sam_grove 0:2d90573426d7 89 if ( configuration != DEFAULT_CONFIGURATION )
sam_grove 0:2d90573426d7 90 {
sam_grove 0:2d90573426d7 91 return false;
sam_grove 0:2d90573426d7 92 }
sam_grove 0:2d90573426d7 93
sam_grove 0:2d90573426d7 94 // Configure endpoints > 0
sam_grove 0:2d90573426d7 95 addEndpoint( EPINT_IN, MAX_PACKET_SIZE_EPINT );
sam_grove 0:2d90573426d7 96 addEndpoint( EPBULK_IN, MAX_PACKET_SIZE_EPBULK );
sam_grove 0:2d90573426d7 97 addEndpoint( EPBULK_OUT, MAX_PACKET_SIZE_EPBULK );
sam_grove 0:2d90573426d7 98 // We activate the endpoint to be able to recceive data
sam_grove 0:2d90573426d7 99 readStart( EPBULK_OUT, MAX_PACKET_SIZE_EPBULK );
sam_grove 0:2d90573426d7 100 return true;
sam_grove 0:2d90573426d7 101 }
sam_grove 0:2d90573426d7 102
sam_grove 0:2d90573426d7 103 bool USBCDC::send( uint8_t *buffer, uint32_t size )
sam_grove 0:2d90573426d7 104 {
sam_grove 0:2d90573426d7 105 return USBDevice::write( EPBULK_IN, buffer, size, MAX_CDC_REPORT_SIZE );
sam_grove 0:2d90573426d7 106 }
sam_grove 0:2d90573426d7 107
sam_grove 0:2d90573426d7 108 bool USBCDC::readEP( uint8_t *buffer, uint32_t *size )
sam_grove 0:2d90573426d7 109 {
sam_grove 0:2d90573426d7 110 if ( !USBDevice::readEP( EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE ) )
sam_grove 0:2d90573426d7 111 {
sam_grove 0:2d90573426d7 112 return false;
sam_grove 0:2d90573426d7 113 }
sam_grove 0:2d90573426d7 114
sam_grove 0:2d90573426d7 115 if ( !readStart( EPBULK_OUT, MAX_CDC_REPORT_SIZE ) )
sam_grove 0:2d90573426d7 116 {
sam_grove 0:2d90573426d7 117 return false;
sam_grove 0:2d90573426d7 118 }
sam_grove 0:2d90573426d7 119
sam_grove 0:2d90573426d7 120 return true;
sam_grove 0:2d90573426d7 121 }
sam_grove 0:2d90573426d7 122
sam_grove 0:2d90573426d7 123 bool USBCDC::readEP_NB( uint8_t *buffer, uint32_t *size )
sam_grove 0:2d90573426d7 124 {
sam_grove 0:2d90573426d7 125 if ( !USBDevice::readEP_NB( EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE ) )
sam_grove 0:2d90573426d7 126 {
sam_grove 0:2d90573426d7 127 return false;
sam_grove 0:2d90573426d7 128 }
sam_grove 0:2d90573426d7 129
sam_grove 0:2d90573426d7 130 if ( !readStart( EPBULK_OUT, MAX_CDC_REPORT_SIZE ) )
sam_grove 0:2d90573426d7 131 {
sam_grove 0:2d90573426d7 132 return false;
sam_grove 0:2d90573426d7 133 }
sam_grove 0:2d90573426d7 134
sam_grove 0:2d90573426d7 135 return true;
sam_grove 0:2d90573426d7 136 }
sam_grove 0:2d90573426d7 137
sam_grove 0:2d90573426d7 138
sam_grove 0:2d90573426d7 139 uint8_t *USBCDC::deviceDesc()
sam_grove 0:2d90573426d7 140 {
sam_grove 0:2d90573426d7 141 static uint8_t deviceDescriptor[] =
sam_grove 0:2d90573426d7 142 {
sam_grove 0:2d90573426d7 143 18, // bLength
sam_grove 0:2d90573426d7 144 1, // bDescriptorType
sam_grove 0:2d90573426d7 145 0x10, 0x01, // bcdUSB
sam_grove 0:2d90573426d7 146 2, // bDeviceClass
sam_grove 0:2d90573426d7 147 0, // bDeviceSubClass
sam_grove 0:2d90573426d7 148 0, // bDeviceProtocol
sam_grove 0:2d90573426d7 149 MAX_PACKET_SIZE_EP0, // bMaxPacketSize0
sam_grove 0:2d90573426d7 150 LSB( VENDOR_ID ), MSB( VENDOR_ID ), // idVendor
sam_grove 0:2d90573426d7 151 LSB( PRODUCT_ID ), MSB( PRODUCT_ID ), // idProduct
sam_grove 0:2d90573426d7 152 0x00, 0x01, // bcdDevice
sam_grove 0:2d90573426d7 153 1, // iManufacturer
sam_grove 0:2d90573426d7 154 2, // iProduct
sam_grove 0:2d90573426d7 155 3, // iSerialNumber
sam_grove 0:2d90573426d7 156 1 // bNumConfigurations
sam_grove 0:2d90573426d7 157 };
sam_grove 0:2d90573426d7 158 return deviceDescriptor;
sam_grove 0:2d90573426d7 159 }
sam_grove 0:2d90573426d7 160
sam_grove 0:2d90573426d7 161 uint8_t *USBCDC::stringIinterfaceDesc()
sam_grove 0:2d90573426d7 162 {
sam_grove 0:2d90573426d7 163 static uint8_t stringIinterfaceDescriptor[] =
sam_grove 0:2d90573426d7 164 {
sam_grove 0:2d90573426d7 165 0x08,
sam_grove 0:2d90573426d7 166 STRING_DESCRIPTOR,
sam_grove 0:2d90573426d7 167 'C', 0, 'D', 0, 'C', 0,
sam_grove 0:2d90573426d7 168 };
sam_grove 0:2d90573426d7 169 return stringIinterfaceDescriptor;
sam_grove 0:2d90573426d7 170 }
sam_grove 0:2d90573426d7 171
sam_grove 0:2d90573426d7 172 uint8_t *USBCDC::stringIproductDesc()
sam_grove 0:2d90573426d7 173 {
sam_grove 0:2d90573426d7 174 static uint8_t stringIproductDescriptor[] =
sam_grove 0:2d90573426d7 175 {
sam_grove 0:2d90573426d7 176 0x16,
sam_grove 0:2d90573426d7 177 STRING_DESCRIPTOR,
sam_grove 0:2d90573426d7 178 'C', 0, 'D', 0, 'C', 0, ' ', 0, 'D', 0, 'E', 0, 'V', 0, 'I', 0, 'C', 0, 'E', 0
sam_grove 0:2d90573426d7 179 };
sam_grove 0:2d90573426d7 180 return stringIproductDescriptor;
sam_grove 0:2d90573426d7 181 }
sam_grove 0:2d90573426d7 182
sam_grove 0:2d90573426d7 183
sam_grove 0:2d90573426d7 184 #define CONFIG1_DESC_SIZE (9+9+5+5+4+5+7+9+7+7)
sam_grove 0:2d90573426d7 185
sam_grove 0:2d90573426d7 186 uint8_t *USBCDC::configurationDesc()
sam_grove 0:2d90573426d7 187 {
sam_grove 0:2d90573426d7 188 static uint8_t configDescriptor[] =
sam_grove 0:2d90573426d7 189 {
sam_grove 0:2d90573426d7 190 9, // bLength;
sam_grove 0:2d90573426d7 191 2, // bDescriptorType;
sam_grove 0:2d90573426d7 192 LSB( CONFIG1_DESC_SIZE ), // wTotalLength
sam_grove 0:2d90573426d7 193 MSB( CONFIG1_DESC_SIZE ),
sam_grove 0:2d90573426d7 194 2, // bNumInterfaces
sam_grove 0:2d90573426d7 195 1, // bConfigurationValue
sam_grove 0:2d90573426d7 196 0, // iConfiguration
sam_grove 0:2d90573426d7 197 0x80, // bmAttributes
sam_grove 0:2d90573426d7 198 50, // bMaxPower
sam_grove 0:2d90573426d7 199
sam_grove 0:2d90573426d7 200 // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
sam_grove 0:2d90573426d7 201 9, // bLength
sam_grove 0:2d90573426d7 202 4, // bDescriptorType
sam_grove 0:2d90573426d7 203 0, // bInterfaceNumber
sam_grove 0:2d90573426d7 204 0, // bAlternateSetting
sam_grove 0:2d90573426d7 205 1, // bNumEndpoints
sam_grove 0:2d90573426d7 206 0x02, // bInterfaceClass
sam_grove 0:2d90573426d7 207 0x02, // bInterfaceSubClass
sam_grove 0:2d90573426d7 208 0x01, // bInterfaceProtocol
sam_grove 0:2d90573426d7 209 0, // iInterface
sam_grove 0:2d90573426d7 210
sam_grove 0:2d90573426d7 211 // CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26
sam_grove 0:2d90573426d7 212 5, // bFunctionLength
sam_grove 0:2d90573426d7 213 0x24, // bDescriptorType
sam_grove 0:2d90573426d7 214 0x00, // bDescriptorSubtype
sam_grove 0:2d90573426d7 215 0x10, 0x01, // bcdCDC
sam_grove 0:2d90573426d7 216
sam_grove 0:2d90573426d7 217 // Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27
sam_grove 0:2d90573426d7 218 5, // bFunctionLength
sam_grove 0:2d90573426d7 219 0x24, // bDescriptorType
sam_grove 0:2d90573426d7 220 0x01, // bDescriptorSubtype
sam_grove 0:2d90573426d7 221 0x03, // bmCapabilities
sam_grove 0:2d90573426d7 222 1, // bDataInterface
sam_grove 0:2d90573426d7 223
sam_grove 0:2d90573426d7 224 // Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28
sam_grove 0:2d90573426d7 225 4, // bFunctionLength
sam_grove 0:2d90573426d7 226 0x24, // bDescriptorType
sam_grove 0:2d90573426d7 227 0x02, // bDescriptorSubtype
sam_grove 0:2d90573426d7 228 0x06, // bmCapabilities
sam_grove 0:2d90573426d7 229
sam_grove 0:2d90573426d7 230 // Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33
sam_grove 0:2d90573426d7 231 5, // bFunctionLength
sam_grove 0:2d90573426d7 232 0x24, // bDescriptorType
sam_grove 0:2d90573426d7 233 0x06, // bDescriptorSubtype
sam_grove 0:2d90573426d7 234 0, // bMasterInterface
sam_grove 0:2d90573426d7 235 1, // bSlaveInterface0
sam_grove 0:2d90573426d7 236
sam_grove 0:2d90573426d7 237 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
sam_grove 0:2d90573426d7 238 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
sam_grove 0:2d90573426d7 239 ENDPOINT_DESCRIPTOR, // bDescriptorType
sam_grove 0:2d90573426d7 240 PHY_TO_DESC( EPINT_IN ), // bEndpointAddress
sam_grove 0:2d90573426d7 241 E_INTERRUPT, // bmAttributes (0x03=intr)
sam_grove 0:2d90573426d7 242 LSB( MAX_PACKET_SIZE_EPINT ), // wMaxPacketSize (LSB)
sam_grove 0:2d90573426d7 243 MSB( MAX_PACKET_SIZE_EPINT ), // wMaxPacketSize (MSB)
sam_grove 0:2d90573426d7 244 16, // bInterval
sam_grove 0:2d90573426d7 245
sam_grove 0:2d90573426d7 246
sam_grove 0:2d90573426d7 247
sam_grove 0:2d90573426d7 248
sam_grove 0:2d90573426d7 249 // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
sam_grove 0:2d90573426d7 250 9, // bLength
sam_grove 0:2d90573426d7 251 4, // bDescriptorType
sam_grove 0:2d90573426d7 252 1, // bInterfaceNumber
sam_grove 0:2d90573426d7 253 0, // bAlternateSetting
sam_grove 0:2d90573426d7 254 2, // bNumEndpoints
sam_grove 0:2d90573426d7 255 0x0A, // bInterfaceClass
sam_grove 0:2d90573426d7 256 0x00, // bInterfaceSubClass
sam_grove 0:2d90573426d7 257 0x00, // bInterfaceProtocol
sam_grove 0:2d90573426d7 258 0, // iInterface
sam_grove 0:2d90573426d7 259
sam_grove 0:2d90573426d7 260 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
sam_grove 0:2d90573426d7 261 7, // bLength
sam_grove 0:2d90573426d7 262 5, // bDescriptorType
sam_grove 0:2d90573426d7 263 PHY_TO_DESC( EPBULK_IN ), // bEndpointAddress
sam_grove 0:2d90573426d7 264 0x02, // bmAttributes (0x02=bulk)
sam_grove 0:2d90573426d7 265 LSB( MAX_PACKET_SIZE_EPBULK ), // wMaxPacketSize (LSB)
sam_grove 0:2d90573426d7 266 MSB( MAX_PACKET_SIZE_EPBULK ), // wMaxPacketSize (MSB)
sam_grove 0:2d90573426d7 267 0, // bInterval
sam_grove 0:2d90573426d7 268
sam_grove 0:2d90573426d7 269 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
sam_grove 0:2d90573426d7 270 7, // bLength
sam_grove 0:2d90573426d7 271 5, // bDescriptorType
sam_grove 0:2d90573426d7 272 PHY_TO_DESC( EPBULK_OUT ), // bEndpointAddress
sam_grove 0:2d90573426d7 273 0x02, // bmAttributes (0x02=bulk)
sam_grove 0:2d90573426d7 274 LSB( MAX_PACKET_SIZE_EPBULK ), // wMaxPacketSize (LSB)
sam_grove 0:2d90573426d7 275 MSB( MAX_PACKET_SIZE_EPBULK ), // wMaxPacketSize (MSB)
sam_grove 0:2d90573426d7 276 0 // bInterval
sam_grove 0:2d90573426d7 277 };
sam_grove 0:2d90573426d7 278 return configDescriptor;
sam_grove 0:2d90573426d7 279 }
sam_grove 0:2d90573426d7 280