usb_descriptor.c 50 KB

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