Slingshot Controller

Dependencies:   ADXL345 DebounceIn USBDevice mbed

Committer:
Brandon
Date:
Wed Oct 17 16:33:04 2012 +0000
Revision:
1:2721dc2acc2c
Parent:
0:cf17ea89fd09
Updated comments, added names, cleaned old code.

Who changed what in which revision?

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