updsted the USB to persuade it to build for the Dragonfly platfom

Fork of USBDevice by mbed official

Committer:
Patrickhalahan
Date:
Fri May 11 09:07:29 2018 +0000
Revision:
72:e5c300b1df2f
Parent:
70:2c525a50f1b6
Just enough to get SD card size to report

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samux 1:80ab0d068708 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
samux 1:80ab0d068708 2 *
samux 1:80ab0d068708 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
samux 1:80ab0d068708 4 * and associated documentation files (the "Software"), to deal in the Software without
samux 1:80ab0d068708 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
samux 1:80ab0d068708 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
samux 1:80ab0d068708 7 * Software is furnished to do so, subject to the following conditions:
samux 1:80ab0d068708 8 *
samux 1:80ab0d068708 9 * The above copyright notice and this permission notice shall be included in all copies or
samux 1:80ab0d068708 10 * substantial portions of the Software.
samux 1:80ab0d068708 11 *
samux 1:80ab0d068708 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
samux 1:80ab0d068708 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
samux 1:80ab0d068708 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
samux 1:80ab0d068708 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
samux 1:80ab0d068708 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
samux 1:80ab0d068708 17 */
samux 1:80ab0d068708 18
samux 1:80ab0d068708 19 #include "stdint.h"
samux 1:80ab0d068708 20 #include "USBHAL.h"
samux 1:80ab0d068708 21 #include "USBHID.h"
samux 1:80ab0d068708 22
samux 1:80ab0d068708 23
samux 1:80ab0d068708 24 USBHID::USBHID(uint8_t output_report_length, uint8_t input_report_length, uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect): USBDevice(vendor_id, product_id, product_release)
samux 1:80ab0d068708 25 {
Patrickhalahan 72:e5c300b1df2f 26
Patrickhalahan 72:e5c300b1df2f 27
Patrickhalahan 72:e5c300b1df2f 28 extern int USBHID_USBHIDInstCount; // debug BL
Patrickhalahan 72:e5c300b1df2f 29 ++USBHID_USBHIDInstCount; // debug BL
Patrickhalahan 72:e5c300b1df2f 30
Patrickhalahan 72:e5c300b1df2f 31
samux 1:80ab0d068708 32 output_length = output_report_length;
samux 1:80ab0d068708 33 input_length = input_report_length;
samux 1:80ab0d068708 34 if(connect) {
samux 1:80ab0d068708 35 USBDevice::connect();
samux 1:80ab0d068708 36 }
samux 1:80ab0d068708 37 }
samux 1:80ab0d068708 38
samux 1:80ab0d068708 39
samux 1:80ab0d068708 40 bool USBHID::send(HID_REPORT *report)
samux 1:80ab0d068708 41 {
Patrickhalahan 72:e5c300b1df2f 42 printf("USBHID::send %s : %d\r\n", __FILE__, __LINE__);
samux 1:80ab0d068708 43 return write(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);
samux 1:80ab0d068708 44 }
samux 1:80ab0d068708 45
samux 1:80ab0d068708 46 bool USBHID::sendNB(HID_REPORT *report)
samux 1:80ab0d068708 47 {
samux 1:80ab0d068708 48 return writeNB(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);
samux 1:80ab0d068708 49 }
samux 1:80ab0d068708 50
samux 1:80ab0d068708 51
samux 1:80ab0d068708 52 bool USBHID::read(HID_REPORT *report)
samux 1:80ab0d068708 53 {
samux 1:80ab0d068708 54 uint32_t bytesRead = 0;
samux 1:80ab0d068708 55 bool result;
samux 1:80ab0d068708 56 result = USBDevice::readEP(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);
samux 1:80ab0d068708 57 if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
samux 1:80ab0d068708 58 return false;
samux 1:80ab0d068708 59 report->length = bytesRead;
samux 1:80ab0d068708 60 return result;
samux 1:80ab0d068708 61 }
samux 1:80ab0d068708 62
samux 1:80ab0d068708 63
samux 1:80ab0d068708 64 bool USBHID::readNB(HID_REPORT *report)
samux 1:80ab0d068708 65 {
samux 1:80ab0d068708 66 uint32_t bytesRead = 0;
samux 1:80ab0d068708 67 bool result;
samux 1:80ab0d068708 68 result = USBDevice::readEP_NB(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);
mbed_official 21:ee9f2fa6bdbc 69 // if readEP_NB did not succeed, does not issue a readStart
mbed_official 21:ee9f2fa6bdbc 70 if (!result)
mbed_official 21:ee9f2fa6bdbc 71 return false;
samux 1:80ab0d068708 72 report->length = bytesRead;
samux 1:80ab0d068708 73 if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
samux 1:80ab0d068708 74 return false;
samux 1:80ab0d068708 75 return result;
samux 1:80ab0d068708 76 }
samux 1:80ab0d068708 77
samux 1:80ab0d068708 78
samux 1:80ab0d068708 79 uint16_t USBHID::reportDescLength() {
samux 1:80ab0d068708 80 reportDesc();
samux 1:80ab0d068708 81 return reportLength;
samux 1:80ab0d068708 82 }
samux 1:80ab0d068708 83
samux 1:80ab0d068708 84
samux 1:80ab0d068708 85
samux 1:80ab0d068708 86 //
samux 1:80ab0d068708 87 // Route callbacks from lower layers to class(es)
samux 1:80ab0d068708 88 //
samux 1:80ab0d068708 89
samux 1:80ab0d068708 90
samux 1:80ab0d068708 91 // Called in ISR context
samux 1:80ab0d068708 92 // Called by USBDevice on Endpoint0 request
samux 1:80ab0d068708 93 // This is used to handle extensions to standard requests
samux 1:80ab0d068708 94 // and class specific requests
samux 1:80ab0d068708 95 // Return true if class handles this request
samux 1:80ab0d068708 96 bool USBHID::USBCallback_request() {
samux 1:80ab0d068708 97 bool success = false;
samux 1:80ab0d068708 98 CONTROL_TRANSFER * transfer = getTransferPtr();
samux 1:80ab0d068708 99 uint8_t *hidDescriptor;
samux 1:80ab0d068708 100
samux 1:80ab0d068708 101 // Process additional standard requests
samux 1:80ab0d068708 102
samux 1:80ab0d068708 103 if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE))
samux 1:80ab0d068708 104 {
samux 1:80ab0d068708 105 switch (transfer->setup.bRequest)
samux 1:80ab0d068708 106 {
samux 1:80ab0d068708 107 case GET_DESCRIPTOR:
samux 1:80ab0d068708 108 switch (DESCRIPTOR_TYPE(transfer->setup.wValue))
samux 1:80ab0d068708 109 {
samux 1:80ab0d068708 110 case REPORT_DESCRIPTOR:
samux 1:80ab0d068708 111 if ((reportDesc() != NULL) \
samux 1:80ab0d068708 112 && (reportDescLength() != 0))
samux 1:80ab0d068708 113 {
samux 1:80ab0d068708 114 transfer->remaining = reportDescLength();
samux 1:80ab0d068708 115 transfer->ptr = reportDesc();
samux 1:80ab0d068708 116 transfer->direction = DEVICE_TO_HOST;
samux 1:80ab0d068708 117 success = true;
samux 1:80ab0d068708 118 }
samux 1:80ab0d068708 119 break;
samux 1:80ab0d068708 120 case HID_DESCRIPTOR:
samux 1:80ab0d068708 121 // Find the HID descriptor, after the configuration descriptor
samux 1:80ab0d068708 122 hidDescriptor = findDescriptor(HID_DESCRIPTOR);
samux 1:80ab0d068708 123 if (hidDescriptor != NULL)
samux 1:80ab0d068708 124 {
samux 1:80ab0d068708 125 transfer->remaining = HID_DESCRIPTOR_LENGTH;
samux 1:80ab0d068708 126 transfer->ptr = hidDescriptor;
samux 1:80ab0d068708 127 transfer->direction = DEVICE_TO_HOST;
samux 1:80ab0d068708 128 success = true;
samux 1:80ab0d068708 129 }
samux 1:80ab0d068708 130 break;
mbed_official 25:7c72828865f3 131
samux 1:80ab0d068708 132 default:
samux 1:80ab0d068708 133 break;
samux 1:80ab0d068708 134 }
samux 1:80ab0d068708 135 break;
samux 1:80ab0d068708 136 default:
samux 1:80ab0d068708 137 break;
samux 1:80ab0d068708 138 }
samux 1:80ab0d068708 139 }
samux 1:80ab0d068708 140
samux 1:80ab0d068708 141 // Process class-specific requests
samux 1:80ab0d068708 142
samux 1:80ab0d068708 143 if (transfer->setup.bmRequestType.Type == CLASS_TYPE)
samux 1:80ab0d068708 144 {
samux 1:80ab0d068708 145 switch (transfer->setup.bRequest)
samux 1:80ab0d068708 146 {
samux 1:80ab0d068708 147 case SET_REPORT:
samux 1:80ab0d068708 148 // First byte will be used for report ID
samux 1:80ab0d068708 149 outputReport.data[0] = transfer->setup.wValue & 0xff;
samux 1:80ab0d068708 150 outputReport.length = transfer->setup.wLength + 1;
samux 1:80ab0d068708 151
samux 1:80ab0d068708 152 transfer->remaining = sizeof(outputReport.data) - 1;
samux 1:80ab0d068708 153 transfer->ptr = &outputReport.data[1];
samux 1:80ab0d068708 154 transfer->direction = HOST_TO_DEVICE;
samux 1:80ab0d068708 155 transfer->notify = true;
samux 1:80ab0d068708 156 success = true;
samux 1:80ab0d068708 157 default:
samux 1:80ab0d068708 158 break;
samux 1:80ab0d068708 159 }
samux 1:80ab0d068708 160 }
samux 1:80ab0d068708 161
samux 1:80ab0d068708 162 return success;
samux 1:80ab0d068708 163 }
samux 1:80ab0d068708 164
samux 1:80ab0d068708 165
samux 1:80ab0d068708 166 #define DEFAULT_CONFIGURATION (1)
samux 1:80ab0d068708 167
samux 1:80ab0d068708 168
samux 1:80ab0d068708 169 // Called in ISR context
samux 1:80ab0d068708 170 // Set configuration. Return false if the
samux 1:80ab0d068708 171 // configuration is not supported
samux 1:80ab0d068708 172 bool USBHID::USBCallback_setConfiguration(uint8_t configuration) {
samux 1:80ab0d068708 173 if (configuration != DEFAULT_CONFIGURATION) {
samux 1:80ab0d068708 174 return false;
samux 1:80ab0d068708 175 }
samux 1:80ab0d068708 176
samux 1:80ab0d068708 177 // Configure endpoints > 0
samux 1:80ab0d068708 178 addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
samux 1:80ab0d068708 179 addEndpoint(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
samux 1:80ab0d068708 180
samux 1:80ab0d068708 181 // We activate the endpoint to be able to recceive data
samux 1:80ab0d068708 182 readStart(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
samux 1:80ab0d068708 183 return true;
samux 1:80ab0d068708 184 }
samux 1:80ab0d068708 185
samux 1:80ab0d068708 186
samux 1:80ab0d068708 187 uint8_t * USBHID::stringIinterfaceDesc() {
samux 1:80ab0d068708 188 static uint8_t stringIinterfaceDescriptor[] = {
samux 1:80ab0d068708 189 0x08, //bLength
samux 1:80ab0d068708 190 STRING_DESCRIPTOR, //bDescriptorType 0x03
samux 1:80ab0d068708 191 'H',0,'I',0,'D',0, //bString iInterface - HID
samux 1:80ab0d068708 192 };
samux 1:80ab0d068708 193 return stringIinterfaceDescriptor;
samux 1:80ab0d068708 194 }
samux 1:80ab0d068708 195
samux 1:80ab0d068708 196 uint8_t * USBHID::stringIproductDesc() {
samux 1:80ab0d068708 197 static uint8_t stringIproductDescriptor[] = {
samux 1:80ab0d068708 198 0x16, //bLength
samux 1:80ab0d068708 199 STRING_DESCRIPTOR, //bDescriptorType 0x03
samux 1:80ab0d068708 200 'H',0,'I',0,'D',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0 //bString iProduct - HID device
samux 1:80ab0d068708 201 };
samux 1:80ab0d068708 202 return stringIproductDescriptor;
samux 1:80ab0d068708 203 }
samux 1:80ab0d068708 204
samux 1:80ab0d068708 205
samux 1:80ab0d068708 206
samux 1:80ab0d068708 207 uint8_t * USBHID::reportDesc() {
samux 1:80ab0d068708 208 static uint8_t reportDescriptor[] = {
Kojto 70:2c525a50f1b6 209 USAGE_PAGE(2), LSB(0xFFAB), MSB(0xFFAB),
Kojto 70:2c525a50f1b6 210 USAGE(2), LSB(0x0200), MSB(0x0200),
Kojto 70:2c525a50f1b6 211 COLLECTION(1), 0x01, // Collection (Application)
Kojto 70:2c525a50f1b6 212
Kojto 70:2c525a50f1b6 213 REPORT_SIZE(1), 0x08, // 8 bits
Kojto 70:2c525a50f1b6 214 LOGICAL_MINIMUM(1), 0x00,
Kojto 70:2c525a50f1b6 215 LOGICAL_MAXIMUM(1), 0xFF,
samux 1:80ab0d068708 216
Kojto 70:2c525a50f1b6 217 REPORT_COUNT(1), input_length,
Kojto 70:2c525a50f1b6 218 USAGE(1), 0x01,
Kojto 70:2c525a50f1b6 219 INPUT(1), 0x02, // Data, Var, Abs
Kojto 70:2c525a50f1b6 220
Kojto 70:2c525a50f1b6 221 REPORT_COUNT(1), output_length,
Kojto 70:2c525a50f1b6 222 USAGE(1), 0x02,
Kojto 70:2c525a50f1b6 223 OUTPUT(1), 0x02, // Data, Var, Abs
Kojto 70:2c525a50f1b6 224
Kojto 70:2c525a50f1b6 225 END_COLLECTION(0),
samux 1:80ab0d068708 226 };
samux 1:80ab0d068708 227 reportLength = sizeof(reportDescriptor);
samux 1:80ab0d068708 228 return reportDescriptor;
samux 1:80ab0d068708 229 }
samux 1:80ab0d068708 230
samux 1:80ab0d068708 231 #define DEFAULT_CONFIGURATION (1)
samux 1:80ab0d068708 232 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
samux 1:80ab0d068708 233 + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
samux 1:80ab0d068708 234 + (1 * HID_DESCRIPTOR_LENGTH) \
samux 1:80ab0d068708 235 + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
samux 1:80ab0d068708 236
samux 1:80ab0d068708 237 uint8_t * USBHID::configurationDesc() {
samux 1:80ab0d068708 238 static uint8_t configurationDescriptor[] = {
Kojto 70:2c525a50f1b6 239 CONFIGURATION_DESCRIPTOR_LENGTH, // bLength
Kojto 70:2c525a50f1b6 240 CONFIGURATION_DESCRIPTOR, // bDescriptorType
Kojto 70:2c525a50f1b6 241 LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
Kojto 70:2c525a50f1b6 242 MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
Kojto 70:2c525a50f1b6 243 0x01, // bNumInterfaces
Kojto 70:2c525a50f1b6 244 DEFAULT_CONFIGURATION, // bConfigurationValue
Kojto 70:2c525a50f1b6 245 0x00, // iConfiguration
Kojto 70:2c525a50f1b6 246 C_RESERVED | C_SELF_POWERED, // bmAttributes
Kojto 70:2c525a50f1b6 247 C_POWER(0), // bMaxPower
samux 1:80ab0d068708 248
Kojto 70:2c525a50f1b6 249 INTERFACE_DESCRIPTOR_LENGTH, // bLength
Kojto 70:2c525a50f1b6 250 INTERFACE_DESCRIPTOR, // bDescriptorType
Kojto 70:2c525a50f1b6 251 0x00, // bInterfaceNumber
Kojto 70:2c525a50f1b6 252 0x00, // bAlternateSetting
Kojto 70:2c525a50f1b6 253 0x02, // bNumEndpoints
Kojto 70:2c525a50f1b6 254 HID_CLASS, // bInterfaceClass
Kojto 70:2c525a50f1b6 255 HID_SUBCLASS_NONE, // bInterfaceSubClass
Kojto 70:2c525a50f1b6 256 HID_PROTOCOL_NONE, // bInterfaceProtocol
Kojto 70:2c525a50f1b6 257 0x00, // iInterface
samux 1:80ab0d068708 258
Kojto 70:2c525a50f1b6 259 HID_DESCRIPTOR_LENGTH, // bLength
Kojto 70:2c525a50f1b6 260 HID_DESCRIPTOR, // bDescriptorType
Kojto 70:2c525a50f1b6 261 LSB(HID_VERSION_1_11), // bcdHID (LSB)
Kojto 70:2c525a50f1b6 262 MSB(HID_VERSION_1_11), // bcdHID (MSB)
Kojto 70:2c525a50f1b6 263 0x00, // bCountryCode
Kojto 70:2c525a50f1b6 264 0x01, // bNumDescriptors
Kojto 70:2c525a50f1b6 265 REPORT_DESCRIPTOR, // bDescriptorType
Kojto 70:2c525a50f1b6 266 (uint8_t)(LSB(reportDescLength())), // wDescriptorLength (LSB)
Kojto 70:2c525a50f1b6 267 (uint8_t)(MSB(reportDescLength())), // wDescriptorLength (MSB)
samux 1:80ab0d068708 268
Kojto 70:2c525a50f1b6 269 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
Kojto 70:2c525a50f1b6 270 ENDPOINT_DESCRIPTOR, // bDescriptorType
Kojto 70:2c525a50f1b6 271 PHY_TO_DESC(EPINT_IN), // bEndpointAddress
Kojto 70:2c525a50f1b6 272 E_INTERRUPT, // bmAttributes
Kojto 70:2c525a50f1b6 273 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
Kojto 70:2c525a50f1b6 274 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
Kojto 70:2c525a50f1b6 275 1, // bInterval (milliseconds)
samux 1:80ab0d068708 276
Kojto 70:2c525a50f1b6 277 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
Kojto 70:2c525a50f1b6 278 ENDPOINT_DESCRIPTOR, // bDescriptorType
Kojto 70:2c525a50f1b6 279 PHY_TO_DESC(EPINT_OUT), // bEndpointAddress
Kojto 70:2c525a50f1b6 280 E_INTERRUPT, // bmAttributes
Kojto 70:2c525a50f1b6 281 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
Kojto 70:2c525a50f1b6 282 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
Kojto 70:2c525a50f1b6 283 1, // bInterval (milliseconds)
samux 1:80ab0d068708 284 };
samux 1:80ab0d068708 285 return configurationDescriptor;
samux 1:80ab0d068708 286 }