usb_descriptor.c 54 KB

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