usb_descriptor.c 51 KB

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