midi
[jackhill/qmk/firmware.git] / protocol / lufa / descriptor.c
CommitLineData
3969ec09 1/*
2 * Copyright 2012 Jun Wako <wakojun@gmail.com>
3 * This file is based on:
4 * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
5 * LUFA-120219/Demos/Device/Lowlevel/GenericHID
6 */
7
8/*
9 LUFA Library
10 Copyright (C) Dean Camera, 2012.
11
12 dean [at] fourwalledcubicle [dot] com
13 www.lufa-lib.org
14*/
15
16/*
17 Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
18 Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
19
20 Permission to use, copy, modify, distribute, and sell this
21 software and its documentation for any purpose is hereby granted
22 without fee, provided that the above copyright notice appear in
23 all copies and that both that the copyright notice and this
24 permission notice and warranty disclaimer appear in supporting
25 documentation, and that the name of the author not be used in
26 advertising or publicity pertaining to distribution of the
27 software without specific, written prior permission.
28
29 The author disclaim all warranties with regard to this
30 software, including all implied warranties of merchantability
31 and fitness. In no event shall the author be liable for any
32 special, indirect or consequential damages or any damages
33 whatsoever resulting from loss of use, data or profits, whether
34 in an action of contract, negligence or other tortious action,
35 arising out of or in connection with the use or performance of
36 this software.
37*/
38
effa5914 39#include "util.h"
3d81d522 40#include "report.h"
effa5914 41#include "descriptor.h"
3969ec09 42
43
44/*******************************************************************************
45 * HID Report Descriptors
46 ******************************************************************************/
47const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
48{
49 HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
50 HID_RI_USAGE(8, 0x06), /* Keyboard */
51 HID_RI_COLLECTION(8, 0x01), /* Application */
52 HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
53 HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
54 HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
55 HID_RI_LOGICAL_MINIMUM(8, 0x00),
56 HID_RI_LOGICAL_MAXIMUM(8, 0x01),
3969ec09 57 HID_RI_REPORT_COUNT(8, 0x08),
f2ebac10 58 HID_RI_REPORT_SIZE(8, 0x01),
3969ec09 59 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
daa4a423 60
3969ec09 61 HID_RI_REPORT_COUNT(8, 0x01),
62 HID_RI_REPORT_SIZE(8, 0x08),
daa4a423 63 HID_RI_INPUT(8, HID_IOF_CONSTANT), /* reserved */
64
3969ec09 65 HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
66 HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
67 HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
68 HID_RI_REPORT_COUNT(8, 0x05),
69 HID_RI_REPORT_SIZE(8, 0x01),
70 HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
71 HID_RI_REPORT_COUNT(8, 0x01),
72 HID_RI_REPORT_SIZE(8, 0x03),
73 HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
daa4a423 74
3969ec09 75 HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
76 HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
f2ebac10 77 HID_RI_USAGE_MAXIMUM(8, 0xFF), /* Keyboard Application */
78 HID_RI_LOGICAL_MINIMUM(8, 0x00),
79 HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
3969ec09 80 HID_RI_REPORT_COUNT(8, 0x06),
81 HID_RI_REPORT_SIZE(8, 0x08),
82 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
83 HID_RI_END_COLLECTION(0),
84};
85
e075361b 86#ifdef MOUSE_ENABLE
3969ec09 87const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
88{
89 HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
90 HID_RI_USAGE(8, 0x02), /* Mouse */
91 HID_RI_COLLECTION(8, 0x01), /* Application */
92 HID_RI_USAGE(8, 0x01), /* Pointer */
93 HID_RI_COLLECTION(8, 0x00), /* Physical */
3d81d522 94
3969ec09 95 HID_RI_USAGE_PAGE(8, 0x09), /* Button */
3d81d522 96 HID_RI_USAGE_MINIMUM(8, 0x01), /* Button 1 */
97 HID_RI_USAGE_MAXIMUM(8, 0x05), /* Button 5 */
3969ec09 98 HID_RI_LOGICAL_MINIMUM(8, 0x00),
99 HID_RI_LOGICAL_MAXIMUM(8, 0x01),
3d81d522 100 HID_RI_REPORT_COUNT(8, 0x05),
3969ec09 101 HID_RI_REPORT_SIZE(8, 0x01),
102 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
103 HID_RI_REPORT_COUNT(8, 0x01),
3d81d522 104 HID_RI_REPORT_SIZE(8, 0x03),
3969ec09 105 HID_RI_INPUT(8, HID_IOF_CONSTANT),
3d81d522 106
3969ec09 107 HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
108 HID_RI_USAGE(8, 0x30), /* Usage X */
109 HID_RI_USAGE(8, 0x31), /* Usage Y */
3d81d522 110 HID_RI_LOGICAL_MINIMUM(8, -127),
111 HID_RI_LOGICAL_MAXIMUM(8, 127),
3969ec09 112 HID_RI_REPORT_COUNT(8, 0x02),
113 HID_RI_REPORT_SIZE(8, 0x08),
114 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
3d81d522 115
116 HID_RI_USAGE(8, 0x38), /* Wheel */
117 HID_RI_LOGICAL_MINIMUM(8, -127),
118 HID_RI_LOGICAL_MAXIMUM(8, 127),
119 HID_RI_REPORT_COUNT(8, 0x01),
120 HID_RI_REPORT_SIZE(8, 0x08),
121 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
122
123 HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
124 HID_RI_USAGE(16, 0x0238), /* AC Pan (Horizontal wheel) */
125 HID_RI_LOGICAL_MINIMUM(8, -127),
126 HID_RI_LOGICAL_MAXIMUM(8, 127),
127 HID_RI_REPORT_COUNT(8, 0x01),
128 HID_RI_REPORT_SIZE(8, 0x08),
129 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
130
3969ec09 131 HID_RI_END_COLLECTION(0),
132 HID_RI_END_COLLECTION(0),
133};
e075361b 134#endif
3969ec09 135
f2ebac10 136#ifdef EXTRAKEY_ENABLE
e075361b 137const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] =
3d81d522 138{
139 HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
140 HID_RI_USAGE(8, 0x80), /* System Control */
141 HID_RI_COLLECTION(8, 0x01), /* Application */
142 HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM),
ab89bfce 143 HID_RI_LOGICAL_MINIMUM(16, 0x0001),
3d81d522 144 HID_RI_LOGICAL_MAXIMUM(16, 0x00B7),
ab89bfce 145 HID_RI_USAGE_MINIMUM(16, 0x0001), /* System Power Down */
3d81d522 146 HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */
147 HID_RI_REPORT_SIZE(8, 16),
148 HID_RI_REPORT_COUNT(8, 1),
149 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
150 HID_RI_END_COLLECTION(0),
151
152 HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
153 HID_RI_USAGE(8, 0x01), /* Consumer Control */
154 HID_RI_COLLECTION(8, 0x01), /* Application */
155 HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER),
ab89bfce 156 HID_RI_LOGICAL_MINIMUM(16, 0x0001),
3d81d522 157 HID_RI_LOGICAL_MAXIMUM(16, 0x029C),
ab89bfce 158 HID_RI_USAGE_MINIMUM(16, 0x0001), /* +10 */
3d81d522 159 HID_RI_USAGE_MAXIMUM(16, 0x029C), /* AC Distribute Vertically */
160 HID_RI_REPORT_SIZE(8, 16),
161 HID_RI_REPORT_COUNT(8, 1),
162 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
163 HID_RI_END_COLLECTION(0),
164};
f2ebac10 165#endif
166
e075361b 167#ifdef CONSOLE_ENABLE
168const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] =
169{
170 HID_RI_USAGE_PAGE(16, 0xFF31), /* Vendor Page(PJRC Teensy compatible) */
171 HID_RI_USAGE(8, 0x74), /* Vendor Usage(PJRC Teensy compatible) */
172 HID_RI_COLLECTION(8, 0x01), /* Application */
173 HID_RI_USAGE(8, 0x75), /* Vendor Usage 0x75 */
174 HID_RI_LOGICAL_MINIMUM(8, 0x00),
175 HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
176 HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
177 HID_RI_REPORT_SIZE(8, 0x08),
178 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
179 HID_RI_USAGE(8, 0x76), /* Vendor Usage 0x76 */
180 HID_RI_LOGICAL_MINIMUM(8, 0x00),
181 HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
182 HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
183 HID_RI_REPORT_SIZE(8, 0x08),
184 HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
185 HID_RI_END_COLLECTION(0),
186};
187#endif
188
f2ebac10 189#ifdef NKRO_ENABLE
190const USB_Descriptor_HIDReport_Datatype_t PROGMEM NKROReport[] =
191{
192 HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
193 HID_RI_USAGE(8, 0x06), /* Keyboard */
194 HID_RI_COLLECTION(8, 0x01), /* Application */
195 HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
196 HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
197 HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
198 HID_RI_LOGICAL_MINIMUM(8, 0x00),
199 HID_RI_LOGICAL_MAXIMUM(8, 0x01),
200 HID_RI_REPORT_COUNT(8, 0x08),
201 HID_RI_REPORT_SIZE(8, 0x01),
202 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
203
204 HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
205 HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
206 HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
207 HID_RI_REPORT_COUNT(8, 0x05),
208 HID_RI_REPORT_SIZE(8, 0x01),
209 HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
210 HID_RI_REPORT_COUNT(8, 0x01),
211 HID_RI_REPORT_SIZE(8, 0x03),
212 HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
213
214 HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
215 HID_RI_USAGE_MINIMUM(8, 0x00), /* Keyboard 0 */
daa4a423 216 HID_RI_USAGE_MAXIMUM(8, (NKRO_EPSIZE-1)*8-1), /* Keyboard Right GUI */
f2ebac10 217 HID_RI_LOGICAL_MINIMUM(8, 0x00),
218 HID_RI_LOGICAL_MAXIMUM(8, 0x01),
daa4a423 219 HID_RI_REPORT_COUNT(8, (NKRO_EPSIZE-1)*8),
f2ebac10 220 HID_RI_REPORT_SIZE(8, 0x01),
daa4a423 221 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
222 HID_RI_END_COLLECTION(0),
f2ebac10 223};
224#endif
3969ec09 225
226/*******************************************************************************
227 * Device Descriptors
228 ******************************************************************************/
229const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
230{
231 .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
232
fc3a20c5 233 .USBSpecification = VERSION_BCD(1,1,0),
3969ec09 234 .Class = USB_CSCP_NoDeviceClass,
235 .SubClass = USB_CSCP_NoDeviceSubclass,
236 .Protocol = USB_CSCP_NoDeviceProtocol,
237
3c5add5f 238 .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
3969ec09 239
1348663a 240 /* specified in config.h */
effa5914 241 .VendorID = VENDOR_ID,
242 .ProductID = PRODUCT_ID,
243 .ReleaseNumber = DEVICE_VER,
3969ec09 244
245 .ManufacturerStrIndex = 0x01,
246 .ProductStrIndex = 0x02,
247 .SerialNumStrIndex = NO_DESCRIPTOR,
248
3c5add5f 249 .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
3969ec09 250};
251
252/*******************************************************************************
253 * Configuration Descriptors
254 ******************************************************************************/
255const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
256{
257 .Config =
258 {
259 .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
260
261 .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
3d81d522 262 .TotalInterfaces = TOTAL_INTERFACES,
3969ec09 263
264 .ConfigurationNumber = 1,
265 .ConfigurationStrIndex = NO_DESCRIPTOR,
266
effa5914 267 .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP),
3969ec09 268
269 .MaxPowerConsumption = USB_CONFIG_POWER_MA(100)
270 },
271
3d81d522 272 /*
273 * Keyboard
274 */
a9a3610d 275 .Keyboard_Interface =
3969ec09 276 {
277 .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
278
effa5914 279 .InterfaceNumber = KEYBOARD_INTERFACE,
3969ec09 280 .AlternateSetting = 0x00,
281
effa5914 282 .TotalEndpoints = 1,
3969ec09 283
284 .Class = HID_CSCP_HIDClass,
285 .SubClass = HID_CSCP_BootSubclass,
286 .Protocol = HID_CSCP_KeyboardBootProtocol,
287
288 .InterfaceStrIndex = NO_DESCRIPTOR
289 },
290
a9a3610d 291 .Keyboard_HID =
3969ec09 292 {
293 .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
294
fc3a20c5 295 .HIDSpec = VERSION_BCD(1,1,1),
3969ec09 296 .CountryCode = 0x00,
297 .TotalReportDescriptors = 1,
298 .HIDReportType = HID_DTYPE_Report,
299 .HIDReportLength = sizeof(KeyboardReport)
300 },
301
a9a3610d 302 .Keyboard_INEndpoint =
3969ec09 303 {
304 .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
305
306 .EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),
307 .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
3d81d522 308 .EndpointSize = KEYBOARD_EPSIZE,
c6902681 309 .PollingIntervalMS = 0x0A
3969ec09 310 },
311
3969ec09 312 /*
313 * Mouse
314 */
f2ebac10 315#ifdef MOUSE_ENABLE
a9a3610d 316 .Mouse_Interface =
3969ec09 317 {
318 .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
319
effa5914 320 .InterfaceNumber = MOUSE_INTERFACE,
3969ec09 321 .AlternateSetting = 0x00,
322
323 .TotalEndpoints = 1,
324
325 .Class = HID_CSCP_HIDClass,
326 .SubClass = HID_CSCP_BootSubclass,
327 .Protocol = HID_CSCP_MouseBootProtocol,
328
329 .InterfaceStrIndex = NO_DESCRIPTOR
330 },
331
a9a3610d 332 .Mouse_HID =
3969ec09 333 {
334 .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
335
fc3a20c5 336 .HIDSpec = VERSION_BCD(1,1,1),
3969ec09 337 .CountryCode = 0x00,
338 .TotalReportDescriptors = 1,
339 .HIDReportType = HID_DTYPE_Report,
340 .HIDReportLength = sizeof(MouseReport)
341 },
342
a9a3610d 343 .Mouse_INEndpoint =
3969ec09 344 {
345 .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
346
347 .EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),
348 .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
3d81d522 349 .EndpointSize = MOUSE_EPSIZE,
a5d4a1f3 350 .PollingIntervalMS = 0x0A
3969ec09 351 },
f2ebac10 352#endif
3969ec09 353
354 /*
e075361b 355 * Extra
3969ec09 356 */
e075361b 357#ifdef EXTRAKEY_ENABLE
358 .Extrakey_Interface =
3969ec09 359 {
360 .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
361
e075361b 362 .InterfaceNumber = EXTRAKEY_INTERFACE,
3969ec09 363 .AlternateSetting = 0x00,
364
e075361b 365 .TotalEndpoints = 1,
3969ec09 366
367 .Class = HID_CSCP_HIDClass,
368 .SubClass = HID_CSCP_NonBootSubclass,
369 .Protocol = HID_CSCP_NonBootProtocol,
370
371 .InterfaceStrIndex = NO_DESCRIPTOR
372 },
373
e075361b 374 .Extrakey_HID =
3969ec09 375 {
376 .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
377
fc3a20c5 378 .HIDSpec = VERSION_BCD(1,1,1),
3969ec09 379 .CountryCode = 0x00,
380 .TotalReportDescriptors = 1,
381 .HIDReportType = HID_DTYPE_Report,
e075361b 382 .HIDReportLength = sizeof(ExtrakeyReport)
3969ec09 383 },
384
e075361b 385 .Extrakey_INEndpoint =
3969ec09 386 {
387 .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
388
e075361b 389 .EndpointAddress = (ENDPOINT_DIR_IN | EXTRAKEY_IN_EPNUM),
3969ec09 390 .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
e075361b 391 .EndpointSize = EXTRAKEY_EPSIZE,
a5d4a1f3 392 .PollingIntervalMS = 0x0A
3d81d522 393 },
e075361b 394#endif
3d81d522 395
396 /*
e075361b 397 * Console
3d81d522 398 */
e075361b 399#ifdef CONSOLE_ENABLE
400 .Console_Interface =
3d81d522 401 {
402 .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
403
e075361b 404 .InterfaceNumber = CONSOLE_INTERFACE,
3d81d522 405 .AlternateSetting = 0x00,
406
e075361b 407 .TotalEndpoints = 2,
3d81d522 408
409 .Class = HID_CSCP_HIDClass,
410 .SubClass = HID_CSCP_NonBootSubclass,
411 .Protocol = HID_CSCP_NonBootProtocol,
412
413 .InterfaceStrIndex = NO_DESCRIPTOR
414 },
415
e075361b 416 .Console_HID =
3d81d522 417 {
418 .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
419
fc3a20c5 420 .HIDSpec = VERSION_BCD(1,1,1),
3d81d522 421 .CountryCode = 0x00,
422 .TotalReportDescriptors = 1,
423 .HIDReportType = HID_DTYPE_Report,
e075361b 424 .HIDReportLength = sizeof(ConsoleReport)
3d81d522 425 },
426
e075361b 427 .Console_INEndpoint =
3d81d522 428 {
429 .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
430
e075361b 431 .EndpointAddress = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM),
3969ec09 432 .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
e075361b 433 .EndpointSize = CONSOLE_EPSIZE,
434 .PollingIntervalMS = 0x01
435 },
436
437 .Console_OUTEndpoint =
438 {
439 .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
440
441 .EndpointAddress = (ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM),
442 .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
443 .EndpointSize = CONSOLE_EPSIZE,
3969ec09 444 .PollingIntervalMS = 0x01
3d81d522 445 },
f2ebac10 446#endif
daa4a423 447
448 /*
449 * NKRO
450 */
451#ifdef NKRO_ENABLE
452 .NKRO_Interface =
453 {
454 .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
455
456 .InterfaceNumber = NKRO_INTERFACE,
457 .AlternateSetting = 0x00,
458
459 .TotalEndpoints = 1,
460
461 .Class = HID_CSCP_HIDClass,
462 .SubClass = HID_CSCP_NonBootSubclass,
463 .Protocol = HID_CSCP_NonBootProtocol,
464
465 .InterfaceStrIndex = NO_DESCRIPTOR
466 },
467
468 .NKRO_HID =
469 {
470 .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
471
fc3a20c5 472 .HIDSpec = VERSION_BCD(1,1,1),
daa4a423 473 .CountryCode = 0x00,
474 .TotalReportDescriptors = 1,
475 .HIDReportType = HID_DTYPE_Report,
476 .HIDReportLength = sizeof(NKROReport)
477 },
478
479 .NKRO_INEndpoint =
480 {
481 .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
482
483 .EndpointAddress = (ENDPOINT_DIR_IN | NKRO_IN_EPNUM),
484 .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
485 .EndpointSize = NKRO_EPSIZE,
486 .PollingIntervalMS = 0x01
487 },
488#endif
e528087e
JH
489
490 .Audio_ControlInterface =
491 {
492 .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
493
494 .InterfaceNumber = (NKRO_INTERFACE + 1),
495 .AlternateSetting = 0,
496
497 .TotalEndpoints = 0,
498
499 .Class = AUDIO_CSCP_AudioClass,
500 .SubClass = AUDIO_CSCP_ControlSubclass,
501 .Protocol = AUDIO_CSCP_ControlProtocol,
502
503 .InterfaceStrIndex = NO_DESCRIPTOR
504 },
505
506 .Audio_ControlInterface_SPC =
507 {
508 .Header = {.Size = sizeof(USB_Audio_Descriptor_Interface_AC_t), .Type = DTYPE_CSInterface},
509 .Subtype = AUDIO_DSUBTYPE_CSInterface_Header,
510
511 .ACSpecification = VERSION_BCD(1,1,1),
512 .TotalLength = sizeof(USB_Audio_Descriptor_Interface_AC_t),
513
514 .InCollection = 1,
515 .InterfaceNumber = (NKRO_INTERFACE + 2),
516 },
517
518 .Audio_StreamInterface =
519 {
520 .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
521
522 .InterfaceNumber = (NKRO_INTERFACE + 2),
523 .AlternateSetting = 0,
524
525 .TotalEndpoints = 2,
526
527 .Class = AUDIO_CSCP_AudioClass,
528 .SubClass = AUDIO_CSCP_MIDIStreamingSubclass,
529 .Protocol = AUDIO_CSCP_StreamingProtocol,
530
531 .InterfaceStrIndex = NO_DESCRIPTOR
532 },
533
534 .Audio_StreamInterface_SPC =
535 {
536 .Header = {.Size = sizeof(USB_MIDI_Descriptor_AudioInterface_AS_t), .Type = DTYPE_CSInterface},
537 .Subtype = AUDIO_DSUBTYPE_CSInterface_General,
538
539 .AudioSpecification = VERSION_BCD(1,1,1),
540
541 .TotalLength = (sizeof(USB_Descriptor_Configuration_t) -
542 offsetof(USB_Descriptor_Configuration_t, Audio_StreamInterface_SPC))
543 },
544
545 .MIDI_In_Jack_Emb =
546 {
547 .Header = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface},
548 .Subtype = AUDIO_DSUBTYPE_CSInterface_InputTerminal,
549
550 .JackType = MIDI_JACKTYPE_Embedded,
551 .JackID = 0x01,
552
553 .JackStrIndex = NO_DESCRIPTOR
554 },
555
556 .MIDI_In_Jack_Ext =
557 {
558 .Header = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface},
559 .Subtype = AUDIO_DSUBTYPE_CSInterface_InputTerminal,
560
561 .JackType = MIDI_JACKTYPE_External,
562 .JackID = 0x02,
563
564 .JackStrIndex = NO_DESCRIPTOR
565 },
566
567 .MIDI_Out_Jack_Emb =
568 {
569 .Header = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface},
570 .Subtype = AUDIO_DSUBTYPE_CSInterface_OutputTerminal,
571
572 .JackType = MIDI_JACKTYPE_Embedded,
573 .JackID = 0x03,
574
575 .NumberOfPins = 1,
576 .SourceJackID = {0x02},
577 .SourcePinID = {0x01},
578
579 .JackStrIndex = NO_DESCRIPTOR
580 },
581
582 .MIDI_Out_Jack_Ext =
583 {
584 .Header = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface},
585 .Subtype = AUDIO_DSUBTYPE_CSInterface_OutputTerminal,
586
587 .JackType = MIDI_JACKTYPE_External,
588 .JackID = 0x04,
589
590 .NumberOfPins = 1,
591 .SourceJackID = {0x01},
592 .SourcePinID = {0x01},
593
594 .JackStrIndex = NO_DESCRIPTOR
595 },
596
597 .MIDI_In_Jack_Endpoint =
598 {
599 .Endpoint =
600 {
601 .Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
602
603 .EndpointAddress = (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM),
604 .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
605 .EndpointSize = MIDI_STREAM_EPSIZE,
606 .PollingIntervalMS = 0x01
607 },
608
609 .Refresh = 0,
610 .SyncEndpointNumber = 0
611 },
612
613 .MIDI_In_Jack_Endpoint_SPC =
614 {
615 .Header = {.Size = sizeof(USB_MIDI_Descriptor_Jack_Endpoint_t), .Type = DTYPE_CSEndpoint},
616 .Subtype = AUDIO_DSUBTYPE_CSEndpoint_General,
617
618 .TotalEmbeddedJacks = 0x01,
619 .AssociatedJackID = {0x01}
620 },
621
622 .MIDI_Out_Jack_Endpoint =
623 {
624 .Endpoint =
625 {
626 .Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
627
628 .EndpointAddress = (ENDPOINT_DIR_OUT | MIDI_STREAM_OUT_EPNUM),
629 .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
630 .EndpointSize = MIDI_STREAM_EPSIZE,
631 .PollingIntervalMS = 0x01
632 },
633
634 .Refresh = 0,
635 .SyncEndpointNumber = 0
636 },
637
638 .MIDI_Out_Jack_Endpoint_SPC =
639 {
640 .Header = {.Size = sizeof(USB_MIDI_Descriptor_Jack_Endpoint_t), .Type = DTYPE_CSEndpoint},
641 .Subtype = AUDIO_DSUBTYPE_CSEndpoint_General,
642
643 .TotalEmbeddedJacks = 0x01,
644 .AssociatedJackID = {0x03}
645 }
646
3969ec09 647};
648
649
650/*******************************************************************************
651 * String Descriptors
652 ******************************************************************************/
653const USB_Descriptor_String_t PROGMEM LanguageString =
654{
655 .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},
656
657 .UnicodeString = {LANGUAGE_ID_ENG}
658};
659
660const USB_Descriptor_String_t PROGMEM ManufacturerString =
661{
1348663a 662 /* subtract 1 for null terminator */
663 .Header = {.Size = USB_STRING_LEN(sizeof(STR(MANUFACTURER))-1), .Type = DTYPE_String},
3969ec09 664
effa5914 665 .UnicodeString = LSTR(MANUFACTURER)
3969ec09 666};
667
668const USB_Descriptor_String_t PROGMEM ProductString =
669{
1348663a 670 /* subtract 1 for null terminator */
671 .Header = {.Size = USB_STRING_LEN(sizeof(STR(PRODUCT))-1), .Type = DTYPE_String},
3969ec09 672
effa5914 673 .UnicodeString = LSTR(PRODUCT)
3969ec09 674};
675
676
677/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
678 * documentation) by the application code so that the address and size of a requested descriptor can be given
679 * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
680 * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
681 * USB host.
682 */
683uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
684 const uint8_t wIndex,
685 const void** const DescriptorAddress)
686{
687 const uint8_t DescriptorType = (wValue >> 8);
688 const uint8_t DescriptorIndex = (wValue & 0xFF);
689
690 const void* Address = NULL;
691 uint16_t Size = NO_DESCRIPTOR;
692
693 switch (DescriptorType)
694 {
695 case DTYPE_Device:
696 Address = &DeviceDescriptor;
697 Size = sizeof(USB_Descriptor_Device_t);
698 break;
699 case DTYPE_Configuration:
700 Address = &ConfigurationDescriptor;
701 Size = sizeof(USB_Descriptor_Configuration_t);
702 break;
703 case DTYPE_String:
704 switch (DescriptorIndex )
705 {
706 case 0x00:
707 Address = &LanguageString;
708 Size = pgm_read_byte(&LanguageString.Header.Size);
709 break;
710 case 0x01:
711 Address = &ManufacturerString;
712 Size = pgm_read_byte(&ManufacturerString.Header.Size);
713 break;
714 case 0x02:
715 Address = &ProductString;
716 Size = pgm_read_byte(&ProductString.Header.Size);
717 break;
718 }
719 break;
720 case HID_DTYPE_HID:
721 switch (wIndex) {
effa5914 722 case KEYBOARD_INTERFACE:
a9a3610d 723 Address = &ConfigurationDescriptor.Keyboard_HID;
3969ec09 724 Size = sizeof(USB_HID_Descriptor_HID_t);
725 break;
f2ebac10 726#ifdef MOUSE_ENABLE
effa5914 727 case MOUSE_INTERFACE:
a9a3610d 728 Address = &ConfigurationDescriptor.Mouse_HID;
3969ec09 729 Size = sizeof(USB_HID_Descriptor_HID_t);
730 break;
f2ebac10 731#endif
e075361b 732#ifdef EXTRAKEY_ENABLE
733 case EXTRAKEY_INTERFACE:
734 Address = &ConfigurationDescriptor.Extrakey_HID;
3969ec09 735 Size = sizeof(USB_HID_Descriptor_HID_t);
736 break;
e075361b 737#endif
738#ifdef CONSOLE_ENABLE
739 case CONSOLE_INTERFACE:
740 Address = &ConfigurationDescriptor.Console_HID;
3d81d522 741 Size = sizeof(USB_HID_Descriptor_HID_t);
742 break;
daa4a423 743#endif
744#ifdef NKRO_ENABLE
745 case NKRO_INTERFACE:
746 Address = &ConfigurationDescriptor.NKRO_HID;
747 Size = sizeof(USB_HID_Descriptor_HID_t);
748 break;
f2ebac10 749#endif
3969ec09 750 }
751 break;
752 case HID_DTYPE_Report:
753 switch (wIndex) {
effa5914 754 case KEYBOARD_INTERFACE:
3969ec09 755 Address = &KeyboardReport;
756 Size = sizeof(KeyboardReport);
757 break;
f2ebac10 758#ifdef MOUSE_ENABLE
effa5914 759 case MOUSE_INTERFACE:
3969ec09 760 Address = &MouseReport;
761 Size = sizeof(MouseReport);
762 break;
f2ebac10 763#endif
e075361b 764#ifdef EXTRAKEY_ENABLE
765 case EXTRAKEY_INTERFACE:
766 Address = &ExtrakeyReport;
767 Size = sizeof(ExtrakeyReport);
768 break;
769#endif
770#ifdef CONSOLE_ENABLE
3d81d522 771 case CONSOLE_INTERFACE:
a9a3610d 772 Address = &ConsoleReport;
773 Size = sizeof(ConsoleReport);
3969ec09 774 break;
daa4a423 775#endif
776#ifdef NKRO_ENABLE
777 case NKRO_INTERFACE:
778 Address = &NKROReport;
779 Size = sizeof(NKROReport);
780 break;
f2ebac10 781#endif
3969ec09 782 }
783 break;
784 }
785
786 *DescriptorAddress = Address;
787 return Size;
788}