usb_descriptor.c 53 KB

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