usb_descriptor.c 57 KB

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