usb_descriptor.c 62 KB

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