Committer:
Hossein
Date:
Sat Sep 28 08:44:14 2019 +0000
Revision:
16:a239bc82daa5
Parent:
11:eeb3cbbaa996
The first try to commit on 28/9/2019

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 {
samux 1:80ab0d068708 26 output_length = output_report_length;
samux 1:80ab0d068708 27 input_length = input_report_length;
samux 1:80ab0d068708 28 if(connect) {
samux 1:80ab0d068708 29 USBDevice::connect();
samux 1:80ab0d068708 30 }
samux 1:80ab0d068708 31 }
samux 1:80ab0d068708 32
Hossein 16:a239bc82daa5 33 uint8_t USBHID::USBConfig(void)
Hossein 16:a239bc82daa5 34 {
Hossein 16:a239bc82daa5 35 return USBDevice::USBConnectionStatus();
Hossein 16:a239bc82daa5 36 }
Hossein 16:a239bc82daa5 37
Hossein 16:a239bc82daa5 38 void USBHID::connect(void)
Hossein 16:a239bc82daa5 39 {
Hossein 16:a239bc82daa5 40 USBDevice::connect();
Hossein 16:a239bc82daa5 41 }
Hossein 16:a239bc82daa5 42
Hossein 16:a239bc82daa5 43 void USBHID::disconnect(void)
Hossein 16:a239bc82daa5 44 {
Hossein 16:a239bc82daa5 45 USBDevice::disconnect();
Hossein 16:a239bc82daa5 46 }
samux 1:80ab0d068708 47
samux 1:80ab0d068708 48 bool USBHID::send(HID_REPORT *report)
samux 1:80ab0d068708 49 {
samux 1:80ab0d068708 50 return write(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);
samux 1:80ab0d068708 51 }
samux 1:80ab0d068708 52
samux 1:80ab0d068708 53 bool USBHID::sendNB(HID_REPORT *report)
samux 1:80ab0d068708 54 {
samux 1:80ab0d068708 55 return writeNB(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);
samux 1:80ab0d068708 56 }
samux 1:80ab0d068708 57
samux 1:80ab0d068708 58
samux 1:80ab0d068708 59 bool USBHID::read(HID_REPORT *report)
samux 1:80ab0d068708 60 {
samux 1:80ab0d068708 61 uint32_t bytesRead = 0;
samux 1:80ab0d068708 62 bool result;
samux 1:80ab0d068708 63 result = USBDevice::readEP(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);
samux 1:80ab0d068708 64 if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
samux 1:80ab0d068708 65 return false;
samux 1:80ab0d068708 66 report->length = bytesRead;
samux 1:80ab0d068708 67 return result;
samux 1:80ab0d068708 68 }
samux 1:80ab0d068708 69
samux 1:80ab0d068708 70
samux 1:80ab0d068708 71 bool USBHID::readNB(HID_REPORT *report)
samux 1:80ab0d068708 72 {
samux 1:80ab0d068708 73 uint32_t bytesRead = 0;
samux 1:80ab0d068708 74 bool result;
samux 1:80ab0d068708 75 result = USBDevice::readEP_NB(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);
samux 1:80ab0d068708 76 report->length = bytesRead;
samux 1:80ab0d068708 77 if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
samux 1:80ab0d068708 78 return false;
samux 1:80ab0d068708 79 return result;
samux 1:80ab0d068708 80 }
samux 1:80ab0d068708 81
samux 1:80ab0d068708 82
samux 1:80ab0d068708 83 uint16_t USBHID::reportDescLength() {
samux 1:80ab0d068708 84 reportDesc();
samux 1:80ab0d068708 85 return reportLength;
samux 1:80ab0d068708 86 }
samux 1:80ab0d068708 87
samux 1:80ab0d068708 88
samux 1:80ab0d068708 89
samux 1:80ab0d068708 90 //
samux 1:80ab0d068708 91 // Route callbacks from lower layers to class(es)
samux 1:80ab0d068708 92 //
samux 1:80ab0d068708 93
samux 1:80ab0d068708 94
samux 1:80ab0d068708 95 // Called in ISR context
samux 1:80ab0d068708 96 // Called by USBDevice on Endpoint0 request
samux 1:80ab0d068708 97 // This is used to handle extensions to standard requests
samux 1:80ab0d068708 98 // and class specific requests
samux 1:80ab0d068708 99 // Return true if class handles this request
samux 1:80ab0d068708 100 bool USBHID::USBCallback_request() {
samux 1:80ab0d068708 101 bool success = false;
samux 1:80ab0d068708 102 CONTROL_TRANSFER * transfer = getTransferPtr();
samux 1:80ab0d068708 103 uint8_t *hidDescriptor;
samux 1:80ab0d068708 104
samux 1:80ab0d068708 105 // Process additional standard requests
samux 1:80ab0d068708 106
samux 1:80ab0d068708 107 if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE))
samux 1:80ab0d068708 108 {
samux 1:80ab0d068708 109 switch (transfer->setup.bRequest)
samux 1:80ab0d068708 110 {
samux 1:80ab0d068708 111 case GET_DESCRIPTOR:
samux 1:80ab0d068708 112 switch (DESCRIPTOR_TYPE(transfer->setup.wValue))
samux 1:80ab0d068708 113 {
samux 1:80ab0d068708 114 case REPORT_DESCRIPTOR:
samux 1:80ab0d068708 115 if ((reportDesc() != NULL) \
samux 1:80ab0d068708 116 && (reportDescLength() != 0))
samux 1:80ab0d068708 117 {
samux 1:80ab0d068708 118 transfer->remaining = reportDescLength();
samux 1:80ab0d068708 119 transfer->ptr = reportDesc();
samux 1:80ab0d068708 120 transfer->direction = DEVICE_TO_HOST;
samux 1:80ab0d068708 121 success = true;
samux 1:80ab0d068708 122 }
samux 1:80ab0d068708 123 break;
samux 1:80ab0d068708 124 case HID_DESCRIPTOR:
samux 1:80ab0d068708 125 // Find the HID descriptor, after the configuration descriptor
samux 1:80ab0d068708 126 hidDescriptor = findDescriptor(HID_DESCRIPTOR);
samux 1:80ab0d068708 127 if (hidDescriptor != NULL)
samux 1:80ab0d068708 128 {
samux 1:80ab0d068708 129 transfer->remaining = HID_DESCRIPTOR_LENGTH;
samux 1:80ab0d068708 130 transfer->ptr = hidDescriptor;
samux 1:80ab0d068708 131 transfer->direction = DEVICE_TO_HOST;
samux 1:80ab0d068708 132 success = true;
samux 1:80ab0d068708 133 }
samux 1:80ab0d068708 134 break;
samux 1:80ab0d068708 135
samux 1:80ab0d068708 136 default:
samux 1:80ab0d068708 137 break;
samux 1:80ab0d068708 138 }
samux 1:80ab0d068708 139 break;
samux 1:80ab0d068708 140 default:
samux 1:80ab0d068708 141 break;
samux 1:80ab0d068708 142 }
samux 1:80ab0d068708 143 }
samux 1:80ab0d068708 144
samux 1:80ab0d068708 145 // Process class-specific requests
samux 1:80ab0d068708 146
samux 1:80ab0d068708 147 if (transfer->setup.bmRequestType.Type == CLASS_TYPE)
samux 1:80ab0d068708 148 {
samux 1:80ab0d068708 149 switch (transfer->setup.bRequest)
samux 1:80ab0d068708 150 {
samux 1:80ab0d068708 151 case SET_REPORT:
samux 1:80ab0d068708 152 // First byte will be used for report ID
samux 1:80ab0d068708 153 outputReport.data[0] = transfer->setup.wValue & 0xff;
samux 1:80ab0d068708 154 outputReport.length = transfer->setup.wLength + 1;
samux 1:80ab0d068708 155
samux 1:80ab0d068708 156 transfer->remaining = sizeof(outputReport.data) - 1;
samux 1:80ab0d068708 157 transfer->ptr = &outputReport.data[1];
samux 1:80ab0d068708 158 transfer->direction = HOST_TO_DEVICE;
samux 1:80ab0d068708 159 transfer->notify = true;
samux 1:80ab0d068708 160 success = true;
samux 1:80ab0d068708 161 default:
samux 1:80ab0d068708 162 break;
samux 1:80ab0d068708 163 }
samux 1:80ab0d068708 164 }
samux 1:80ab0d068708 165
samux 1:80ab0d068708 166 return success;
samux 1:80ab0d068708 167 }
samux 1:80ab0d068708 168
samux 1:80ab0d068708 169
samux 1:80ab0d068708 170 #define DEFAULT_CONFIGURATION (1)
samux 1:80ab0d068708 171
samux 1:80ab0d068708 172
samux 1:80ab0d068708 173 // Called in ISR context
samux 1:80ab0d068708 174 // Set configuration. Return false if the
samux 1:80ab0d068708 175 // configuration is not supported
samux 1:80ab0d068708 176 bool USBHID::USBCallback_setConfiguration(uint8_t configuration) {
samux 1:80ab0d068708 177 if (configuration != DEFAULT_CONFIGURATION) {
samux 1:80ab0d068708 178 return false;
samux 1:80ab0d068708 179 }
samux 1:80ab0d068708 180
samux 1:80ab0d068708 181 // Configure endpoints > 0
samux 1:80ab0d068708 182 addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
samux 1:80ab0d068708 183 addEndpoint(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
samux 1:80ab0d068708 184
samux 1:80ab0d068708 185 // We activate the endpoint to be able to recceive data
samux 1:80ab0d068708 186 readStart(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
samux 1:80ab0d068708 187 return true;
samux 1:80ab0d068708 188 }
samux 1:80ab0d068708 189
samux 1:80ab0d068708 190
samux 1:80ab0d068708 191 uint8_t * USBHID::stringIinterfaceDesc() {
samux 1:80ab0d068708 192 static uint8_t stringIinterfaceDescriptor[] = {
samux 1:80ab0d068708 193 0x08, //bLength
samux 1:80ab0d068708 194 STRING_DESCRIPTOR, //bDescriptorType 0x03
samux 1:80ab0d068708 195 'H',0,'I',0,'D',0, //bString iInterface - HID
samux 1:80ab0d068708 196 };
samux 1:80ab0d068708 197 return stringIinterfaceDescriptor;
samux 1:80ab0d068708 198 }
samux 1:80ab0d068708 199
samux 1:80ab0d068708 200 uint8_t * USBHID::stringIproductDesc() {
samux 1:80ab0d068708 201 static uint8_t stringIproductDescriptor[] = {
Hossein 16:a239bc82daa5 202 0x28, //bLength
samux 1:80ab0d068708 203 STRING_DESCRIPTOR, //bDescriptorType 0x03
Hossein 16:a239bc82daa5 204 'D',0,'A',0,'T',0,'A',0,' ',0,'T',0,'R',0,'A',0,'N',0,'S',0,'F',0,'O',0,'R',0,'M',0,'A',0,'T',0,'I',0,'O',0,'N',0 //bString iProduct - HID device
samux 1:80ab0d068708 205 };
samux 1:80ab0d068708 206 return stringIproductDescriptor;
samux 1:80ab0d068708 207 }
samux 1:80ab0d068708 208
samux 1:80ab0d068708 209
samux 1:80ab0d068708 210
samux 1:80ab0d068708 211 uint8_t * USBHID::reportDesc() {
samux 1:80ab0d068708 212 static uint8_t reportDescriptor[] = {
samux 1:80ab0d068708 213 0x06, LSB(0xFFAB), MSB(0xFFAB),
samux 1:80ab0d068708 214 0x0A, LSB(0x0200), MSB(0x0200),
samux 1:80ab0d068708 215 0xA1, 0x01, // Collection 0x01
samux 1:80ab0d068708 216 0x75, 0x08, // report size = 8 bits
samux 1:80ab0d068708 217 0x15, 0x00, // logical minimum = 0
samux 1:80ab0d068708 218 0x26, 0xFF, 0x00, // logical maximum = 255
Hossein 16:a239bc82daa5 219 0x95, input_length, // report count
samux 1:80ab0d068708 220 0x09, 0x01, // usage
samux 1:80ab0d068708 221 0x81, 0x02, // Input (array)
Hossein 16:a239bc82daa5 222 0x95, output_length, // report count
samux 1:80ab0d068708 223 0x09, 0x02, // usage
samux 1:80ab0d068708 224 0x91, 0x02, // Output (array)
samux 1:80ab0d068708 225 0xC0 // end collection
samux 1:80ab0d068708 226
samux 1:80ab0d068708 227 };
samux 1:80ab0d068708 228 reportLength = sizeof(reportDescriptor);
samux 1:80ab0d068708 229 return reportDescriptor;
samux 1:80ab0d068708 230 }
samux 1:80ab0d068708 231
samux 1:80ab0d068708 232 #define DEFAULT_CONFIGURATION (1)
samux 1:80ab0d068708 233 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
samux 1:80ab0d068708 234 + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
samux 1:80ab0d068708 235 + (1 * HID_DESCRIPTOR_LENGTH) \
samux 1:80ab0d068708 236 + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
samux 1:80ab0d068708 237
samux 1:80ab0d068708 238 uint8_t * USBHID::configurationDesc() {
samux 1:80ab0d068708 239 static uint8_t configurationDescriptor[] = {
samux 1:80ab0d068708 240 CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
samux 1:80ab0d068708 241 CONFIGURATION_DESCRIPTOR, // bDescriptorType
samux 1:80ab0d068708 242 LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
samux 1:80ab0d068708 243 MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
samux 1:80ab0d068708 244 0x01, // bNumInterfaces
samux 1:80ab0d068708 245 DEFAULT_CONFIGURATION, // bConfigurationValue
samux 1:80ab0d068708 246 0x00, // iConfiguration
samux 1:80ab0d068708 247 C_RESERVED | C_SELF_POWERED, // bmAttributes
samux 1:80ab0d068708 248 C_POWER(0), // bMaxPower
samux 1:80ab0d068708 249
samux 1:80ab0d068708 250 INTERFACE_DESCRIPTOR_LENGTH, // bLength
samux 1:80ab0d068708 251 INTERFACE_DESCRIPTOR, // bDescriptorType
samux 1:80ab0d068708 252 0x00, // bInterfaceNumber
samux 1:80ab0d068708 253 0x00, // bAlternateSetting
samux 1:80ab0d068708 254 0x02, // bNumEndpoints
samux 1:80ab0d068708 255 HID_CLASS, // bInterfaceClass
samux 1:80ab0d068708 256 HID_SUBCLASS_NONE, // bInterfaceSubClass
samux 1:80ab0d068708 257 HID_PROTOCOL_NONE, // bInterfaceProtocol
samux 1:80ab0d068708 258 0x00, // iInterface
samux 1:80ab0d068708 259
samux 1:80ab0d068708 260 HID_DESCRIPTOR_LENGTH, // bLength
samux 1:80ab0d068708 261 HID_DESCRIPTOR, // bDescriptorType
samux 1:80ab0d068708 262 LSB(HID_VERSION_1_11), // bcdHID (LSB)
samux 1:80ab0d068708 263 MSB(HID_VERSION_1_11), // bcdHID (MSB)
samux 1:80ab0d068708 264 0x00, // bCountryCode
samux 1:80ab0d068708 265 0x01, // bNumDescriptors
samux 1:80ab0d068708 266 REPORT_DESCRIPTOR, // bDescriptorType
Hossein 16:a239bc82daa5 267 LSB(this->reportDescLength()), // wDescriptorLength (LSB)
Hossein 16:a239bc82daa5 268 MSB(this->reportDescLength()), // wDescriptorLength (MSB)
samux 1:80ab0d068708 269
samux 1:80ab0d068708 270 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
samux 1:80ab0d068708 271 ENDPOINT_DESCRIPTOR, // bDescriptorType
samux 1:80ab0d068708 272 PHY_TO_DESC(EPINT_IN), // bEndpointAddress
samux 1:80ab0d068708 273 E_INTERRUPT, // bmAttributes
samux 1:80ab0d068708 274 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
samux 1:80ab0d068708 275 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
samux 1:80ab0d068708 276 1, // bInterval (milliseconds)
samux 1:80ab0d068708 277
samux 1:80ab0d068708 278 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
samux 1:80ab0d068708 279 ENDPOINT_DESCRIPTOR, // bDescriptorType
samux 1:80ab0d068708 280 PHY_TO_DESC(EPINT_OUT), // bEndpointAddress
samux 1:80ab0d068708 281 E_INTERRUPT, // bmAttributes
samux 1:80ab0d068708 282 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
samux 1:80ab0d068708 283 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
samux 1:80ab0d068708 284 1, // bInterval (milliseconds)
samux 1:80ab0d068708 285 };
samux 1:80ab0d068708 286 return configurationDescriptor;
samux 1:80ab0d068708 287 }