max4146x_comp

Dependencies:   MAX14690

Committer:
sdivarci
Date:
Sun Oct 25 20:10:02 2020 +0000
Revision:
0:0061165683ee
sdivarci

Who changed what in which revision?

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