Commit | Line | Data |
---|---|---|
9303b42e | 1 | /* |
3969ec09 | 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" |
53ff8a31 | 41 | #include "usb_descriptor.h" |
3969ec09 | 42 | |
83e613ad KS |
43 | #ifndef USB_MAX_POWER_CONSUMPTION |
44 | #define USB_MAX_POWER_CONSUMPTION 500 | |
45 | #endif | |
3969ec09 | 46 | |
47 | /******************************************************************************* | |
48 | * HID Report Descriptors | |
49 | ******************************************************************************/ | |
50 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = | |
51 | { | |
52 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | |
53 | HID_RI_USAGE(8, 0x06), /* Keyboard */ | |
54 | HID_RI_COLLECTION(8, 0x01), /* Application */ | |
55 | HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ | |
56 | HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ | |
57 | HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ | |
58 | HID_RI_LOGICAL_MINIMUM(8, 0x00), | |
59 | HID_RI_LOGICAL_MAXIMUM(8, 0x01), | |
3969ec09 | 60 | HID_RI_REPORT_COUNT(8, 0x08), |
f2ebac10 | 61 | HID_RI_REPORT_SIZE(8, 0x01), |
3969ec09 | 62 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), |
daa4a423 | 63 | |
3969ec09 | 64 | HID_RI_REPORT_COUNT(8, 0x01), |
65 | HID_RI_REPORT_SIZE(8, 0x08), | |
daa4a423 | 66 | HID_RI_INPUT(8, HID_IOF_CONSTANT), /* reserved */ |
67 | ||
3969ec09 | 68 | HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */ |
69 | HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */ | |
70 | HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */ | |
71 | HID_RI_REPORT_COUNT(8, 0x05), | |
72 | HID_RI_REPORT_SIZE(8, 0x01), | |
73 | HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), | |
74 | HID_RI_REPORT_COUNT(8, 0x01), | |
75 | HID_RI_REPORT_SIZE(8, 0x03), | |
76 | HID_RI_OUTPUT(8, HID_IOF_CONSTANT), | |
daa4a423 | 77 | |
3969ec09 | 78 | HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */ |
79 | HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */ | |
f2ebac10 | 80 | HID_RI_USAGE_MAXIMUM(8, 0xFF), /* Keyboard Application */ |
81 | HID_RI_LOGICAL_MINIMUM(8, 0x00), | |
6b8b332f | 82 | HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), |
3969ec09 | 83 | HID_RI_REPORT_COUNT(8, 0x06), |
84 | HID_RI_REPORT_SIZE(8, 0x08), | |
85 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), | |
86 | HID_RI_END_COLLECTION(0), | |
87 | }; | |
88 | ||
e075361b | 89 | #ifdef MOUSE_ENABLE |
3969ec09 | 90 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = |
91 | { | |
92 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | |
93 | HID_RI_USAGE(8, 0x02), /* Mouse */ | |
94 | HID_RI_COLLECTION(8, 0x01), /* Application */ | |
95 | HID_RI_USAGE(8, 0x01), /* Pointer */ | |
96 | HID_RI_COLLECTION(8, 0x00), /* Physical */ | |
3d81d522 | 97 | |
3969ec09 | 98 | HID_RI_USAGE_PAGE(8, 0x09), /* Button */ |
3d81d522 | 99 | HID_RI_USAGE_MINIMUM(8, 0x01), /* Button 1 */ |
100 | HID_RI_USAGE_MAXIMUM(8, 0x05), /* Button 5 */ | |
3969ec09 | 101 | HID_RI_LOGICAL_MINIMUM(8, 0x00), |
102 | HID_RI_LOGICAL_MAXIMUM(8, 0x01), | |
3d81d522 | 103 | HID_RI_REPORT_COUNT(8, 0x05), |
3969ec09 | 104 | HID_RI_REPORT_SIZE(8, 0x01), |
105 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | |
106 | HID_RI_REPORT_COUNT(8, 0x01), | |
3d81d522 | 107 | HID_RI_REPORT_SIZE(8, 0x03), |
3969ec09 | 108 | HID_RI_INPUT(8, HID_IOF_CONSTANT), |
3d81d522 | 109 | |
3969ec09 | 110 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ |
111 | HID_RI_USAGE(8, 0x30), /* Usage X */ | |
112 | HID_RI_USAGE(8, 0x31), /* Usage Y */ | |
3d81d522 | 113 | HID_RI_LOGICAL_MINIMUM(8, -127), |
114 | HID_RI_LOGICAL_MAXIMUM(8, 127), | |
3969ec09 | 115 | HID_RI_REPORT_COUNT(8, 0x02), |
116 | HID_RI_REPORT_SIZE(8, 0x08), | |
117 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), | |
3d81d522 | 118 | |
119 | HID_RI_USAGE(8, 0x38), /* Wheel */ | |
120 | HID_RI_LOGICAL_MINIMUM(8, -127), | |
121 | HID_RI_LOGICAL_MAXIMUM(8, 127), | |
122 | HID_RI_REPORT_COUNT(8, 0x01), | |
123 | HID_RI_REPORT_SIZE(8, 0x08), | |
124 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), | |
125 | ||
126 | HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */ | |
127 | HID_RI_USAGE(16, 0x0238), /* AC Pan (Horizontal wheel) */ | |
128 | HID_RI_LOGICAL_MINIMUM(8, -127), | |
129 | HID_RI_LOGICAL_MAXIMUM(8, 127), | |
130 | HID_RI_REPORT_COUNT(8, 0x01), | |
131 | HID_RI_REPORT_SIZE(8, 0x08), | |
132 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), | |
133 | ||
3969ec09 | 134 | HID_RI_END_COLLECTION(0), |
135 | HID_RI_END_COLLECTION(0), | |
136 | }; | |
e075361b | 137 | #endif |
3969ec09 | 138 | |
f2ebac10 | 139 | #ifdef EXTRAKEY_ENABLE |
e075361b | 140 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = |
3d81d522 | 141 | { |
142 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | |
143 | HID_RI_USAGE(8, 0x80), /* System Control */ | |
144 | HID_RI_COLLECTION(8, 0x01), /* Application */ | |
145 | HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM), | |
a305da2b W |
146 | HID_RI_LOGICAL_MINIMUM(16, 0x0001), |
147 | HID_RI_LOGICAL_MAXIMUM(16, 0x0003), | |
d48a4cf1 | 148 | HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */ |
a305da2b | 149 | HID_RI_USAGE_MAXIMUM(16, 0x0083), /* System Wake Up */ |
3d81d522 | 150 | HID_RI_REPORT_SIZE(8, 16), |
151 | HID_RI_REPORT_COUNT(8, 1), | |
152 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), | |
153 | HID_RI_END_COLLECTION(0), | |
154 | ||
155 | HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */ | |
156 | HID_RI_USAGE(8, 0x01), /* Consumer Control */ | |
157 | HID_RI_COLLECTION(8, 0x01), /* Application */ | |
158 | HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER), | |
ab89bfce | 159 | HID_RI_LOGICAL_MINIMUM(16, 0x0001), |
3d81d522 | 160 | HID_RI_LOGICAL_MAXIMUM(16, 0x029C), |
ab89bfce | 161 | HID_RI_USAGE_MINIMUM(16, 0x0001), /* +10 */ |
3d81d522 | 162 | HID_RI_USAGE_MAXIMUM(16, 0x029C), /* AC Distribute Vertically */ |
163 | HID_RI_REPORT_SIZE(8, 16), | |
164 | HID_RI_REPORT_COUNT(8, 1), | |
165 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), | |
166 | HID_RI_END_COLLECTION(0), | |
167 | }; | |
f2ebac10 | 168 | #endif |
169 | ||
fe001d46 W |
170 | #ifdef RAW_ENABLE |
171 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM RawReport[] = | |
172 | { | |
173 | HID_RI_USAGE_PAGE(16, 0xFF60), /* Vendor Page 0xFF60 */ | |
174 | HID_RI_USAGE(8, 0x61), /* Vendor Usage 0x61 */ | |
175 | HID_RI_COLLECTION(8, 0x01), /* Application */ | |
176 | HID_RI_USAGE(8, 0x62), /* Vendor Usage 0x62 */ | |
177 | HID_RI_LOGICAL_MINIMUM(8, 0x00), | |
178 | HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), | |
179 | HID_RI_REPORT_COUNT(8, RAW_EPSIZE), | |
180 | HID_RI_REPORT_SIZE(8, 0x08), | |
181 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | |
182 | HID_RI_USAGE(8, 0x63), /* Vendor Usage 0x63 */ | |
183 | HID_RI_LOGICAL_MINIMUM(8, 0x00), | |
184 | HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), | |
185 | HID_RI_REPORT_COUNT(8, RAW_EPSIZE), | |
186 | HID_RI_REPORT_SIZE(8, 0x08), | |
187 | HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), | |
188 | HID_RI_END_COLLECTION(0), | |
189 | }; | |
190 | #endif | |
191 | ||
e075361b | 192 | #ifdef CONSOLE_ENABLE |
193 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = | |
194 | { | |
195 | HID_RI_USAGE_PAGE(16, 0xFF31), /* Vendor Page(PJRC Teensy compatible) */ | |
196 | HID_RI_USAGE(8, 0x74), /* Vendor Usage(PJRC Teensy compatible) */ | |
197 | HID_RI_COLLECTION(8, 0x01), /* Application */ | |
198 | HID_RI_USAGE(8, 0x75), /* Vendor Usage 0x75 */ | |
199 | HID_RI_LOGICAL_MINIMUM(8, 0x00), | |
649b33d7 | 200 | HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), |
e075361b | 201 | HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE), |
202 | HID_RI_REPORT_SIZE(8, 0x08), | |
203 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | |
204 | HID_RI_USAGE(8, 0x76), /* Vendor Usage 0x76 */ | |
205 | HID_RI_LOGICAL_MINIMUM(8, 0x00), | |
649b33d7 | 206 | HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), |
e075361b | 207 | HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE), |
208 | HID_RI_REPORT_SIZE(8, 0x08), | |
209 | HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), | |
210 | HID_RI_END_COLLECTION(0), | |
211 | }; | |
212 | #endif | |
213 | ||
f2ebac10 | 214 | #ifdef NKRO_ENABLE |
215 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM NKROReport[] = | |
216 | { | |
217 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | |
218 | HID_RI_USAGE(8, 0x06), /* Keyboard */ | |
219 | HID_RI_COLLECTION(8, 0x01), /* Application */ | |
220 | HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ | |
221 | HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ | |
222 | HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ | |
223 | HID_RI_LOGICAL_MINIMUM(8, 0x00), | |
224 | HID_RI_LOGICAL_MAXIMUM(8, 0x01), | |
225 | HID_RI_REPORT_COUNT(8, 0x08), | |
226 | HID_RI_REPORT_SIZE(8, 0x01), | |
227 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | |
228 | ||
229 | HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */ | |
230 | HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */ | |
231 | HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */ | |
232 | HID_RI_REPORT_COUNT(8, 0x05), | |
233 | HID_RI_REPORT_SIZE(8, 0x01), | |
234 | HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), | |
235 | HID_RI_REPORT_COUNT(8, 0x01), | |
236 | HID_RI_REPORT_SIZE(8, 0x03), | |
237 | HID_RI_OUTPUT(8, HID_IOF_CONSTANT), | |
238 | ||
239 | HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ | |
240 | HID_RI_USAGE_MINIMUM(8, 0x00), /* Keyboard 0 */ | |
daa4a423 | 241 | HID_RI_USAGE_MAXIMUM(8, (NKRO_EPSIZE-1)*8-1), /* Keyboard Right GUI */ |
f2ebac10 | 242 | HID_RI_LOGICAL_MINIMUM(8, 0x00), |
243 | HID_RI_LOGICAL_MAXIMUM(8, 0x01), | |
daa4a423 | 244 | HID_RI_REPORT_COUNT(8, (NKRO_EPSIZE-1)*8), |
f2ebac10 | 245 | HID_RI_REPORT_SIZE(8, 0x01), |
daa4a423 | 246 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), |
247 | HID_RI_END_COLLECTION(0), | |
f2ebac10 | 248 | }; |
249 | #endif | |
3969ec09 | 250 | |
251 | /******************************************************************************* | |
252 | * Device Descriptors | |
253 | ******************************************************************************/ | |
254 | const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = | |
255 | { | |
256 | .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | |
257 | ||
fc3a20c5 | 258 | .USBSpecification = VERSION_BCD(1,1,0), |
80d10bef JG |
259 | #if VIRTSER_ENABLE |
260 | .Class = USB_CSCP_IADDeviceClass, | |
261 | .SubClass = USB_CSCP_IADDeviceSubclass, | |
262 | .Protocol = USB_CSCP_IADDeviceProtocol, | |
263 | #else | |
3969ec09 | 264 | .Class = USB_CSCP_NoDeviceClass, |
265 | .SubClass = USB_CSCP_NoDeviceSubclass, | |
266 | .Protocol = USB_CSCP_NoDeviceProtocol, | |
80d10bef | 267 | #endif |
3969ec09 | 268 | |
3c5add5f | 269 | .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, |
3969ec09 | 270 | |
1348663a | 271 | /* specified in config.h */ |
effa5914 | 272 | .VendorID = VENDOR_ID, |
273 | .ProductID = PRODUCT_ID, | |
274 | .ReleaseNumber = DEVICE_VER, | |
3969ec09 | 275 | |
276 | .ManufacturerStrIndex = 0x01, | |
277 | .ProductStrIndex = 0x02, | |
f5a9758c | 278 | .SerialNumStrIndex = 0x03, |
3969ec09 | 279 | |
3c5add5f | 280 | .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS |
3969ec09 | 281 | }; |
282 | ||
283 | /******************************************************************************* | |
284 | * Configuration Descriptors | |
285 | ******************************************************************************/ | |
286 | const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |
287 | { | |
288 | .Config = | |
289 | { | |
290 | .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, | |
291 | ||
292 | .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), | |
3d81d522 | 293 | .TotalInterfaces = TOTAL_INTERFACES, |
3969ec09 | 294 | |
295 | .ConfigurationNumber = 1, | |
296 | .ConfigurationStrIndex = NO_DESCRIPTOR, | |
297 | ||
effa5914 | 298 | .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP), |
3969ec09 | 299 | |
83e613ad | 300 | .MaxPowerConsumption = USB_CONFIG_POWER_MA(USB_MAX_POWER_CONSUMPTION) |
3969ec09 | 301 | }, |
302 | ||
3d81d522 | 303 | /* |
304 | * Keyboard | |
305 | */ | |
a9a3610d | 306 | .Keyboard_Interface = |
3969ec09 | 307 | { |
308 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |
309 | ||
effa5914 | 310 | .InterfaceNumber = KEYBOARD_INTERFACE, |
3969ec09 | 311 | .AlternateSetting = 0x00, |
312 | ||
effa5914 | 313 | .TotalEndpoints = 1, |
3969ec09 | 314 | |
315 | .Class = HID_CSCP_HIDClass, | |
316 | .SubClass = HID_CSCP_BootSubclass, | |
317 | .Protocol = HID_CSCP_KeyboardBootProtocol, | |
318 | ||
319 | .InterfaceStrIndex = NO_DESCRIPTOR | |
320 | }, | |
321 | ||
a9a3610d | 322 | .Keyboard_HID = |
3969ec09 | 323 | { |
324 | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | |
325 | ||
fc3a20c5 | 326 | .HIDSpec = VERSION_BCD(1,1,1), |
3969ec09 | 327 | .CountryCode = 0x00, |
328 | .TotalReportDescriptors = 1, | |
329 | .HIDReportType = HID_DTYPE_Report, | |
330 | .HIDReportLength = sizeof(KeyboardReport) | |
331 | }, | |
332 | ||
a9a3610d | 333 | .Keyboard_INEndpoint = |
3969ec09 | 334 | { |
335 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |
336 | ||
337 | .EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM), | |
338 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | |
3d81d522 | 339 | .EndpointSize = KEYBOARD_EPSIZE, |
c6902681 | 340 | .PollingIntervalMS = 0x0A |
3969ec09 | 341 | }, |
342 | ||
3969ec09 | 343 | /* |
344 | * Mouse | |
345 | */ | |
f2ebac10 | 346 | #ifdef MOUSE_ENABLE |
a9a3610d | 347 | .Mouse_Interface = |
3969ec09 | 348 | { |
349 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |
350 | ||
effa5914 | 351 | .InterfaceNumber = MOUSE_INTERFACE, |
3969ec09 | 352 | .AlternateSetting = 0x00, |
353 | ||
354 | .TotalEndpoints = 1, | |
355 | ||
356 | .Class = HID_CSCP_HIDClass, | |
357 | .SubClass = HID_CSCP_BootSubclass, | |
358 | .Protocol = HID_CSCP_MouseBootProtocol, | |
359 | ||
360 | .InterfaceStrIndex = NO_DESCRIPTOR | |
361 | }, | |
362 | ||
a9a3610d | 363 | .Mouse_HID = |
3969ec09 | 364 | { |
365 | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | |
366 | ||
fc3a20c5 | 367 | .HIDSpec = VERSION_BCD(1,1,1), |
3969ec09 | 368 | .CountryCode = 0x00, |
369 | .TotalReportDescriptors = 1, | |
370 | .HIDReportType = HID_DTYPE_Report, | |
371 | .HIDReportLength = sizeof(MouseReport) | |
372 | }, | |
373 | ||
a9a3610d | 374 | .Mouse_INEndpoint = |
3969ec09 | 375 | { |
376 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |
377 | ||
378 | .EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM), | |
379 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | |
3d81d522 | 380 | .EndpointSize = MOUSE_EPSIZE, |
a5d4a1f3 | 381 | .PollingIntervalMS = 0x0A |
3969ec09 | 382 | }, |
f2ebac10 | 383 | #endif |
3969ec09 | 384 | |
385 | /* | |
e075361b | 386 | * Extra |
3969ec09 | 387 | */ |
e075361b | 388 | #ifdef EXTRAKEY_ENABLE |
389 | .Extrakey_Interface = | |
3969ec09 | 390 | { |
391 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |
392 | ||
e075361b | 393 | .InterfaceNumber = EXTRAKEY_INTERFACE, |
3969ec09 | 394 | .AlternateSetting = 0x00, |
395 | ||
e075361b | 396 | .TotalEndpoints = 1, |
3969ec09 | 397 | |
398 | .Class = HID_CSCP_HIDClass, | |
399 | .SubClass = HID_CSCP_NonBootSubclass, | |
400 | .Protocol = HID_CSCP_NonBootProtocol, | |
401 | ||
402 | .InterfaceStrIndex = NO_DESCRIPTOR | |
403 | }, | |
404 | ||
e075361b | 405 | .Extrakey_HID = |
3969ec09 | 406 | { |
407 | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | |
408 | ||
fc3a20c5 | 409 | .HIDSpec = VERSION_BCD(1,1,1), |
3969ec09 | 410 | .CountryCode = 0x00, |
411 | .TotalReportDescriptors = 1, | |
412 | .HIDReportType = HID_DTYPE_Report, | |
e075361b | 413 | .HIDReportLength = sizeof(ExtrakeyReport) |
3969ec09 | 414 | }, |
415 | ||
e075361b | 416 | .Extrakey_INEndpoint = |
3969ec09 | 417 | { |
418 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |
419 | ||
e075361b | 420 | .EndpointAddress = (ENDPOINT_DIR_IN | EXTRAKEY_IN_EPNUM), |
3969ec09 | 421 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), |
e075361b | 422 | .EndpointSize = EXTRAKEY_EPSIZE, |
a5d4a1f3 | 423 | .PollingIntervalMS = 0x0A |
3d81d522 | 424 | }, |
e075361b | 425 | #endif |
3d81d522 | 426 | |
fe001d46 W |
427 | /* |
428 | * Raw | |
429 | */ | |
430 | #ifdef RAW_ENABLE | |
431 | .Raw_Interface = | |
432 | { | |
433 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |
434 | ||
435 | .InterfaceNumber = RAW_INTERFACE, | |
436 | .AlternateSetting = 0x00, | |
437 | ||
438 | .TotalEndpoints = 2, | |
439 | ||
440 | .Class = HID_CSCP_HIDClass, | |
441 | .SubClass = HID_CSCP_NonBootSubclass, | |
442 | .Protocol = HID_CSCP_NonBootProtocol, | |
443 | ||
444 | .InterfaceStrIndex = NO_DESCRIPTOR | |
445 | }, | |
446 | ||
447 | .Raw_HID = | |
448 | { | |
449 | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | |
450 | ||
451 | .HIDSpec = VERSION_BCD(1,1,1), | |
452 | .CountryCode = 0x00, | |
453 | .TotalReportDescriptors = 1, | |
454 | .HIDReportType = HID_DTYPE_Report, | |
455 | .HIDReportLength = sizeof(RawReport) | |
456 | }, | |
457 | ||
458 | .Raw_INEndpoint = | |
459 | { | |
460 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |
461 | ||
462 | .EndpointAddress = (ENDPOINT_DIR_IN | RAW_IN_EPNUM), | |
463 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | |
464 | .EndpointSize = RAW_EPSIZE, | |
465 | .PollingIntervalMS = 0x01 | |
466 | }, | |
467 | ||
468 | .Raw_OUTEndpoint = | |
469 | { | |
470 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |
471 | ||
472 | .EndpointAddress = (ENDPOINT_DIR_OUT | RAW_OUT_EPNUM), | |
473 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | |
474 | .EndpointSize = RAW_EPSIZE, | |
475 | .PollingIntervalMS = 0x01 | |
476 | }, | |
477 | #endif | |
478 | ||
3d81d522 | 479 | /* |
e075361b | 480 | * Console |
3d81d522 | 481 | */ |
e075361b | 482 | #ifdef CONSOLE_ENABLE |
483 | .Console_Interface = | |
3d81d522 | 484 | { |
485 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |
486 | ||
e075361b | 487 | .InterfaceNumber = CONSOLE_INTERFACE, |
3d81d522 | 488 | .AlternateSetting = 0x00, |
489 | ||
e075361b | 490 | .TotalEndpoints = 2, |
3d81d522 | 491 | |
492 | .Class = HID_CSCP_HIDClass, | |
493 | .SubClass = HID_CSCP_NonBootSubclass, | |
494 | .Protocol = HID_CSCP_NonBootProtocol, | |
495 | ||
496 | .InterfaceStrIndex = NO_DESCRIPTOR | |
497 | }, | |
498 | ||
e075361b | 499 | .Console_HID = |
3d81d522 | 500 | { |
501 | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | |
502 | ||
fc3a20c5 | 503 | .HIDSpec = VERSION_BCD(1,1,1), |
3d81d522 | 504 | .CountryCode = 0x00, |
505 | .TotalReportDescriptors = 1, | |
506 | .HIDReportType = HID_DTYPE_Report, | |
e075361b | 507 | .HIDReportLength = sizeof(ConsoleReport) |
3d81d522 | 508 | }, |
509 | ||
e075361b | 510 | .Console_INEndpoint = |
3d81d522 | 511 | { |
512 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |
513 | ||
e075361b | 514 | .EndpointAddress = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM), |
3969ec09 | 515 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), |
e075361b | 516 | .EndpointSize = CONSOLE_EPSIZE, |
517 | .PollingIntervalMS = 0x01 | |
518 | }, | |
519 | ||
520 | .Console_OUTEndpoint = | |
521 | { | |
522 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |
523 | ||
524 | .EndpointAddress = (ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM), | |
525 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | |
526 | .EndpointSize = CONSOLE_EPSIZE, | |
3969ec09 | 527 | .PollingIntervalMS = 0x01 |
3d81d522 | 528 | }, |
f2ebac10 | 529 | #endif |
daa4a423 | 530 | |
531 | /* | |
532 | * NKRO | |
533 | */ | |
534 | #ifdef NKRO_ENABLE | |
535 | .NKRO_Interface = | |
536 | { | |
537 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |
538 | ||
539 | .InterfaceNumber = NKRO_INTERFACE, | |
540 | .AlternateSetting = 0x00, | |
541 | ||
542 | .TotalEndpoints = 1, | |
543 | ||
544 | .Class = HID_CSCP_HIDClass, | |
545 | .SubClass = HID_CSCP_NonBootSubclass, | |
546 | .Protocol = HID_CSCP_NonBootProtocol, | |
547 | ||
548 | .InterfaceStrIndex = NO_DESCRIPTOR | |
549 | }, | |
550 | ||
551 | .NKRO_HID = | |
552 | { | |
553 | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | |
554 | ||
fc3a20c5 | 555 | .HIDSpec = VERSION_BCD(1,1,1), |
daa4a423 | 556 | .CountryCode = 0x00, |
557 | .TotalReportDescriptors = 1, | |
558 | .HIDReportType = HID_DTYPE_Report, | |
559 | .HIDReportLength = sizeof(NKROReport) | |
560 | }, | |
561 | ||
562 | .NKRO_INEndpoint = | |
563 | { | |
564 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |
565 | ||
566 | .EndpointAddress = (ENDPOINT_DIR_IN | NKRO_IN_EPNUM), | |
567 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | |
568 | .EndpointSize = NKRO_EPSIZE, | |
569 | .PollingIntervalMS = 0x01 | |
570 | }, | |
571 | #endif | |
e528087e | 572 | |
04885a3b | 573 | #ifdef MIDI_ENABLE |
53ff8a31 | 574 | .Audio_Interface_Association = |
575 | { | |
576 | .Header = {.Size = sizeof(USB_Descriptor_Interface_Association_t), .Type = DTYPE_InterfaceAssociation}, | |
577 | ||
578 | .FirstInterfaceIndex = AC_INTERFACE, | |
579 | .TotalInterfaces = 2, | |
580 | ||
581 | .Class = AUDIO_CSCP_AudioClass, | |
582 | .SubClass = AUDIO_CSCP_ControlSubclass, | |
583 | .Protocol = AUDIO_CSCP_ControlProtocol, | |
584 | ||
585 | .IADStrIndex = NO_DESCRIPTOR, | |
586 | }, | |
e528087e JH |
587 | .Audio_ControlInterface = |
588 | { | |
589 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |
590 | ||
cda23c75 | 591 | .InterfaceNumber = AC_INTERFACE, |
e528087e JH |
592 | .AlternateSetting = 0, |
593 | ||
594 | .TotalEndpoints = 0, | |
595 | ||
596 | .Class = AUDIO_CSCP_AudioClass, | |
597 | .SubClass = AUDIO_CSCP_ControlSubclass, | |
598 | .Protocol = AUDIO_CSCP_ControlProtocol, | |
599 | ||
600 | .InterfaceStrIndex = NO_DESCRIPTOR | |
601 | }, | |
602 | ||
603 | .Audio_ControlInterface_SPC = | |
604 | { | |
605 | .Header = {.Size = sizeof(USB_Audio_Descriptor_Interface_AC_t), .Type = DTYPE_CSInterface}, | |
606 | .Subtype = AUDIO_DSUBTYPE_CSInterface_Header, | |
607 | ||
04885a3b | 608 | .ACSpecification = VERSION_BCD(1,0,0), |
e528087e JH |
609 | .TotalLength = sizeof(USB_Audio_Descriptor_Interface_AC_t), |
610 | ||
611 | .InCollection = 1, | |
cda23c75 | 612 | .InterfaceNumber = AS_INTERFACE, |
e528087e JH |
613 | }, |
614 | ||
615 | .Audio_StreamInterface = | |
616 | { | |
617 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |
618 | ||
cda23c75 | 619 | .InterfaceNumber = AS_INTERFACE, |
e528087e JH |
620 | .AlternateSetting = 0, |
621 | ||
622 | .TotalEndpoints = 2, | |
623 | ||
624 | .Class = AUDIO_CSCP_AudioClass, | |
625 | .SubClass = AUDIO_CSCP_MIDIStreamingSubclass, | |
626 | .Protocol = AUDIO_CSCP_StreamingProtocol, | |
627 | ||
628 | .InterfaceStrIndex = NO_DESCRIPTOR | |
629 | }, | |
630 | ||
631 | .Audio_StreamInterface_SPC = | |
632 | { | |
633 | .Header = {.Size = sizeof(USB_MIDI_Descriptor_AudioInterface_AS_t), .Type = DTYPE_CSInterface}, | |
634 | .Subtype = AUDIO_DSUBTYPE_CSInterface_General, | |
635 | ||
04885a3b | 636 | .AudioSpecification = VERSION_BCD(1,0,0), |
e528087e | 637 | |
53ff8a31 | 638 | .TotalLength = offsetof(USB_Descriptor_Configuration_t, MIDI_Out_Jack_Endpoint_SPC) |
639 | + sizeof(USB_MIDI_Descriptor_Jack_Endpoint_t) | |
640 | - offsetof(USB_Descriptor_Configuration_t, Audio_StreamInterface_SPC) | |
e528087e JH |
641 | }, |
642 | ||
643 | .MIDI_In_Jack_Emb = | |
644 | { | |
645 | .Header = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | |
646 | .Subtype = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | |
647 | ||
648 | .JackType = MIDI_JACKTYPE_Embedded, | |
649 | .JackID = 0x01, | |
650 | ||
651 | .JackStrIndex = NO_DESCRIPTOR | |
652 | }, | |
653 | ||
654 | .MIDI_In_Jack_Ext = | |
655 | { | |
656 | .Header = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | |
657 | .Subtype = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | |
658 | ||
659 | .JackType = MIDI_JACKTYPE_External, | |
660 | .JackID = 0x02, | |
661 | ||
662 | .JackStrIndex = NO_DESCRIPTOR | |
663 | }, | |
664 | ||
665 | .MIDI_Out_Jack_Emb = | |
666 | { | |
667 | .Header = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | |
668 | .Subtype = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | |
669 | ||
670 | .JackType = MIDI_JACKTYPE_Embedded, | |
671 | .JackID = 0x03, | |
672 | ||
673 | .NumberOfPins = 1, | |
674 | .SourceJackID = {0x02}, | |
675 | .SourcePinID = {0x01}, | |
676 | ||
677 | .JackStrIndex = NO_DESCRIPTOR | |
678 | }, | |
679 | ||
680 | .MIDI_Out_Jack_Ext = | |
681 | { | |
682 | .Header = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | |
683 | .Subtype = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | |
684 | ||
685 | .JackType = MIDI_JACKTYPE_External, | |
686 | .JackID = 0x04, | |
687 | ||
688 | .NumberOfPins = 1, | |
689 | .SourceJackID = {0x01}, | |
690 | .SourcePinID = {0x01}, | |
691 | ||
692 | .JackStrIndex = NO_DESCRIPTOR | |
693 | }, | |
694 | ||
695 | .MIDI_In_Jack_Endpoint = | |
696 | { | |
697 | .Endpoint = | |
698 | { | |
699 | .Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | |
700 | ||
cda23c75 | 701 | .EndpointAddress = MIDI_STREAM_OUT_EPADDR, |
e528087e JH |
702 | .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), |
703 | .EndpointSize = MIDI_STREAM_EPSIZE, | |
04885a3b | 704 | .PollingIntervalMS = 0x05 |
e528087e JH |
705 | }, |
706 | ||
707 | .Refresh = 0, | |
708 | .SyncEndpointNumber = 0 | |
709 | }, | |
710 | ||
711 | .MIDI_In_Jack_Endpoint_SPC = | |
712 | { | |
713 | .Header = {.Size = sizeof(USB_MIDI_Descriptor_Jack_Endpoint_t), .Type = DTYPE_CSEndpoint}, | |
714 | .Subtype = AUDIO_DSUBTYPE_CSEndpoint_General, | |
715 | ||
716 | .TotalEmbeddedJacks = 0x01, | |
717 | .AssociatedJackID = {0x01} | |
718 | }, | |
719 | ||
720 | .MIDI_Out_Jack_Endpoint = | |
721 | { | |
722 | .Endpoint = | |
723 | { | |
724 | .Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | |
725 | ||
cda23c75 | 726 | .EndpointAddress = MIDI_STREAM_IN_EPADDR, |
e528087e JH |
727 | .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), |
728 | .EndpointSize = MIDI_STREAM_EPSIZE, | |
04885a3b | 729 | .PollingIntervalMS = 0x05 |
e528087e JH |
730 | }, |
731 | ||
732 | .Refresh = 0, | |
733 | .SyncEndpointNumber = 0 | |
734 | }, | |
735 | ||
736 | .MIDI_Out_Jack_Endpoint_SPC = | |
737 | { | |
738 | .Header = {.Size = sizeof(USB_MIDI_Descriptor_Jack_Endpoint_t), .Type = DTYPE_CSEndpoint}, | |
739 | .Subtype = AUDIO_DSUBTYPE_CSEndpoint_General, | |
740 | ||
741 | .TotalEmbeddedJacks = 0x01, | |
742 | .AssociatedJackID = {0x03} | |
80d10bef JG |
743 | }, |
744 | #endif | |
745 | ||
746 | #ifdef VIRTSER_ENABLE | |
747 | .CDC_Interface_Association = | |
748 | { | |
749 | .Header = {.Size = sizeof(USB_Descriptor_Interface_Association_t), .Type = DTYPE_InterfaceAssociation}, | |
750 | ||
751 | .FirstInterfaceIndex = CCI_INTERFACE, | |
752 | .TotalInterfaces = 2, | |
753 | ||
754 | .Class = CDC_CSCP_CDCClass, | |
755 | .SubClass = CDC_CSCP_ACMSubclass, | |
756 | .Protocol = CDC_CSCP_ATCommandProtocol, | |
757 | ||
758 | .IADStrIndex = NO_DESCRIPTOR, | |
759 | }, | |
760 | ||
761 | .CDC_CCI_Interface = | |
762 | { | |
763 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |
764 | ||
765 | .InterfaceNumber = CCI_INTERFACE, | |
766 | .AlternateSetting = 0, | |
767 | ||
768 | .TotalEndpoints = 1, | |
769 | ||
770 | .Class = CDC_CSCP_CDCClass, | |
771 | .SubClass = CDC_CSCP_ACMSubclass, | |
772 | .Protocol = CDC_CSCP_ATCommandProtocol, | |
773 | ||
774 | .InterfaceStrIndex = NO_DESCRIPTOR | |
775 | }, | |
776 | ||
777 | .CDC_Functional_Header = | |
778 | { | |
779 | .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, | |
780 | .Subtype = 0x00, | |
781 | ||
782 | .CDCSpecification = VERSION_BCD(1,1,0), | |
783 | }, | |
784 | ||
785 | .CDC_Functional_ACM = | |
786 | { | |
787 | .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, | |
788 | .Subtype = 0x02, | |
789 | ||
790 | .Capabilities = 0x02, | |
791 | }, | |
792 | ||
793 | .CDC_Functional_Union = | |
794 | { | |
795 | .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, | |
796 | .Subtype = 0x06, | |
797 | ||
798 | .MasterInterfaceNumber = CCI_INTERFACE, | |
799 | .SlaveInterfaceNumber = CDI_INTERFACE, | |
800 | }, | |
801 | ||
802 | .CDC_NotificationEndpoint = | |
803 | { | |
804 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |
805 | ||
806 | .EndpointAddress = CDC_NOTIFICATION_EPADDR, | |
807 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | |
808 | .EndpointSize = CDC_NOTIFICATION_EPSIZE, | |
809 | .PollingIntervalMS = 0xFF | |
810 | }, | |
811 | ||
812 | .CDC_DCI_Interface = | |
813 | { | |
814 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |
815 | ||
816 | .InterfaceNumber = CDI_INTERFACE, | |
817 | .AlternateSetting = 0, | |
818 | ||
819 | .TotalEndpoints = 2, | |
820 | ||
821 | .Class = CDC_CSCP_CDCDataClass, | |
822 | .SubClass = CDC_CSCP_NoDataSubclass, | |
823 | .Protocol = CDC_CSCP_NoDataProtocol, | |
824 | ||
825 | .InterfaceStrIndex = NO_DESCRIPTOR | |
826 | }, | |
827 | ||
828 | .CDC_DataOutEndpoint = | |
829 | { | |
830 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |
831 | ||
832 | .EndpointAddress = CDC_OUT_EPADDR, | |
833 | .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | |
834 | .EndpointSize = CDC_EPSIZE, | |
835 | .PollingIntervalMS = 0x05 | |
836 | }, | |
837 | ||
838 | .CDC_DataInEndpoint = | |
839 | { | |
840 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |
841 | ||
842 | .EndpointAddress = CDC_IN_EPADDR, | |
843 | .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | |
844 | .EndpointSize = CDC_EPSIZE, | |
845 | .PollingIntervalMS = 0x05 | |
846 | }, | |
04885a3b | 847 | #endif |
3969ec09 | 848 | }; |
849 | ||
850 | ||
851 | /******************************************************************************* | |
852 | * String Descriptors | |
853 | ******************************************************************************/ | |
854 | const USB_Descriptor_String_t PROGMEM LanguageString = | |
855 | { | |
856 | .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, | |
857 | ||
858 | .UnicodeString = {LANGUAGE_ID_ENG} | |
859 | }; | |
860 | ||
861 | const USB_Descriptor_String_t PROGMEM ManufacturerString = | |
862 | { | |
1348663a | 863 | /* subtract 1 for null terminator */ |
864 | .Header = {.Size = USB_STRING_LEN(sizeof(STR(MANUFACTURER))-1), .Type = DTYPE_String}, | |
3969ec09 | 865 | |
effa5914 | 866 | .UnicodeString = LSTR(MANUFACTURER) |
3969ec09 | 867 | }; |
868 | ||
869 | const USB_Descriptor_String_t PROGMEM ProductString = | |
870 | { | |
1348663a | 871 | /* subtract 1 for null terminator */ |
872 | .Header = {.Size = USB_STRING_LEN(sizeof(STR(PRODUCT))-1), .Type = DTYPE_String}, | |
3969ec09 | 873 | |
effa5914 | 874 | .UnicodeString = LSTR(PRODUCT) |
3969ec09 | 875 | }; |
876 | ||
f5a9758c JH |
877 | #ifndef SERIAL_NUMBER |
878 | #define SERIAL_NUMBER 0 | |
879 | #endif | |
880 | ||
881 | const USB_Descriptor_String_t PROGMEM SerialNumberString = | |
882 | { | |
883 | /* subtract 1 for null terminator */ | |
884 | .Header = {.Size = USB_STRING_LEN(sizeof(STR(SERIAL_NUMBER))-1), .Type = DTYPE_String}, | |
885 | ||
886 | .UnicodeString = LSTR(SERIAL_NUMBER) | |
887 | }; | |
888 | ||
3969ec09 | 889 | |
890 | /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" | |
891 | * documentation) by the application code so that the address and size of a requested descriptor can be given | |
892 | * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function | |
893 | * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the | |
894 | * USB host. | |
895 | */ | |
53ff8a31 | 896 | uint16_t get_usb_descriptor(const uint16_t wValue, |
897 | const uint16_t wIndex, | |
898 | const void** const DescriptorAddress) | |
3969ec09 | 899 | { |
900 | const uint8_t DescriptorType = (wValue >> 8); | |
901 | const uint8_t DescriptorIndex = (wValue & 0xFF); | |
902 | ||
903 | const void* Address = NULL; | |
904 | uint16_t Size = NO_DESCRIPTOR; | |
905 | ||
906 | switch (DescriptorType) | |
907 | { | |
908 | case DTYPE_Device: | |
909 | Address = &DeviceDescriptor; | |
910 | Size = sizeof(USB_Descriptor_Device_t); | |
911 | break; | |
912 | case DTYPE_Configuration: | |
913 | Address = &ConfigurationDescriptor; | |
914 | Size = sizeof(USB_Descriptor_Configuration_t); | |
915 | break; | |
916 | case DTYPE_String: | |
917 | switch (DescriptorIndex ) | |
918 | { | |
919 | case 0x00: | |
920 | Address = &LanguageString; | |
921 | Size = pgm_read_byte(&LanguageString.Header.Size); | |
922 | break; | |
923 | case 0x01: | |
924 | Address = &ManufacturerString; | |
925 | Size = pgm_read_byte(&ManufacturerString.Header.Size); | |
926 | break; | |
927 | case 0x02: | |
928 | Address = &ProductString; | |
929 | Size = pgm_read_byte(&ProductString.Header.Size); | |
930 | break; | |
f5a9758c JH |
931 | case 0x03: |
932 | Address = &SerialNumberString; | |
933 | Size = pgm_read_byte(&SerialNumberString.Header.Size); | |
934 | break; | |
3969ec09 | 935 | } |
936 | break; | |
937 | case HID_DTYPE_HID: | |
938 | switch (wIndex) { | |
effa5914 | 939 | case KEYBOARD_INTERFACE: |
a9a3610d | 940 | Address = &ConfigurationDescriptor.Keyboard_HID; |
3969ec09 | 941 | Size = sizeof(USB_HID_Descriptor_HID_t); |
942 | break; | |
f2ebac10 | 943 | #ifdef MOUSE_ENABLE |
effa5914 | 944 | case MOUSE_INTERFACE: |
a9a3610d | 945 | Address = &ConfigurationDescriptor.Mouse_HID; |
3969ec09 | 946 | Size = sizeof(USB_HID_Descriptor_HID_t); |
947 | break; | |
f2ebac10 | 948 | #endif |
e075361b | 949 | #ifdef EXTRAKEY_ENABLE |
950 | case EXTRAKEY_INTERFACE: | |
951 | Address = &ConfigurationDescriptor.Extrakey_HID; | |
3969ec09 | 952 | Size = sizeof(USB_HID_Descriptor_HID_t); |
953 | break; | |
e075361b | 954 | #endif |
fe001d46 W |
955 | #ifdef RAW_ENABLE |
956 | case RAW_INTERFACE: | |
957 | Address = &ConfigurationDescriptor.Raw_HID; | |
958 | Size = sizeof(USB_HID_Descriptor_HID_t); | |
959 | break; | |
960 | #endif | |
e075361b | 961 | #ifdef CONSOLE_ENABLE |
962 | case CONSOLE_INTERFACE: | |
963 | Address = &ConfigurationDescriptor.Console_HID; | |
3d81d522 | 964 | Size = sizeof(USB_HID_Descriptor_HID_t); |
965 | break; | |
daa4a423 | 966 | #endif |
967 | #ifdef NKRO_ENABLE | |
968 | case NKRO_INTERFACE: | |
969 | Address = &ConfigurationDescriptor.NKRO_HID; | |
970 | Size = sizeof(USB_HID_Descriptor_HID_t); | |
971 | break; | |
f2ebac10 | 972 | #endif |
3969ec09 | 973 | } |
974 | break; | |
975 | case HID_DTYPE_Report: | |
976 | switch (wIndex) { | |
effa5914 | 977 | case KEYBOARD_INTERFACE: |
3969ec09 | 978 | Address = &KeyboardReport; |
979 | Size = sizeof(KeyboardReport); | |
980 | break; | |
f2ebac10 | 981 | #ifdef MOUSE_ENABLE |
effa5914 | 982 | case MOUSE_INTERFACE: |
3969ec09 | 983 | Address = &MouseReport; |
984 | Size = sizeof(MouseReport); | |
985 | break; | |
f2ebac10 | 986 | #endif |
e075361b | 987 | #ifdef EXTRAKEY_ENABLE |
988 | case EXTRAKEY_INTERFACE: | |
989 | Address = &ExtrakeyReport; | |
990 | Size = sizeof(ExtrakeyReport); | |
991 | break; | |
992 | #endif | |
fe001d46 W |
993 | #ifdef RAW_ENABLE |
994 | case RAW_INTERFACE: | |
995 | Address = &RawReport; | |
996 | Size = sizeof(RawReport); | |
997 | break; | |
998 | #endif | |
e075361b | 999 | #ifdef CONSOLE_ENABLE |
3d81d522 | 1000 | case CONSOLE_INTERFACE: |
a9a3610d | 1001 | Address = &ConsoleReport; |
1002 | Size = sizeof(ConsoleReport); | |
3969ec09 | 1003 | break; |
daa4a423 | 1004 | #endif |
1005 | #ifdef NKRO_ENABLE | |
1006 | case NKRO_INTERFACE: | |
1007 | Address = &NKROReport; | |
1008 | Size = sizeof(NKROReport); | |
1009 | break; | |
f2ebac10 | 1010 | #endif |
3969ec09 | 1011 | } |
1012 | break; | |
1013 | } | |
1014 | ||
1015 | *DescriptorAddress = Address; | |
1016 | return Size; | |
1017 | } |