usb_descriptor.c 49 KB

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