usb_descriptor.c 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459
  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. LUFA Library
  9. Copyright (C) Dean Camera, 2012.
  10. dean [at] fourwalledcubicle [dot] com
  11. www.lufa-lib.org
  12. */
  13. /*
  14. Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
  15. Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
  16. Permission to use, copy, modify, distribute, and sell this
  17. software and its documentation for any purpose is hereby granted
  18. without fee, provided that the above copyright notice appear in
  19. all copies and that both that the copyright notice and this
  20. permission notice and warranty disclaimer appear in supporting
  21. documentation, and that the name of the author not be used in
  22. advertising or publicity pertaining to distribution of the
  23. software without specific, written prior permission.
  24. The author disclaim all warranties with regard to this
  25. software, including all implied warranties of merchantability
  26. and fitness. In no event shall the author be liable for any
  27. special, indirect or consequential damages or any damages
  28. whatsoever resulting from loss of use, data or profits, whether
  29. in an action of contract, negligence or other tortious action,
  30. arising out of or in connection with the use or performance of
  31. this software.
  32. */
  33. #include "util.h"
  34. #include "report.h"
  35. #include "usb_descriptor.h"
  36. #include "usb_descriptor_common.h"
  37. #ifdef JOYSTICK_ENABLE
  38. # include "joystick.h"
  39. #endif
  40. #ifdef OS_DETECTION_ENABLE
  41. # include "os_detection.h"
  42. #endif
  43. #if defined(SERIAL_NUMBER) || (defined(SERIAL_NUMBER_USE_HARDWARE_ID) && SERIAL_NUMBER_USE_HARDWARE_ID == TRUE)
  44. # define HAS_SERIAL_NUMBER
  45. # if defined(SERIAL_NUMBER_USE_HARDWARE_ID) && SERIAL_NUMBER_USE_HARDWARE_ID == TRUE
  46. # include "hardware_id.h"
  47. # endif
  48. #endif // defined(SERIAL_NUMBER) || (defined(SERIAL_NUMBER_USE_HARDWARE_ID) && SERIAL_NUMBER_USE_HARDWARE_ID == TRUE)
  49. // clang-format off
  50. /*
  51. * HID report descriptors
  52. */
  53. #ifdef KEYBOARD_SHARED_EP
  54. const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = {
  55. # define SHARED_REPORT_STARTED
  56. #else
  57. const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = {
  58. #endif
  59. HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop
  60. HID_RI_USAGE(8, 0x06), // Keyboard
  61. HID_RI_COLLECTION(8, 0x01), // Application
  62. #ifdef KEYBOARD_SHARED_EP
  63. HID_RI_REPORT_ID(8, REPORT_ID_KEYBOARD),
  64. #endif
  65. // Modifiers (8 bits)
  66. HID_RI_USAGE_PAGE(8, 0x07), // Keyboard/Keypad
  67. HID_RI_USAGE_MINIMUM(8, 0xE0), // Keyboard Left Control
  68. HID_RI_USAGE_MAXIMUM(8, 0xE7), // Keyboard Right GUI
  69. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  70. HID_RI_LOGICAL_MAXIMUM(8, 0x01),
  71. HID_RI_REPORT_COUNT(8, 0x08),
  72. HID_RI_REPORT_SIZE(8, 0x01),
  73. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  74. // Reserved (1 byte)
  75. HID_RI_REPORT_COUNT(8, 0x01),
  76. HID_RI_REPORT_SIZE(8, 0x08),
  77. HID_RI_INPUT(8, HID_IOF_CONSTANT),
  78. // Keycodes (6 bytes)
  79. HID_RI_USAGE_PAGE(8, 0x07), // Keyboard/Keypad
  80. HID_RI_USAGE_MINIMUM(8, 0x00),
  81. HID_RI_USAGE_MAXIMUM(8, 0xFF),
  82. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  83. HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
  84. HID_RI_REPORT_COUNT(8, 0x06),
  85. HID_RI_REPORT_SIZE(8, 0x08),
  86. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
  87. // Status LEDs (5 bits)
  88. HID_RI_USAGE_PAGE(8, 0x08), // LED
  89. HID_RI_USAGE_MINIMUM(8, 0x01), // Num Lock
  90. HID_RI_USAGE_MAXIMUM(8, 0x05), // Kana
  91. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  92. HID_RI_LOGICAL_MAXIMUM(8, 0x01),
  93. HID_RI_REPORT_COUNT(8, 0x05),
  94. HID_RI_REPORT_SIZE(8, 0x01),
  95. HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
  96. // LED padding (3 bits)
  97. HID_RI_REPORT_COUNT(8, 0x01),
  98. HID_RI_REPORT_SIZE(8, 0x03),
  99. HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
  100. HID_RI_END_COLLECTION(0),
  101. #ifndef KEYBOARD_SHARED_EP
  102. };
  103. #endif
  104. #ifdef MOUSE_ENABLE
  105. # ifndef MOUSE_SHARED_EP
  106. const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = {
  107. # elif !defined(SHARED_REPORT_STARTED)
  108. const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = {
  109. # define SHARED_REPORT_STARTED
  110. # endif
  111. HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop
  112. HID_RI_USAGE(8, 0x02), // Mouse
  113. HID_RI_COLLECTION(8, 0x01), // Application
  114. # ifdef MOUSE_SHARED_EP
  115. HID_RI_REPORT_ID(8, REPORT_ID_MOUSE),
  116. # endif
  117. HID_RI_USAGE(8, 0x01), // Pointer
  118. HID_RI_COLLECTION(8, 0x00), // Physical
  119. // Buttons (8 bits)
  120. HID_RI_USAGE_PAGE(8, 0x09), // Button
  121. HID_RI_USAGE_MINIMUM(8, 0x01), // Button 1
  122. HID_RI_USAGE_MAXIMUM(8, 0x08), // Button 8
  123. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  124. HID_RI_LOGICAL_MAXIMUM(8, 0x01),
  125. HID_RI_REPORT_COUNT(8, 0x08),
  126. HID_RI_REPORT_SIZE(8, 0x01),
  127. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  128. # ifdef MOUSE_EXTENDED_REPORT
  129. // Boot protocol XY ignored in Report protocol
  130. HID_RI_REPORT_COUNT(8, 0x02),
  131. HID_RI_REPORT_SIZE(8, 0x08),
  132. HID_RI_INPUT(8, HID_IOF_CONSTANT),
  133. # endif
  134. // X/Y position (2 or 4 bytes)
  135. HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop
  136. HID_RI_USAGE(8, 0x30), // X
  137. HID_RI_USAGE(8, 0x31), // Y
  138. # ifndef MOUSE_EXTENDED_REPORT
  139. HID_RI_LOGICAL_MINIMUM(8, -127),
  140. HID_RI_LOGICAL_MAXIMUM(8, 127),
  141. HID_RI_REPORT_COUNT(8, 0x02),
  142. HID_RI_REPORT_SIZE(8, 0x08),
  143. # else
  144. HID_RI_LOGICAL_MINIMUM(16, -32767),
  145. HID_RI_LOGICAL_MAXIMUM(16, 32767),
  146. HID_RI_REPORT_COUNT(8, 0x02),
  147. HID_RI_REPORT_SIZE(8, 0x10),
  148. # endif
  149. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
  150. # ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE
  151. HID_RI_COLLECTION(8, 0x02),
  152. // Feature report and padding (1 byte)
  153. HID_RI_USAGE(8, 0x48), // Resolution Multiplier
  154. HID_RI_REPORT_COUNT(8, 0x01),
  155. HID_RI_REPORT_SIZE(8, 0x02),
  156. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  157. HID_RI_LOGICAL_MAXIMUM(8, 0x01),
  158. HID_RI_PHYSICAL_MINIMUM(8, 1),
  159. HID_RI_PHYSICAL_MAXIMUM(8, POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER),
  160. HID_RI_UNIT_EXPONENT(8, POINTING_DEVICE_HIRES_SCROLL_EXPONENT),
  161. HID_RI_FEATURE(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  162. HID_RI_PHYSICAL_MINIMUM(8, 0x00),
  163. HID_RI_PHYSICAL_MAXIMUM(8, 0x00),
  164. HID_RI_REPORT_SIZE(8, 0x06),
  165. HID_RI_FEATURE(8, HID_IOF_CONSTANT),
  166. # endif
  167. // Vertical wheel (1 or 2 bytes)
  168. HID_RI_USAGE(8, 0x38), // Wheel
  169. # ifndef WHEEL_EXTENDED_REPORT
  170. HID_RI_LOGICAL_MINIMUM(8, -127),
  171. HID_RI_LOGICAL_MAXIMUM(8, 127),
  172. HID_RI_REPORT_COUNT(8, 0x01),
  173. HID_RI_REPORT_SIZE(8, 0x08),
  174. # else
  175. HID_RI_LOGICAL_MINIMUM(16, -32767),
  176. HID_RI_LOGICAL_MAXIMUM(16, 32767),
  177. HID_RI_REPORT_COUNT(8, 0x01),
  178. HID_RI_REPORT_SIZE(8, 0x10),
  179. # endif
  180. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
  181. // Horizontal wheel (1 or 2 bytes)
  182. HID_RI_USAGE_PAGE(8, 0x0C),// Consumer
  183. HID_RI_USAGE(16, 0x0238), // AC Pan
  184. # ifndef WHEEL_EXTENDED_REPORT
  185. HID_RI_LOGICAL_MINIMUM(8, -127),
  186. HID_RI_LOGICAL_MAXIMUM(8, 127),
  187. HID_RI_REPORT_COUNT(8, 0x01),
  188. HID_RI_REPORT_SIZE(8, 0x08),
  189. # else
  190. HID_RI_LOGICAL_MINIMUM(16, -32767),
  191. HID_RI_LOGICAL_MAXIMUM(16, 32767),
  192. HID_RI_REPORT_COUNT(8, 0x01),
  193. HID_RI_REPORT_SIZE(8, 0x10),
  194. # endif
  195. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
  196. # ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE
  197. HID_RI_END_COLLECTION(0),
  198. # endif
  199. HID_RI_END_COLLECTION(0),
  200. HID_RI_END_COLLECTION(0),
  201. # ifndef MOUSE_SHARED_EP
  202. };
  203. # endif
  204. #endif
  205. #ifdef JOYSTICK_ENABLE
  206. # ifndef JOYSTICK_SHARED_EP
  207. const USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] = {
  208. # elif !defined(SHARED_REPORT_STARTED)
  209. const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = {
  210. # define SHARED_REPORT_STARTED
  211. # endif
  212. HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop
  213. HID_RI_USAGE(8, 0x04), // Joystick
  214. HID_RI_COLLECTION(8, 0x01), // Application
  215. # ifdef JOYSTICK_SHARED_EP
  216. HID_RI_REPORT_ID(8, REPORT_ID_JOYSTICK),
  217. # endif
  218. HID_RI_COLLECTION(8, 0x00), // Physical
  219. # if JOYSTICK_AXIS_COUNT > 0
  220. HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop
  221. HID_RI_USAGE(8, 0x30), // X
  222. # if JOYSTICK_AXIS_COUNT > 1
  223. HID_RI_USAGE(8, 0x31), // Y
  224. # endif
  225. # if JOYSTICK_AXIS_COUNT > 2
  226. HID_RI_USAGE(8, 0x32), // Z
  227. # endif
  228. # if JOYSTICK_AXIS_COUNT > 3
  229. HID_RI_USAGE(8, 0x33), // Rx
  230. # endif
  231. # if JOYSTICK_AXIS_COUNT > 4
  232. HID_RI_USAGE(8, 0x34), // Ry
  233. # endif
  234. # if JOYSTICK_AXIS_COUNT > 5
  235. HID_RI_USAGE(8, 0x35), // Rz
  236. # endif
  237. # if JOYSTICK_AXIS_RESOLUTION == 8
  238. HID_RI_LOGICAL_MINIMUM(8, -JOYSTICK_MAX_VALUE),
  239. HID_RI_LOGICAL_MAXIMUM(8, JOYSTICK_MAX_VALUE),
  240. HID_RI_REPORT_COUNT(8, JOYSTICK_AXIS_COUNT),
  241. HID_RI_REPORT_SIZE(8, 0x08),
  242. # else
  243. HID_RI_LOGICAL_MINIMUM(16, -JOYSTICK_MAX_VALUE),
  244. HID_RI_LOGICAL_MAXIMUM(16, JOYSTICK_MAX_VALUE),
  245. HID_RI_REPORT_COUNT(8, JOYSTICK_AXIS_COUNT),
  246. HID_RI_REPORT_SIZE(8, 0x10),
  247. # endif
  248. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  249. # endif
  250. # ifdef JOYSTICK_HAS_HAT
  251. // Hat Switch (4 bits)
  252. HID_RI_USAGE(8, 0x39), // Hat Switch
  253. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  254. HID_RI_LOGICAL_MAXIMUM(8, 0x07),
  255. HID_RI_PHYSICAL_MINIMUM(8, 0),
  256. HID_RI_PHYSICAL_MAXIMUM(16, 315),
  257. HID_RI_UNIT(8, 0x14), // Degree, English Rotation
  258. HID_RI_REPORT_COUNT(8, 1),
  259. HID_RI_REPORT_SIZE(8, 4),
  260. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NULLSTATE),
  261. // Padding (4 bits)
  262. HID_RI_REPORT_COUNT(8, 0x04),
  263. HID_RI_REPORT_SIZE(8, 0x01),
  264. HID_RI_INPUT(8, HID_IOF_CONSTANT),
  265. # endif
  266. # if JOYSTICK_BUTTON_COUNT > 0
  267. HID_RI_USAGE_PAGE(8, 0x09), // Button
  268. HID_RI_USAGE_MINIMUM(8, 0x01),
  269. HID_RI_USAGE_MAXIMUM(8, JOYSTICK_BUTTON_COUNT),
  270. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  271. HID_RI_LOGICAL_MAXIMUM(8, 0x01),
  272. HID_RI_REPORT_COUNT(8, JOYSTICK_BUTTON_COUNT),
  273. HID_RI_REPORT_SIZE(8, 0x01),
  274. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  275. # if (JOYSTICK_BUTTON_COUNT % 8) != 0
  276. HID_RI_REPORT_COUNT(8, 8 - (JOYSTICK_BUTTON_COUNT % 8)),
  277. HID_RI_REPORT_SIZE(8, 0x01),
  278. HID_RI_INPUT(8, HID_IOF_CONSTANT),
  279. # endif
  280. # endif
  281. HID_RI_END_COLLECTION(0),
  282. HID_RI_END_COLLECTION(0),
  283. # ifndef JOYSTICK_SHARED_EP
  284. };
  285. # endif
  286. #endif
  287. #ifdef DIGITIZER_ENABLE
  288. # ifndef DIGITIZER_SHARED_EP
  289. const USB_Descriptor_HIDReport_Datatype_t PROGMEM DigitizerReport[] = {
  290. # elif !defined(SHARED_REPORT_STARTED)
  291. const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = {
  292. # define SHARED_REPORT_STARTED
  293. # endif
  294. HID_RI_USAGE_PAGE(8, 0x0D), // Digitizers
  295. HID_RI_USAGE(8, 0x01), // Digitizer
  296. HID_RI_COLLECTION(8, 0x01), // Application
  297. # ifdef DIGITIZER_SHARED_EP
  298. HID_RI_REPORT_ID(8, REPORT_ID_DIGITIZER),
  299. # endif
  300. HID_RI_USAGE(8, 0x20), // Stylus
  301. HID_RI_COLLECTION(8, 0x00), // Physical
  302. // In Range, Tip Switch & Barrel Switch (3 bits)
  303. HID_RI_USAGE(8, 0x32), // In Range
  304. HID_RI_USAGE(8, 0x42), // Tip Switch
  305. HID_RI_USAGE(8, 0x44), // Barrel Switch
  306. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  307. HID_RI_LOGICAL_MAXIMUM(8, 0x01),
  308. HID_RI_REPORT_COUNT(8, 0x03),
  309. HID_RI_REPORT_SIZE(8, 0x01),
  310. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  311. // Padding (5 bits)
  312. HID_RI_REPORT_COUNT(8, 0x05),
  313. HID_RI_INPUT(8, HID_IOF_CONSTANT),
  314. // X/Y Position (4 bytes)
  315. HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop
  316. HID_RI_USAGE(8, 0x30), // X
  317. HID_RI_USAGE(8, 0x31), // Y
  318. HID_RI_LOGICAL_MAXIMUM(16, 0x7FFF),
  319. HID_RI_REPORT_COUNT(8, 0x02),
  320. HID_RI_REPORT_SIZE(8, 0x10),
  321. HID_RI_UNIT(8, 0x13), // Inch, English Linear
  322. HID_RI_UNIT_EXPONENT(8, 0x0E), // -2
  323. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  324. HID_RI_END_COLLECTION(0),
  325. HID_RI_END_COLLECTION(0),
  326. # ifndef DIGITIZER_SHARED_EP
  327. };
  328. # endif
  329. #endif
  330. #if defined(SHARED_EP_ENABLE) && !defined(SHARED_REPORT_STARTED)
  331. const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = {
  332. #endif
  333. #ifdef EXTRAKEY_ENABLE
  334. HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop
  335. HID_RI_USAGE(8, 0x80), // System Control
  336. HID_RI_COLLECTION(8, 0x01), // Application
  337. HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM),
  338. HID_RI_USAGE_MINIMUM(8, 0x01), // Pointer
  339. HID_RI_USAGE_MAXIMUM(16, 0x00B7), // System Display LCD Autoscale
  340. HID_RI_LOGICAL_MINIMUM(8, 0x01),
  341. HID_RI_LOGICAL_MAXIMUM(16, 0x00B7),
  342. HID_RI_REPORT_COUNT(8, 1),
  343. HID_RI_REPORT_SIZE(8, 16),
  344. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
  345. HID_RI_END_COLLECTION(0),
  346. HID_RI_USAGE_PAGE(8, 0x0C), // Consumer
  347. HID_RI_USAGE(8, 0x01), // Consumer Control
  348. HID_RI_COLLECTION(8, 0x01), // Application
  349. HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER),
  350. HID_RI_USAGE_MINIMUM(8, 0x01), // Consumer Control
  351. HID_RI_USAGE_MAXIMUM(16, 0x02A0), // AC Desktop Show All Applications
  352. HID_RI_LOGICAL_MINIMUM(8, 0x01),
  353. HID_RI_LOGICAL_MAXIMUM(16, 0x02A0),
  354. HID_RI_REPORT_COUNT(8, 1),
  355. HID_RI_REPORT_SIZE(8, 16),
  356. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
  357. HID_RI_END_COLLECTION(0),
  358. #endif
  359. #ifdef PROGRAMMABLE_BUTTON_ENABLE
  360. HID_RI_USAGE_PAGE(8, 0x0C), // Consumer
  361. HID_RI_USAGE(8, 0x01), // Consumer Control
  362. HID_RI_COLLECTION(8, 0x01), // Application
  363. HID_RI_REPORT_ID(8, REPORT_ID_PROGRAMMABLE_BUTTON),
  364. HID_RI_USAGE(8, 0x03), // Programmable Buttons
  365. HID_RI_COLLECTION(8, 0x04), // Named Array
  366. HID_RI_USAGE_PAGE(8, 0x09), // Button
  367. HID_RI_USAGE_MINIMUM(8, 0x01), // Button 1
  368. HID_RI_USAGE_MAXIMUM(8, 0x20), // Button 32
  369. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  370. HID_RI_LOGICAL_MAXIMUM(8, 0x01),
  371. HID_RI_REPORT_COUNT(8, 32),
  372. HID_RI_REPORT_SIZE(8, 1),
  373. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  374. HID_RI_END_COLLECTION(0),
  375. HID_RI_END_COLLECTION(0),
  376. #endif
  377. #ifdef NKRO_ENABLE
  378. HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop
  379. HID_RI_USAGE(8, 0x06), // Keyboard
  380. HID_RI_COLLECTION(8, 0x01), // Application
  381. HID_RI_REPORT_ID(8, REPORT_ID_NKRO),
  382. // Modifiers (8 bits)
  383. HID_RI_USAGE_PAGE(8, 0x07), // Keyboard/Keypad
  384. HID_RI_USAGE_MINIMUM(8, 0xE0), // Keyboard Left Control
  385. HID_RI_USAGE_MAXIMUM(8, 0xE7), // Keyboard Right GUI
  386. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  387. HID_RI_LOGICAL_MAXIMUM(8, 0x01),
  388. HID_RI_REPORT_COUNT(8, 0x08),
  389. HID_RI_REPORT_SIZE(8, 0x01),
  390. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  391. // Keycodes
  392. HID_RI_USAGE_PAGE(8, 0x07), // Keyboard/Keypad
  393. HID_RI_USAGE_MINIMUM(8, 0x00),
  394. HID_RI_USAGE_MAXIMUM(8, NKRO_REPORT_BITS * 8 - 1),
  395. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  396. HID_RI_LOGICAL_MAXIMUM(8, 0x01),
  397. HID_RI_REPORT_COUNT(8, NKRO_REPORT_BITS * 8),
  398. HID_RI_REPORT_SIZE(8, 0x01),
  399. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  400. // Status LEDs (5 bits)
  401. HID_RI_USAGE_PAGE(8, 0x08), // LED
  402. HID_RI_USAGE_MINIMUM(8, 0x01), // Num Lock
  403. HID_RI_USAGE_MAXIMUM(8, 0x05), // Kana
  404. HID_RI_REPORT_COUNT(8, 0x05),
  405. HID_RI_REPORT_SIZE(8, 0x01),
  406. HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
  407. // LED padding (3 bits)
  408. HID_RI_REPORT_COUNT(8, 0x01),
  409. HID_RI_REPORT_SIZE(8, 0x03),
  410. HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
  411. HID_RI_END_COLLECTION(0),
  412. #endif
  413. #ifdef SHARED_EP_ENABLE
  414. };
  415. #endif
  416. #ifdef RAW_ENABLE
  417. const USB_Descriptor_HIDReport_Datatype_t PROGMEM RawReport[] = {
  418. HID_RI_USAGE_PAGE(16, RAW_USAGE_PAGE), // Vendor Defined
  419. HID_RI_USAGE(8, RAW_USAGE_ID), // Vendor Defined
  420. HID_RI_COLLECTION(8, 0x01), // Application
  421. // Data to host
  422. HID_RI_USAGE(8, 0x62), // Vendor Defined
  423. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  424. HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
  425. HID_RI_REPORT_COUNT(8, RAW_EPSIZE),
  426. HID_RI_REPORT_SIZE(8, 0x08),
  427. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  428. // Data from host
  429. HID_RI_USAGE(8, 0x63), // Vendor Defined
  430. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  431. HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
  432. HID_RI_REPORT_COUNT(8, RAW_EPSIZE),
  433. HID_RI_REPORT_SIZE(8, 0x08),
  434. HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
  435. HID_RI_END_COLLECTION(0),
  436. };
  437. #endif
  438. #ifdef CONSOLE_ENABLE
  439. const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = {
  440. HID_RI_USAGE_PAGE(16, 0xFF31), // Vendor Defined (PJRC Teensy compatible)
  441. HID_RI_USAGE(8, 0x74), // Vendor Defined (PJRC Teensy compatible)
  442. HID_RI_COLLECTION(8, 0x01), // Application
  443. // Data to host
  444. HID_RI_USAGE(8, 0x75), // Vendor Defined
  445. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  446. HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
  447. HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
  448. HID_RI_REPORT_SIZE(8, 0x08),
  449. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  450. HID_RI_END_COLLECTION(0),
  451. };
  452. #endif
  453. #ifdef XAP_ENABLE
  454. const USB_Descriptor_HIDReport_Datatype_t PROGMEM XapReport[] = {
  455. HID_RI_USAGE_PAGE(16, 0xFF51), // Vendor Defined ('Q')
  456. HID_RI_USAGE(8, 0x58), // Vendor Defined ('X')
  457. HID_RI_COLLECTION(8, 0x01), // Application
  458. // Data to host
  459. HID_RI_USAGE(8, 0x62), // Vendor Defined
  460. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  461. HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
  462. HID_RI_REPORT_COUNT(8, XAP_EPSIZE),
  463. HID_RI_REPORT_SIZE(8, 0x08),
  464. HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  465. // Data from host
  466. HID_RI_USAGE(8, 0x63), // Vendor Defined
  467. HID_RI_LOGICAL_MINIMUM(8, 0x00),
  468. HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
  469. HID_RI_REPORT_COUNT(8, XAP_EPSIZE),
  470. HID_RI_REPORT_SIZE(8, 0x08),
  471. HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
  472. HID_RI_END_COLLECTION(0),
  473. };
  474. #endif // XAP_ENABLE
  475. /*
  476. * Device descriptor
  477. */
  478. const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = {
  479. .Header = {
  480. .Size = sizeof(USB_Descriptor_Device_t),
  481. .Type = DTYPE_Device
  482. },
  483. .USBSpecification = VERSION_BCD(2, 0, 0),
  484. #if VIRTSER_ENABLE
  485. .Class = USB_CSCP_IADDeviceClass,
  486. .SubClass = USB_CSCP_IADDeviceSubclass,
  487. .Protocol = USB_CSCP_IADDeviceProtocol,
  488. #else
  489. .Class = USB_CSCP_NoDeviceClass,
  490. .SubClass = USB_CSCP_NoDeviceSubclass,
  491. .Protocol = USB_CSCP_NoDeviceProtocol,
  492. #endif
  493. .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
  494. // Specified in config.h
  495. .VendorID = VENDOR_ID,
  496. .ProductID = PRODUCT_ID,
  497. .ReleaseNumber = DEVICE_VER,
  498. .ManufacturerStrIndex = 0x01,
  499. .ProductStrIndex = 0x02,
  500. #ifdef HAS_SERIAL_NUMBER
  501. .SerialNumStrIndex = 0x03,
  502. #else // HAS_SERIAL_NUMBER
  503. .SerialNumStrIndex = 0x00,
  504. #endif // HAS_SERIAL_NUMBER
  505. .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
  506. };
  507. #ifndef USB_MAX_POWER_CONSUMPTION
  508. # define USB_MAX_POWER_CONSUMPTION 500
  509. #endif
  510. #ifndef USB_POLLING_INTERVAL_MS
  511. # define USB_POLLING_INTERVAL_MS 1
  512. #endif
  513. /*
  514. * Configuration descriptors
  515. */
  516. const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = {
  517. .Config = {
  518. .Header = {
  519. .Size = sizeof(USB_Descriptor_Configuration_Header_t),
  520. .Type = DTYPE_Configuration
  521. },
  522. .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
  523. .TotalInterfaces = TOTAL_INTERFACES,
  524. .ConfigurationNumber = 1,
  525. .ConfigurationStrIndex = NO_DESCRIPTOR,
  526. .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP),
  527. .MaxPowerConsumption = USB_CONFIG_POWER_MA(USB_MAX_POWER_CONSUMPTION)
  528. },
  529. #ifndef KEYBOARD_SHARED_EP
  530. /*
  531. * Keyboard
  532. */
  533. .Keyboard_Interface = {
  534. .Header = {
  535. .Size = sizeof(USB_Descriptor_Interface_t),
  536. .Type = DTYPE_Interface
  537. },
  538. .InterfaceNumber = KEYBOARD_INTERFACE,
  539. .AlternateSetting = 0x00,
  540. .TotalEndpoints = 1,
  541. .Class = HID_CSCP_HIDClass,
  542. .SubClass = HID_CSCP_BootSubclass,
  543. .Protocol = HID_CSCP_KeyboardBootProtocol,
  544. .InterfaceStrIndex = NO_DESCRIPTOR
  545. },
  546. .Keyboard_HID = {
  547. .Header = {
  548. .Size = sizeof(USB_HID_Descriptor_HID_t),
  549. .Type = HID_DTYPE_HID
  550. },
  551. .HIDSpec = VERSION_BCD(1, 1, 1),
  552. .CountryCode = 0x00,
  553. .TotalReportDescriptors = 1,
  554. .HIDReportType = HID_DTYPE_Report,
  555. .HIDReportLength = sizeof(KeyboardReport)
  556. },
  557. .Keyboard_INEndpoint = {
  558. .Header = {
  559. .Size = sizeof(USB_Descriptor_Endpoint_t),
  560. .Type = DTYPE_Endpoint
  561. },
  562. .EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),
  563. .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  564. .EndpointSize = KEYBOARD_EPSIZE,
  565. .PollingIntervalMS = USB_POLLING_INTERVAL_MS
  566. },
  567. #endif
  568. #ifdef RAW_ENABLE
  569. /*
  570. * Raw HID
  571. */
  572. .Raw_Interface = {
  573. .Header = {
  574. .Size = sizeof(USB_Descriptor_Interface_t),
  575. .Type = DTYPE_Interface
  576. },
  577. .InterfaceNumber = RAW_INTERFACE,
  578. .AlternateSetting = 0x00,
  579. .TotalEndpoints = 2,
  580. .Class = HID_CSCP_HIDClass,
  581. .SubClass = HID_CSCP_NonBootSubclass,
  582. .Protocol = HID_CSCP_NonBootProtocol,
  583. .InterfaceStrIndex = NO_DESCRIPTOR
  584. },
  585. .Raw_HID = {
  586. .Header = {
  587. .Size = sizeof(USB_HID_Descriptor_HID_t),
  588. .Type = HID_DTYPE_HID
  589. },
  590. .HIDSpec = VERSION_BCD(1, 1, 1),
  591. .CountryCode = 0x00,
  592. .TotalReportDescriptors = 1,
  593. .HIDReportType = HID_DTYPE_Report,
  594. .HIDReportLength = sizeof(RawReport)
  595. },
  596. .Raw_INEndpoint = {
  597. .Header = {
  598. .Size = sizeof(USB_Descriptor_Endpoint_t),
  599. .Type = DTYPE_Endpoint
  600. },
  601. .EndpointAddress = (ENDPOINT_DIR_IN | RAW_IN_EPNUM),
  602. .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  603. .EndpointSize = RAW_EPSIZE,
  604. .PollingIntervalMS = 0x01
  605. },
  606. .Raw_OUTEndpoint = {
  607. .Header = {
  608. .Size = sizeof(USB_Descriptor_Endpoint_t),
  609. .Type = DTYPE_Endpoint
  610. },
  611. .EndpointAddress = (ENDPOINT_DIR_OUT | RAW_OUT_EPNUM),
  612. .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  613. .EndpointSize = RAW_EPSIZE,
  614. .PollingIntervalMS = 0x01
  615. },
  616. #endif
  617. #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
  618. /*
  619. * Mouse
  620. */
  621. .Mouse_Interface = {
  622. .Header = {
  623. .Size = sizeof(USB_Descriptor_Interface_t),
  624. .Type = DTYPE_Interface
  625. },
  626. .InterfaceNumber = MOUSE_INTERFACE,
  627. .AlternateSetting = 0x00,
  628. .TotalEndpoints = 1,
  629. .Class = HID_CSCP_HIDClass,
  630. .SubClass = HID_CSCP_BootSubclass,
  631. .Protocol = HID_CSCP_MouseBootProtocol,
  632. .InterfaceStrIndex = NO_DESCRIPTOR
  633. },
  634. .Mouse_HID = {
  635. .Header = {
  636. .Size = sizeof(USB_HID_Descriptor_HID_t),
  637. .Type = HID_DTYPE_HID
  638. },
  639. .HIDSpec = VERSION_BCD(1, 1, 1),
  640. .CountryCode = 0x00,
  641. .TotalReportDescriptors = 1,
  642. .HIDReportType = HID_DTYPE_Report,
  643. .HIDReportLength = sizeof(MouseReport)
  644. },
  645. .Mouse_INEndpoint = {
  646. .Header = {
  647. .Size = sizeof(USB_Descriptor_Endpoint_t),
  648. .Type = DTYPE_Endpoint
  649. },
  650. .EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),
  651. .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  652. .EndpointSize = MOUSE_EPSIZE,
  653. .PollingIntervalMS = USB_POLLING_INTERVAL_MS
  654. },
  655. #endif
  656. #ifdef SHARED_EP_ENABLE
  657. /*
  658. * Shared
  659. */
  660. .Shared_Interface = {
  661. .Header = {
  662. .Size = sizeof(USB_Descriptor_Interface_t),
  663. .Type = DTYPE_Interface
  664. },
  665. .InterfaceNumber = SHARED_INTERFACE,
  666. .AlternateSetting = 0x00,
  667. .TotalEndpoints = 1,
  668. .Class = HID_CSCP_HIDClass,
  669. # ifdef KEYBOARD_SHARED_EP
  670. .SubClass = HID_CSCP_BootSubclass,
  671. .Protocol = HID_CSCP_KeyboardBootProtocol,
  672. # else
  673. .SubClass = HID_CSCP_NonBootSubclass,
  674. .Protocol = HID_CSCP_NonBootProtocol,
  675. # endif
  676. .InterfaceStrIndex = NO_DESCRIPTOR
  677. },
  678. .Shared_HID = {
  679. .Header = {
  680. .Size = sizeof(USB_HID_Descriptor_HID_t),
  681. .Type = HID_DTYPE_HID
  682. },
  683. .HIDSpec = VERSION_BCD(1, 1, 1),
  684. .CountryCode = 0x00,
  685. .TotalReportDescriptors = 1,
  686. .HIDReportType = HID_DTYPE_Report,
  687. .HIDReportLength = sizeof(SharedReport)
  688. },
  689. .Shared_INEndpoint = {
  690. .Header = {
  691. .Size = sizeof(USB_Descriptor_Endpoint_t),
  692. .Type = DTYPE_Endpoint
  693. },
  694. .EndpointAddress = (ENDPOINT_DIR_IN | SHARED_IN_EPNUM),
  695. .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  696. .EndpointSize = SHARED_EPSIZE,
  697. .PollingIntervalMS = USB_POLLING_INTERVAL_MS
  698. },
  699. #endif
  700. #ifdef CONSOLE_ENABLE
  701. /*
  702. * Console
  703. */
  704. .Console_Interface = {
  705. .Header = {
  706. .Size = sizeof(USB_Descriptor_Interface_t),
  707. .Type = DTYPE_Interface
  708. },
  709. .InterfaceNumber = CONSOLE_INTERFACE,
  710. .AlternateSetting = 0x00,
  711. .TotalEndpoints = 1,
  712. .Class = HID_CSCP_HIDClass,
  713. .SubClass = HID_CSCP_NonBootSubclass,
  714. .Protocol = HID_CSCP_NonBootProtocol,
  715. .InterfaceStrIndex = NO_DESCRIPTOR
  716. },
  717. .Console_HID = {
  718. .Header = {
  719. .Size = sizeof(USB_HID_Descriptor_HID_t),
  720. .Type = HID_DTYPE_HID
  721. },
  722. .HIDSpec = VERSION_BCD(1, 1, 1),
  723. .CountryCode = 0x00,
  724. .TotalReportDescriptors = 1,
  725. .HIDReportType = HID_DTYPE_Report,
  726. .HIDReportLength = sizeof(ConsoleReport)
  727. },
  728. .Console_INEndpoint = {
  729. .Header = {
  730. .Size = sizeof(USB_Descriptor_Endpoint_t),
  731. .Type = DTYPE_Endpoint
  732. },
  733. .EndpointAddress = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM),
  734. .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  735. .EndpointSize = CONSOLE_EPSIZE,
  736. .PollingIntervalMS = 0x01
  737. },
  738. #endif
  739. #ifdef MIDI_ENABLE
  740. /*
  741. * MIDI
  742. */
  743. .Audio_Interface_Association = {
  744. .Header = {
  745. .Size = sizeof(USB_Descriptor_Interface_Association_t),
  746. .Type = DTYPE_InterfaceAssociation
  747. },
  748. .FirstInterfaceIndex = AC_INTERFACE,
  749. .TotalInterfaces = 2,
  750. .Class = AUDIO_CSCP_AudioClass,
  751. .SubClass = AUDIO_CSCP_ControlSubclass,
  752. .Protocol = AUDIO_CSCP_ControlProtocol,
  753. .IADStrIndex = NO_DESCRIPTOR,
  754. },
  755. .Audio_ControlInterface = {
  756. .Header = {
  757. .Size = sizeof(USB_Descriptor_Interface_t),
  758. .Type = DTYPE_Interface
  759. },
  760. .InterfaceNumber = AC_INTERFACE,
  761. .AlternateSetting = 0,
  762. .TotalEndpoints = 0,
  763. .Class = AUDIO_CSCP_AudioClass,
  764. .SubClass = AUDIO_CSCP_ControlSubclass,
  765. .Protocol = AUDIO_CSCP_ControlProtocol,
  766. .InterfaceStrIndex = NO_DESCRIPTOR
  767. },
  768. .Audio_ControlInterface_SPC = {
  769. .Header = {
  770. .Size = sizeof(USB_Audio_Descriptor_Interface_AC_t),
  771. .Type = AUDIO_DTYPE_CSInterface
  772. },
  773. .Subtype = AUDIO_DSUBTYPE_CSInterface_Header,
  774. .ACSpecification = VERSION_BCD(1, 0, 0),
  775. .TotalLength = sizeof(USB_Audio_Descriptor_Interface_AC_t),
  776. .InCollection = 1,
  777. .InterfaceNumber = AS_INTERFACE,
  778. },
  779. .Audio_StreamInterface = {
  780. .Header = {
  781. .Size = sizeof(USB_Descriptor_Interface_t),
  782. .Type = DTYPE_Interface
  783. },
  784. .InterfaceNumber = AS_INTERFACE,
  785. .AlternateSetting = 0,
  786. .TotalEndpoints = 2,
  787. .Class = AUDIO_CSCP_AudioClass,
  788. .SubClass = AUDIO_CSCP_MIDIStreamingSubclass,
  789. .Protocol = AUDIO_CSCP_StreamingProtocol,
  790. .InterfaceStrIndex = NO_DESCRIPTOR
  791. },
  792. .Audio_StreamInterface_SPC = {
  793. .Header = {
  794. .Size = sizeof(USB_MIDI_Descriptor_AudioInterface_AS_t),
  795. .Type = AUDIO_DTYPE_CSInterface
  796. },
  797. .Subtype = AUDIO_DSUBTYPE_CSInterface_General,
  798. .AudioSpecification = VERSION_BCD(1, 0, 0),
  799. .TotalLength = offsetof(USB_Descriptor_Configuration_t, MIDI_Out_Jack_Endpoint_SPC) + sizeof(USB_MIDI_Descriptor_Jack_Endpoint_t) - offsetof(USB_Descriptor_Configuration_t, Audio_StreamInterface_SPC)
  800. },
  801. .MIDI_In_Jack_Emb = {
  802. .Header = {
  803. .Size = sizeof(USB_MIDI_Descriptor_InputJack_t),
  804. .Type = AUDIO_DTYPE_CSInterface
  805. },
  806. .Subtype = AUDIO_DSUBTYPE_CSInterface_InputTerminal,
  807. .JackType = MIDI_JACKTYPE_Embedded,
  808. .JackID = 0x01,
  809. .JackStrIndex = NO_DESCRIPTOR
  810. },
  811. .MIDI_In_Jack_Ext = {
  812. .Header = {
  813. .Size = sizeof(USB_MIDI_Descriptor_InputJack_t),
  814. .Type = AUDIO_DTYPE_CSInterface
  815. },
  816. .Subtype = AUDIO_DSUBTYPE_CSInterface_InputTerminal,
  817. .JackType = MIDI_JACKTYPE_External,
  818. .JackID = 0x02,
  819. .JackStrIndex = NO_DESCRIPTOR
  820. },
  821. .MIDI_Out_Jack_Emb = {
  822. .Header = {
  823. .Size = sizeof(USB_MIDI_Descriptor_OutputJack_t),
  824. .Type = AUDIO_DTYPE_CSInterface
  825. },
  826. .Subtype = AUDIO_DSUBTYPE_CSInterface_OutputTerminal,
  827. .JackType = MIDI_JACKTYPE_Embedded,
  828. .JackID = 0x03,
  829. .NumberOfPins = 1,
  830. .SourceJackID = {0x02},
  831. .SourcePinID = {0x01},
  832. .JackStrIndex = NO_DESCRIPTOR
  833. },
  834. .MIDI_Out_Jack_Ext = {
  835. .Header = {
  836. .Size = sizeof(USB_MIDI_Descriptor_OutputJack_t),
  837. .Type = AUDIO_DTYPE_CSInterface
  838. },
  839. .Subtype = AUDIO_DSUBTYPE_CSInterface_OutputTerminal,
  840. .JackType = MIDI_JACKTYPE_External,
  841. .JackID = 0x04,
  842. .NumberOfPins = 1,
  843. .SourceJackID = {0x01},
  844. .SourcePinID = {0x01},
  845. .JackStrIndex = NO_DESCRIPTOR
  846. },
  847. .MIDI_In_Jack_Endpoint = {
  848. .Endpoint = {
  849. .Header = {
  850. .Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t),
  851. .Type = DTYPE_Endpoint
  852. },
  853. .EndpointAddress = (ENDPOINT_DIR_OUT | MIDI_STREAM_OUT_EPNUM),
  854. .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  855. .EndpointSize = MIDI_STREAM_EPSIZE,
  856. .PollingIntervalMS = 0x05
  857. },
  858. .Refresh = 0,
  859. .SyncEndpointNumber = 0
  860. },
  861. .MIDI_In_Jack_Endpoint_SPC = {
  862. .Header = {
  863. .Size = sizeof(USB_MIDI_Descriptor_Jack_Endpoint_t),
  864. .Type = AUDIO_DTYPE_CSEndpoint
  865. },
  866. .Subtype = AUDIO_DSUBTYPE_CSEndpoint_General,
  867. .TotalEmbeddedJacks = 0x01,
  868. .AssociatedJackID = {0x01}
  869. },
  870. .MIDI_Out_Jack_Endpoint = {
  871. .Endpoint = {
  872. .Header = {
  873. .Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t),
  874. .Type = DTYPE_Endpoint
  875. },
  876. .EndpointAddress = (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM),
  877. .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  878. .EndpointSize = MIDI_STREAM_EPSIZE,
  879. .PollingIntervalMS = 0x05
  880. },
  881. .Refresh = 0,
  882. .SyncEndpointNumber = 0
  883. },
  884. .MIDI_Out_Jack_Endpoint_SPC = {
  885. .Header = {
  886. .Size = sizeof(USB_MIDI_Descriptor_Jack_Endpoint_t),
  887. .Type = AUDIO_DTYPE_CSEndpoint
  888. },
  889. .Subtype = AUDIO_DSUBTYPE_CSEndpoint_General,
  890. .TotalEmbeddedJacks = 0x01,
  891. .AssociatedJackID = {0x03}
  892. },
  893. #endif
  894. #ifdef VIRTSER_ENABLE
  895. /*
  896. * Virtual Serial
  897. */
  898. .CDC_Interface_Association = {
  899. .Header = {
  900. .Size = sizeof(USB_Descriptor_Interface_Association_t),
  901. .Type = DTYPE_InterfaceAssociation
  902. },
  903. .FirstInterfaceIndex = CCI_INTERFACE,
  904. .TotalInterfaces = 2,
  905. .Class = CDC_CSCP_CDCClass,
  906. .SubClass = CDC_CSCP_ACMSubclass,
  907. .Protocol = CDC_CSCP_ATCommandProtocol,
  908. .IADStrIndex = NO_DESCRIPTOR,
  909. },
  910. .CDC_CCI_Interface = {
  911. .Header = {
  912. .Size = sizeof(USB_Descriptor_Interface_t),
  913. .Type = DTYPE_Interface
  914. },
  915. .InterfaceNumber = CCI_INTERFACE,
  916. .AlternateSetting = 0,
  917. .TotalEndpoints = 1,
  918. .Class = CDC_CSCP_CDCClass,
  919. .SubClass = CDC_CSCP_ACMSubclass,
  920. .Protocol = CDC_CSCP_ATCommandProtocol,
  921. .InterfaceStrIndex = NO_DESCRIPTOR
  922. },
  923. .CDC_Functional_Header = {
  924. .Header = {
  925. .Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t),
  926. .Type = CDC_DTYPE_CSInterface
  927. },
  928. .Subtype = 0x00,
  929. .CDCSpecification = VERSION_BCD(1, 1, 0),
  930. },
  931. .CDC_Functional_ACM = {
  932. .Header = {
  933. .Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t),
  934. .Type = CDC_DTYPE_CSInterface
  935. },
  936. .Subtype = 0x02,
  937. .Capabilities = 0x02,
  938. },
  939. .CDC_Functional_Union = {
  940. .Header = {
  941. .Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t),
  942. .Type = CDC_DTYPE_CSInterface
  943. },
  944. .Subtype = 0x06,
  945. .MasterInterfaceNumber = CCI_INTERFACE,
  946. .SlaveInterfaceNumber = CDI_INTERFACE,
  947. },
  948. .CDC_NotificationEndpoint = {
  949. .Header = {
  950. .Size = sizeof(USB_Descriptor_Endpoint_t),
  951. .Type = DTYPE_Endpoint
  952. },
  953. .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM),
  954. .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  955. .EndpointSize = CDC_NOTIFICATION_EPSIZE,
  956. .PollingIntervalMS = 0xFF
  957. },
  958. .CDC_DCI_Interface = {
  959. .Header = {
  960. .Size = sizeof(USB_Descriptor_Interface_t),
  961. .Type = DTYPE_Interface
  962. },
  963. .InterfaceNumber = CDI_INTERFACE,
  964. .AlternateSetting = 0,
  965. .TotalEndpoints = 2,
  966. .Class = CDC_CSCP_CDCDataClass,
  967. .SubClass = CDC_CSCP_NoDataSubclass,
  968. .Protocol = CDC_CSCP_NoDataProtocol,
  969. .InterfaceStrIndex = NO_DESCRIPTOR
  970. },
  971. .CDC_DataOutEndpoint = {
  972. .Header = {
  973. .Size = sizeof(USB_Descriptor_Endpoint_t),
  974. .Type = DTYPE_Endpoint
  975. },
  976. .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_OUT_EPNUM),
  977. .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  978. .EndpointSize = CDC_EPSIZE,
  979. .PollingIntervalMS = 0x05
  980. },
  981. .CDC_DataInEndpoint = {
  982. .Header = {
  983. .Size = sizeof(USB_Descriptor_Endpoint_t),
  984. .Type = DTYPE_Endpoint
  985. },
  986. .EndpointAddress = (ENDPOINT_DIR_IN | CDC_IN_EPNUM),
  987. .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  988. .EndpointSize = CDC_EPSIZE,
  989. .PollingIntervalMS = 0x05
  990. },
  991. #endif
  992. #if defined(JOYSTICK_ENABLE) && !defined(JOYSTICK_SHARED_EP)
  993. /*
  994. * Joystick
  995. */
  996. .Joystick_Interface = {
  997. .Header = {
  998. .Size = sizeof(USB_Descriptor_Interface_t),
  999. .Type = DTYPE_Interface
  1000. },
  1001. .InterfaceNumber = JOYSTICK_INTERFACE,
  1002. .AlternateSetting = 0x00,
  1003. .TotalEndpoints = 1,
  1004. .Class = HID_CSCP_HIDClass,
  1005. .SubClass = HID_CSCP_NonBootSubclass,
  1006. .Protocol = HID_CSCP_NonBootProtocol,
  1007. .InterfaceStrIndex = NO_DESCRIPTOR
  1008. },
  1009. .Joystick_HID = {
  1010. .Header = {
  1011. .Size = sizeof(USB_HID_Descriptor_HID_t),
  1012. .Type = HID_DTYPE_HID
  1013. },
  1014. .HIDSpec = VERSION_BCD(1, 1, 1),
  1015. .CountryCode = 0x00,
  1016. .TotalReportDescriptors = 1,
  1017. .HIDReportType = HID_DTYPE_Report,
  1018. .HIDReportLength = sizeof(JoystickReport)
  1019. },
  1020. .Joystick_INEndpoint = {
  1021. .Header = {
  1022. .Size = sizeof(USB_Descriptor_Endpoint_t),
  1023. .Type = DTYPE_Endpoint
  1024. },
  1025. .EndpointAddress = (ENDPOINT_DIR_IN | JOYSTICK_IN_EPNUM),
  1026. .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  1027. .EndpointSize = JOYSTICK_EPSIZE,
  1028. .PollingIntervalMS = USB_POLLING_INTERVAL_MS
  1029. },
  1030. #endif
  1031. #if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
  1032. /*
  1033. * Digitizer
  1034. */
  1035. .Digitizer_Interface = {
  1036. .Header = {
  1037. .Size = sizeof(USB_Descriptor_Interface_t),
  1038. .Type = DTYPE_Interface
  1039. },
  1040. .InterfaceNumber = DIGITIZER_INTERFACE,
  1041. .AlternateSetting = 0x00,
  1042. .TotalEndpoints = 1,
  1043. .Class = HID_CSCP_HIDClass,
  1044. .SubClass = HID_CSCP_NonBootSubclass,
  1045. .Protocol = HID_CSCP_NonBootProtocol,
  1046. .InterfaceStrIndex = NO_DESCRIPTOR
  1047. },
  1048. .Digitizer_HID = {
  1049. .Header = {
  1050. .Size = sizeof(USB_HID_Descriptor_HID_t),
  1051. .Type = HID_DTYPE_HID
  1052. },
  1053. .HIDSpec = VERSION_BCD(1, 1, 1),
  1054. .CountryCode = 0x00,
  1055. .TotalReportDescriptors = 1,
  1056. .HIDReportType = HID_DTYPE_Report,
  1057. .HIDReportLength = sizeof(DigitizerReport)
  1058. },
  1059. .Digitizer_INEndpoint = {
  1060. .Header = {
  1061. .Size = sizeof(USB_Descriptor_Endpoint_t),
  1062. .Type = DTYPE_Endpoint
  1063. },
  1064. .EndpointAddress = (ENDPOINT_DIR_IN | DIGITIZER_IN_EPNUM),
  1065. .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  1066. .EndpointSize = DIGITIZER_EPSIZE,
  1067. .PollingIntervalMS = USB_POLLING_INTERVAL_MS
  1068. },
  1069. #endif
  1070. #ifdef XAP_ENABLE
  1071. /*
  1072. * QMK XAP
  1073. */
  1074. .Xap_Interface = {
  1075. .Header = {
  1076. .Size = sizeof(USB_Descriptor_Interface_t),
  1077. .Type = DTYPE_Interface
  1078. },
  1079. .InterfaceNumber = XAP_INTERFACE,
  1080. .AlternateSetting = 0x00,
  1081. .TotalEndpoints = 2,
  1082. .Class = HID_CSCP_HIDClass,
  1083. .SubClass = HID_CSCP_NonBootSubclass,
  1084. .Protocol = HID_CSCP_NonBootProtocol,
  1085. .InterfaceStrIndex = NO_DESCRIPTOR
  1086. },
  1087. .Xap_HID = {
  1088. .Header = {
  1089. .Size = sizeof(USB_HID_Descriptor_HID_t),
  1090. .Type = HID_DTYPE_HID
  1091. },
  1092. .HIDSpec = VERSION_BCD(1, 1, 1),
  1093. .CountryCode = 0x00,
  1094. .TotalReportDescriptors = 1,
  1095. .HIDReportType = HID_DTYPE_Report,
  1096. .HIDReportLength = sizeof(XapReport)
  1097. },
  1098. .Xap_INEndpoint = {
  1099. .Header = {
  1100. .Size = sizeof(USB_Descriptor_Endpoint_t),
  1101. .Type = DTYPE_Endpoint
  1102. },
  1103. .EndpointAddress = (ENDPOINT_DIR_IN | XAP_IN_EPNUM),
  1104. .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  1105. .EndpointSize = XAP_EPSIZE,
  1106. .PollingIntervalMS = 0x01
  1107. },
  1108. .Xap_OUTEndpoint = {
  1109. .Header = {
  1110. .Size = sizeof(USB_Descriptor_Endpoint_t),
  1111. .Type = DTYPE_Endpoint
  1112. },
  1113. .EndpointAddress = (ENDPOINT_DIR_OUT | XAP_OUT_EPNUM),
  1114. .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
  1115. .EndpointSize = XAP_EPSIZE,
  1116. .PollingIntervalMS = 0x01
  1117. },
  1118. #endif
  1119. };
  1120. /*
  1121. * String descriptors
  1122. */
  1123. #define USB_DESCRIPTOR_SIZE_LITERAL_U16STRING(str) \
  1124. (sizeof(USB_Descriptor_Header_t) + sizeof(str) - sizeof(wchar_t)) // include header, don't count null terminator
  1125. const USB_Descriptor_String_t PROGMEM LanguageString = {
  1126. .Header = {
  1127. .Size = sizeof(USB_Descriptor_Header_t) + sizeof(uint16_t),
  1128. .Type = DTYPE_String
  1129. },
  1130. .UnicodeString = {LANGUAGE_ID_ENG}
  1131. };
  1132. const USB_Descriptor_String_t PROGMEM ManufacturerString = {
  1133. .Header = {
  1134. .Size = USB_DESCRIPTOR_SIZE_LITERAL_U16STRING(USBSTR(MANUFACTURER)),
  1135. .Type = DTYPE_String
  1136. },
  1137. .UnicodeString = USBSTR(MANUFACTURER)
  1138. };
  1139. const USB_Descriptor_String_t PROGMEM ProductString = {
  1140. .Header = {
  1141. .Size = USB_DESCRIPTOR_SIZE_LITERAL_U16STRING(USBSTR(PRODUCT)),
  1142. .Type = DTYPE_String
  1143. },
  1144. .UnicodeString = USBSTR(PRODUCT)
  1145. };
  1146. // clang-format on
  1147. #if defined(SERIAL_NUMBER)
  1148. // clang-format off
  1149. const USB_Descriptor_String_t PROGMEM SerialNumberString = {
  1150. .Header = {
  1151. .Size = USB_DESCRIPTOR_SIZE_LITERAL_U16STRING(USBSTR(SERIAL_NUMBER)),
  1152. .Type = DTYPE_String
  1153. },
  1154. .UnicodeString = USBSTR(SERIAL_NUMBER)
  1155. };
  1156. // clang-format on
  1157. #else // defined(SERIAL_NUMBER)
  1158. # if defined(SERIAL_NUMBER_USE_HARDWARE_ID) && SERIAL_NUMBER_USE_HARDWARE_ID == TRUE
  1159. # if defined(__AVR__)
  1160. # error Dynamically setting the serial number on AVR is unsupported as LUFA requires the string to be in PROGMEM.
  1161. # endif // defined(__AVR__)
  1162. # ifndef SERIAL_NUMBER_LENGTH
  1163. # define SERIAL_NUMBER_LENGTH (sizeof(hardware_id_t) * 2)
  1164. # endif
  1165. # define SERIAL_NUMBER_DESCRIPTOR_SIZE \
  1166. (sizeof(USB_Descriptor_Header_t) /* Descriptor header */ \
  1167. + (((SERIAL_NUMBER_LENGTH) + 1) * sizeof(wchar_t))) /* Length of serial number, with potential extra character as we're converting 2 nibbles at a time */
  1168. uint8_t SerialNumberString[SERIAL_NUMBER_DESCRIPTOR_SIZE] = {0};
  1169. void set_serial_number_descriptor(void) {
  1170. static bool is_set = false;
  1171. if (is_set) {
  1172. return;
  1173. }
  1174. is_set = true;
  1175. static const char hex_str[] = "0123456789ABCDEF";
  1176. hardware_id_t id = get_hardware_id();
  1177. USB_Descriptor_String_t* desc = (USB_Descriptor_String_t*)SerialNumberString;
  1178. // Copy across nibbles from the hardware ID as unicode hex characters
  1179. int length = MIN(sizeof(id) * 2, SERIAL_NUMBER_LENGTH);
  1180. uint8_t* p = (uint8_t*)&id;
  1181. for (int i = 0; i < length; i += 2) {
  1182. desc->UnicodeString[i + 0] = hex_str[p[i / 2] >> 4];
  1183. desc->UnicodeString[i + 1] = hex_str[p[i / 2] & 0xF];
  1184. }
  1185. desc->Header.Size = sizeof(USB_Descriptor_Header_t) + (length * sizeof(wchar_t)); // includes header, don't count null terminator
  1186. desc->Header.Type = DTYPE_String;
  1187. }
  1188. # endif // defined(SERIAL_NUMBER_USE_HARDWARE_ID) && SERIAL_NUMBER_USE_HARDWARE_ID == TRUE
  1189. #endif // defined(SERIAL_NUMBER)
  1190. /**
  1191. * This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
  1192. * documentation) by the application code so that the address and size of a requested descriptor can be given
  1193. * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
  1194. * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
  1195. * USB host.
  1196. */
  1197. uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const uint16_t wLength, const void** const DescriptorAddress) {
  1198. const uint8_t DescriptorType = (wValue >> 8);
  1199. const uint8_t DescriptorIndex = (wValue & 0xFF);
  1200. const void* Address = NULL;
  1201. uint16_t Size = NO_DESCRIPTOR;
  1202. switch (DescriptorType) {
  1203. case DTYPE_Device:
  1204. Address = &DeviceDescriptor;
  1205. Size = sizeof(USB_Descriptor_Device_t);
  1206. break;
  1207. case DTYPE_Configuration:
  1208. Address = &ConfigurationDescriptor;
  1209. Size = sizeof(USB_Descriptor_Configuration_t);
  1210. break;
  1211. case DTYPE_String:
  1212. switch (DescriptorIndex) {
  1213. case 0x00:
  1214. Address = &LanguageString;
  1215. Size = pgm_read_byte(&LanguageString.Header.Size);
  1216. break;
  1217. case 0x01:
  1218. Address = &ManufacturerString;
  1219. Size = pgm_read_byte(&ManufacturerString.Header.Size);
  1220. break;
  1221. case 0x02:
  1222. Address = &ProductString;
  1223. Size = pgm_read_byte(&ProductString.Header.Size);
  1224. break;
  1225. #ifdef HAS_SERIAL_NUMBER
  1226. case 0x03:
  1227. Address = (const USB_Descriptor_String_t*)&SerialNumberString;
  1228. # if defined(SERIAL_NUMBER)
  1229. Size = pgm_read_byte(&SerialNumberString.Header.Size);
  1230. # else
  1231. set_serial_number_descriptor();
  1232. Size = ((const USB_Descriptor_String_t*)SerialNumberString)->Header.Size;
  1233. # endif
  1234. break;
  1235. #endif // HAS_SERIAL_NUMBER
  1236. }
  1237. #ifdef OS_DETECTION_ENABLE
  1238. process_wlength(wLength);
  1239. #endif
  1240. break;
  1241. case HID_DTYPE_HID:
  1242. switch (wIndex) {
  1243. #ifndef KEYBOARD_SHARED_EP
  1244. case KEYBOARD_INTERFACE:
  1245. Address = &ConfigurationDescriptor.Keyboard_HID;
  1246. Size = sizeof(USB_HID_Descriptor_HID_t);
  1247. break;
  1248. #endif
  1249. #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
  1250. case MOUSE_INTERFACE:
  1251. Address = &ConfigurationDescriptor.Mouse_HID;
  1252. Size = sizeof(USB_HID_Descriptor_HID_t);
  1253. break;
  1254. #endif
  1255. #ifdef SHARED_EP_ENABLE
  1256. case SHARED_INTERFACE:
  1257. Address = &ConfigurationDescriptor.Shared_HID;
  1258. Size = sizeof(USB_HID_Descriptor_HID_t);
  1259. break;
  1260. #endif
  1261. #ifdef RAW_ENABLE
  1262. case RAW_INTERFACE:
  1263. Address = &ConfigurationDescriptor.Raw_HID;
  1264. Size = sizeof(USB_HID_Descriptor_HID_t);
  1265. break;
  1266. #endif
  1267. #ifdef CONSOLE_ENABLE
  1268. case CONSOLE_INTERFACE:
  1269. Address = &ConfigurationDescriptor.Console_HID;
  1270. Size = sizeof(USB_HID_Descriptor_HID_t);
  1271. break;
  1272. #endif
  1273. #if defined(JOYSTICK_ENABLE) && !defined(JOYSTICK_SHARED_EP)
  1274. case JOYSTICK_INTERFACE:
  1275. Address = &ConfigurationDescriptor.Joystick_HID;
  1276. Size = sizeof(USB_HID_Descriptor_HID_t);
  1277. break;
  1278. #endif
  1279. #if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
  1280. case DIGITIZER_INTERFACE:
  1281. Address = &ConfigurationDescriptor.Digitizer_HID;
  1282. Size = sizeof(USB_HID_Descriptor_HID_t);
  1283. break;
  1284. #endif
  1285. #ifdef XAP_ENABLE
  1286. case XAP_INTERFACE:
  1287. Address = &ConfigurationDescriptor.Xap_HID;
  1288. Size = sizeof(USB_HID_Descriptor_HID_t);
  1289. break;
  1290. #endif
  1291. }
  1292. break;
  1293. case HID_DTYPE_Report:
  1294. switch (wIndex) {
  1295. #ifndef KEYBOARD_SHARED_EP
  1296. case KEYBOARD_INTERFACE:
  1297. Address = &KeyboardReport;
  1298. Size = sizeof(KeyboardReport);
  1299. break;
  1300. #endif
  1301. #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
  1302. case MOUSE_INTERFACE:
  1303. Address = &MouseReport;
  1304. Size = sizeof(MouseReport);
  1305. break;
  1306. #endif
  1307. #ifdef SHARED_EP_ENABLE
  1308. case SHARED_INTERFACE:
  1309. Address = &SharedReport;
  1310. Size = sizeof(SharedReport);
  1311. break;
  1312. #endif
  1313. #ifdef RAW_ENABLE
  1314. case RAW_INTERFACE:
  1315. Address = &RawReport;
  1316. Size = sizeof(RawReport);
  1317. break;
  1318. #endif
  1319. #ifdef CONSOLE_ENABLE
  1320. case CONSOLE_INTERFACE:
  1321. Address = &ConsoleReport;
  1322. Size = sizeof(ConsoleReport);
  1323. break;
  1324. #endif
  1325. #if defined(JOYSTICK_ENABLE) && !defined(JOYSTICK_SHARED_EP)
  1326. case JOYSTICK_INTERFACE:
  1327. Address = &JoystickReport;
  1328. Size = sizeof(JoystickReport);
  1329. break;
  1330. #endif
  1331. #if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
  1332. case DIGITIZER_INTERFACE:
  1333. Address = &DigitizerReport;
  1334. Size = sizeof(DigitizerReport);
  1335. break;
  1336. #endif
  1337. #ifdef XAP_ENABLE
  1338. case XAP_INTERFACE:
  1339. Address = &XapReport;
  1340. Size = sizeof(XapReport);
  1341. break;
  1342. #endif
  1343. }
  1344. break;
  1345. }
  1346. *DescriptorAddress = Address;
  1347. return Size;
  1348. }