usb_descriptor.c 50 KB

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