Teensy 4.1 core updated for C++20
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

пре 11 година
пре 11 година
пре 10 година
пре 11 година
пре 10 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 7 година
пре 11 година
пре 11 година
пре 8 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 9 година
пре 8 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 10 година
пре 11 година
пре 11 година
пре 11 година
пре 10 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 10 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 9 година
пре 9 година
пре 8 година
пре 8 година
пре 8 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 8 година
пре 11 година
пре 10 година
пре 11 година
пре 10 година
пре 11 година
пре 10 година
пре 11 година
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676
  1. /* Teensyduino Core Library
  2. * http://www.pjrc.com/teensy/
  3. * Copyright (c) 2017 PJRC.COM, LLC.
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining
  6. * a copy of this software and associated documentation files (the
  7. * "Software"), to deal in the Software without restriction, including
  8. * without limitation the rights to use, copy, modify, merge, publish,
  9. * distribute, sublicense, and/or sell copies of the Software, and to
  10. * permit persons to whom the Software is furnished to do so, subject to
  11. * the following conditions:
  12. *
  13. * 1. The above copyright notice and this permission notice shall be
  14. * included in all copies or substantial portions of the Software.
  15. *
  16. * 2. If the Software is incorporated into a build system that allows
  17. * selection among a list of target devices, then similar target
  18. * devices manufactured by PJRC.COM must be included in the list of
  19. * target devices and selectable in the same manner.
  20. *
  21. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  22. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  23. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  24. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  25. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  26. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  27. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  28. * SOFTWARE.
  29. */
  30. #if F_CPU >= 20000000
  31. #define USB_DESC_LIST_DEFINE
  32. #include "usb_desc.h"
  33. #ifdef NUM_ENDPOINTS
  34. #include "usb_names.h"
  35. #include "kinetis.h"
  36. #include "avr_functions.h"
  37. // USB Descriptors are binary data which the USB host reads to
  38. // automatically detect a USB device's capabilities. The format
  39. // and meaning of every field is documented in numerous USB
  40. // standards. When working with USB descriptors, despite the
  41. // complexity of the standards and poor writing quality in many
  42. // of those documents, remember descriptors are nothing more
  43. // than constant binary data that tells the USB host what the
  44. // device can do. Computers will load drivers based on this data.
  45. // Those drivers then communicate on the endpoints specified by
  46. // the descriptors.
  47. // To configure a new combination of interfaces or make minor
  48. // changes to existing configuration (eg, change the name or ID
  49. // numbers), usually you would edit "usb_desc.h". This file
  50. // is meant to be configured by the header, so generally it is
  51. // only edited to add completely new USB interfaces or features.
  52. // **************************************************************
  53. // USB Device
  54. // **************************************************************
  55. #define LSB(n) ((n) & 255)
  56. #define MSB(n) (((n) >> 8) & 255)
  57. // USB Device Descriptor. The USB host reads this first, to learn
  58. // what type of device is connected.
  59. static uint8_t device_descriptor[] = {
  60. 18, // bLength
  61. 1, // bDescriptorType
  62. 0x10, 0x01, // bcdUSB
  63. #ifdef DEVICE_CLASS
  64. DEVICE_CLASS, // bDeviceClass
  65. #else
  66. 0,
  67. #endif
  68. #ifdef DEVICE_SUBCLASS
  69. DEVICE_SUBCLASS, // bDeviceSubClass
  70. #else
  71. 0,
  72. #endif
  73. #ifdef DEVICE_PROTOCOL
  74. DEVICE_PROTOCOL, // bDeviceProtocol
  75. #else
  76. 0,
  77. #endif
  78. EP0_SIZE, // bMaxPacketSize0
  79. LSB(VENDOR_ID), MSB(VENDOR_ID), // idVendor
  80. LSB(PRODUCT_ID), MSB(PRODUCT_ID), // idProduct
  81. #ifdef BCD_DEVICE
  82. LSB(BCD_DEVICE), MSB(BCD_DEVICE), // bcdDevice
  83. #else
  84. // For USB types that don't explicitly define BCD_DEVICE,
  85. // use the minor version number to help teensy_ports
  86. // identify which Teensy model is used.
  87. #if defined(__MKL26Z64__)
  88. 0x73, 0x02,
  89. #elif defined(__MK20DX128__)
  90. 0x74, 0x02,
  91. #elif defined(__MK20DX256__)
  92. 0x75, 0x02,
  93. #elif defined(__MK64FX512__)
  94. 0x76, 0x02,
  95. #elif defined(__MK66FX1M0__)
  96. 0x77, 0x02,
  97. #else
  98. 0x00, 0x02,
  99. #endif
  100. #endif
  101. 1, // iManufacturer
  102. 2, // iProduct
  103. 3, // iSerialNumber
  104. 1 // bNumConfigurations
  105. };
  106. // These descriptors must NOT be "const", because the USB DMA
  107. // has trouble accessing flash memory with enough bandwidth
  108. // while the processor is executing from flash.
  109. // **************************************************************
  110. // HID Report Descriptors
  111. // **************************************************************
  112. // Each HID interface needs a special report descriptor that tells
  113. // the meaning and format of the data.
  114. #ifdef KEYBOARD_INTERFACE
  115. // Keyboard Protocol 1, HID 1.11 spec, Appendix B, page 59-60
  116. static uint8_t keyboard_report_desc[] = {
  117. 0x05, 0x01, // Usage Page (Generic Desktop),
  118. 0x09, 0x06, // Usage (Keyboard),
  119. 0xA1, 0x01, // Collection (Application),
  120. 0x75, 0x01, // Report Size (1),
  121. 0x95, 0x08, // Report Count (8),
  122. 0x05, 0x07, // Usage Page (Key Codes),
  123. 0x19, 0xE0, // Usage Minimum (224),
  124. 0x29, 0xE7, // Usage Maximum (231),
  125. 0x15, 0x00, // Logical Minimum (0),
  126. 0x25, 0x01, // Logical Maximum (1),
  127. 0x81, 0x02, // Input (Data, Variable, Absolute), ;Modifier keys
  128. 0x95, 0x01, // Report Count (1),
  129. 0x75, 0x08, // Report Size (8),
  130. 0x81, 0x03, // Input (Constant), ;Reserved byte
  131. 0x95, 0x05, // Report Count (5),
  132. 0x75, 0x01, // Report Size (1),
  133. 0x05, 0x08, // Usage Page (LEDs),
  134. 0x19, 0x01, // Usage Minimum (1),
  135. 0x29, 0x05, // Usage Maximum (5),
  136. 0x91, 0x02, // Output (Data, Variable, Absolute), ;LED report
  137. 0x95, 0x01, // Report Count (1),
  138. 0x75, 0x03, // Report Size (3),
  139. 0x91, 0x03, // Output (Constant), ;LED report padding
  140. 0x95, 0x06, // Report Count (6),
  141. 0x75, 0x08, // Report Size (8),
  142. 0x15, 0x00, // Logical Minimum (0),
  143. 0x25, 0x7F, // Logical Maximum(104),
  144. 0x05, 0x07, // Usage Page (Key Codes),
  145. 0x19, 0x00, // Usage Minimum (0),
  146. 0x29, 0x7F, // Usage Maximum (104),
  147. 0x81, 0x00, // Input (Data, Array), ;Normal keys
  148. 0xC0 // End Collection
  149. };
  150. #endif
  151. #ifdef KEYMEDIA_INTERFACE
  152. static uint8_t keymedia_report_desc[] = {
  153. 0x05, 0x0C, // Usage Page (Consumer)
  154. 0x09, 0x01, // Usage (Consumer Controls)
  155. 0xA1, 0x01, // Collection (Application)
  156. 0x75, 0x0A, // Report Size (10)
  157. 0x95, 0x04, // Report Count (4)
  158. 0x19, 0x00, // Usage Minimum (0)
  159. 0x2A, 0x9C, 0x02, // Usage Maximum (0x29C)
  160. 0x15, 0x00, // Logical Minimum (0)
  161. 0x26, 0x9C, 0x02, // Logical Maximum (0x29C)
  162. 0x81, 0x00, // Input (Data, Array)
  163. 0x05, 0x01, // Usage Page (Generic Desktop)
  164. 0x75, 0x08, // Report Size (8)
  165. 0x95, 0x03, // Report Count (3)
  166. 0x19, 0x00, // Usage Minimum (0)
  167. 0x29, 0xB7, // Usage Maximum (0xB7)
  168. 0x15, 0x00, // Logical Minimum (0)
  169. 0x26, 0xB7, 0x00, // Logical Maximum (0xB7)
  170. 0x81, 0x00, // Input (Data, Array)
  171. 0xC0 // End Collection
  172. };
  173. #endif
  174. #ifdef MOUSE_INTERFACE
  175. // Mouse Protocol 1, HID 1.11 spec, Appendix B, page 59-60, with wheel extension
  176. static uint8_t mouse_report_desc[] = {
  177. 0x05, 0x01, // Usage Page (Generic Desktop)
  178. 0x09, 0x02, // Usage (Mouse)
  179. 0xA1, 0x01, // Collection (Application)
  180. 0x85, 0x01, // REPORT_ID (1)
  181. 0x05, 0x09, // Usage Page (Button)
  182. 0x19, 0x01, // Usage Minimum (Button #1)
  183. 0x29, 0x08, // Usage Maximum (Button #8)
  184. 0x15, 0x00, // Logical Minimum (0)
  185. 0x25, 0x01, // Logical Maximum (1)
  186. 0x95, 0x08, // Report Count (8)
  187. 0x75, 0x01, // Report Size (1)
  188. 0x81, 0x02, // Input (Data, Variable, Absolute)
  189. 0x05, 0x01, // Usage Page (Generic Desktop)
  190. 0x09, 0x30, // Usage (X)
  191. 0x09, 0x31, // Usage (Y)
  192. 0x09, 0x38, // Usage (Wheel)
  193. 0x15, 0x81, // Logical Minimum (-127)
  194. 0x25, 0x7F, // Logical Maximum (127)
  195. 0x75, 0x08, // Report Size (8),
  196. 0x95, 0x03, // Report Count (3),
  197. 0x81, 0x06, // Input (Data, Variable, Relative)
  198. 0x05, 0x0C, // Usage Page (Consumer)
  199. 0x0A, 0x38, 0x02, // Usage (AC Pan)
  200. 0x15, 0x81, // Logical Minimum (-127)
  201. 0x25, 0x7F, // Logical Maximum (127)
  202. 0x75, 0x08, // Report Size (8),
  203. 0x95, 0x01, // Report Count (1),
  204. 0x81, 0x06, // Input (Data, Variable, Relative)
  205. 0xC0, // End Collection
  206. 0x05, 0x01, // Usage Page (Generic Desktop)
  207. 0x09, 0x02, // Usage (Mouse)
  208. 0xA1, 0x01, // Collection (Application)
  209. 0x85, 0x02, // REPORT_ID (2)
  210. 0x05, 0x01, // Usage Page (Generic Desktop)
  211. 0x09, 0x30, // Usage (X)
  212. 0x09, 0x31, // Usage (Y)
  213. 0x15, 0x00, // Logical Minimum (0)
  214. 0x26, 0xFF, 0x7F, // Logical Maximum (32767)
  215. 0x75, 0x10, // Report Size (16),
  216. 0x95, 0x02, // Report Count (2),
  217. 0x81, 0x02, // Input (Data, Variable, Absolute)
  218. 0xC0 // End Collection
  219. };
  220. #endif
  221. #ifdef JOYSTICK_INTERFACE
  222. #if JOYSTICK_SIZE == 12
  223. static uint8_t joystick_report_desc[] = {
  224. 0x05, 0x01, // Usage Page (Generic Desktop)
  225. 0x09, 0x04, // Usage (Joystick)
  226. 0xA1, 0x01, // Collection (Application)
  227. 0x15, 0x00, // Logical Minimum (0)
  228. 0x25, 0x01, // Logical Maximum (1)
  229. 0x75, 0x01, // Report Size (1)
  230. 0x95, 0x20, // Report Count (32)
  231. 0x05, 0x09, // Usage Page (Button)
  232. 0x19, 0x01, // Usage Minimum (Button #1)
  233. 0x29, 0x20, // Usage Maximum (Button #32)
  234. 0x81, 0x02, // Input (variable,absolute)
  235. 0x15, 0x00, // Logical Minimum (0)
  236. 0x25, 0x07, // Logical Maximum (7)
  237. 0x35, 0x00, // Physical Minimum (0)
  238. 0x46, 0x3B, 0x01, // Physical Maximum (315)
  239. 0x75, 0x04, // Report Size (4)
  240. 0x95, 0x01, // Report Count (1)
  241. 0x65, 0x14, // Unit (20)
  242. 0x05, 0x01, // Usage Page (Generic Desktop)
  243. 0x09, 0x39, // Usage (Hat switch)
  244. 0x81, 0x42, // Input (variable,absolute,null_state)
  245. 0x05, 0x01, // Usage Page (Generic Desktop)
  246. 0x09, 0x01, // Usage (Pointer)
  247. 0xA1, 0x00, // Collection ()
  248. 0x15, 0x00, // Logical Minimum (0)
  249. 0x26, 0xFF, 0x03, // Logical Maximum (1023)
  250. 0x75, 0x0A, // Report Size (10)
  251. 0x95, 0x04, // Report Count (4)
  252. 0x09, 0x30, // Usage (X)
  253. 0x09, 0x31, // Usage (Y)
  254. 0x09, 0x32, // Usage (Z)
  255. 0x09, 0x35, // Usage (Rz)
  256. 0x81, 0x02, // Input (variable,absolute)
  257. 0xC0, // End Collection
  258. 0x15, 0x00, // Logical Minimum (0)
  259. 0x26, 0xFF, 0x03, // Logical Maximum (1023)
  260. 0x75, 0x0A, // Report Size (10)
  261. 0x95, 0x02, // Report Count (2)
  262. 0x09, 0x36, // Usage (Slider)
  263. 0x09, 0x36, // Usage (Slider)
  264. 0x81, 0x02, // Input (variable,absolute)
  265. 0xC0 // End Collection
  266. };
  267. #elif JOYSTICK_SIZE == 64
  268. // extreme joystick (to use this, edit JOYSTICK_SIZE to 64 in usb_desc.h)
  269. // 128 buttons 16
  270. // 6 axes 12
  271. // 17 sliders 34
  272. // 4 pov 2
  273. static uint8_t joystick_report_desc[] = {
  274. 0x05, 0x01, // Usage Page (Generic Desktop)
  275. 0x09, 0x04, // Usage (Joystick)
  276. 0xA1, 0x01, // Collection (Application)
  277. 0x15, 0x00, // Logical Minimum (0)
  278. 0x25, 0x01, // Logical Maximum (1)
  279. 0x75, 0x01, // Report Size (1)
  280. 0x95, 0x80, // Report Count (128)
  281. 0x05, 0x09, // Usage Page (Button)
  282. 0x19, 0x01, // Usage Minimum (Button #1)
  283. 0x29, 0x80, // Usage Maximum (Button #128)
  284. 0x81, 0x02, // Input (variable,absolute)
  285. 0x05, 0x01, // Usage Page (Generic Desktop)
  286. 0x09, 0x01, // Usage (Pointer)
  287. 0xA1, 0x00, // Collection ()
  288. 0x15, 0x00, // Logical Minimum (0)
  289. 0x27, 0xFF, 0xFF, 0, 0, // Logical Maximum (65535)
  290. 0x75, 0x10, // Report Size (16)
  291. 0x95, 23, // Report Count (23)
  292. 0x09, 0x30, // Usage (X)
  293. 0x09, 0x31, // Usage (Y)
  294. 0x09, 0x32, // Usage (Z)
  295. 0x09, 0x33, // Usage (Rx)
  296. 0x09, 0x34, // Usage (Ry)
  297. 0x09, 0x35, // Usage (Rz)
  298. 0x09, 0x36, // Usage (Slider)
  299. 0x09, 0x36, // Usage (Slider)
  300. 0x09, 0x36, // Usage (Slider)
  301. 0x09, 0x36, // Usage (Slider)
  302. 0x09, 0x36, // Usage (Slider)
  303. 0x09, 0x36, // Usage (Slider)
  304. 0x09, 0x36, // Usage (Slider)
  305. 0x09, 0x36, // Usage (Slider)
  306. 0x09, 0x36, // Usage (Slider)
  307. 0x09, 0x36, // Usage (Slider)
  308. 0x09, 0x36, // Usage (Slider)
  309. 0x09, 0x36, // Usage (Slider)
  310. 0x09, 0x36, // Usage (Slider)
  311. 0x09, 0x36, // Usage (Slider)
  312. 0x09, 0x36, // Usage (Slider)
  313. 0x09, 0x36, // Usage (Slider)
  314. 0x09, 0x36, // Usage (Slider)
  315. 0x81, 0x02, // Input (variable,absolute)
  316. 0xC0, // End Collection
  317. 0x15, 0x00, // Logical Minimum (0)
  318. 0x25, 0x07, // Logical Maximum (7)
  319. 0x35, 0x00, // Physical Minimum (0)
  320. 0x46, 0x3B, 0x01, // Physical Maximum (315)
  321. 0x75, 0x04, // Report Size (4)
  322. 0x95, 0x04, // Report Count (4)
  323. 0x65, 0x14, // Unit (20)
  324. 0x05, 0x01, // Usage Page (Generic Desktop)
  325. 0x09, 0x39, // Usage (Hat switch)
  326. 0x09, 0x39, // Usage (Hat switch)
  327. 0x09, 0x39, // Usage (Hat switch)
  328. 0x09, 0x39, // Usage (Hat switch)
  329. 0x81, 0x42, // Input (variable,absolute,null_state)
  330. 0xC0 // End Collection
  331. };
  332. #endif // JOYSTICK_SIZE
  333. #endif // JOYSTICK_INTERFACE
  334. #ifdef MULTITOUCH_INTERFACE
  335. // https://forum.pjrc.com/threads/32331-USB-HID-Touchscreen-support-needed
  336. // https://msdn.microsoft.com/en-us/library/windows/hardware/jj151563%28v=vs.85%29.aspx
  337. // https://msdn.microsoft.com/en-us/library/windows/hardware/jj151565%28v=vs.85%29.aspx
  338. // https://msdn.microsoft.com/en-us/library/windows/hardware/ff553734%28v=vs.85%29.aspx
  339. // https://msdn.microsoft.com/en-us/library/windows/hardware/jj151564%28v=vs.85%29.aspx
  340. // download.microsoft.com/download/a/d/f/adf1347d-08dc-41a4-9084-623b1194d4b2/digitizerdrvs_touch.docx
  341. static uint8_t multitouch_report_desc[] = {
  342. 0x05, 0x0D, // Usage Page (Digitizer)
  343. 0x09, 0x04, // Usage (Touch Screen)
  344. 0xa1, 0x01, // Collection (Application)
  345. 0x09, 0x22, // Usage (Finger)
  346. 0xA1, 0x02, // Collection (Logical)
  347. 0x09, 0x42, // Usage (Tip Switch)
  348. 0x15, 0x00, // Logical Minimum (0)
  349. 0x25, 0x01, // Logical Maximum (1)
  350. 0x75, 0x01, // Report Size (1)
  351. 0x95, 0x01, // Report Count (1)
  352. 0x81, 0x02, // Input (variable,absolute)
  353. 0x09, 0x51, // Usage (Contact Identifier)
  354. 0x25, 0x7F, // Logical Maximum (127)
  355. 0x75, 0x07, // Report Size (7)
  356. 0x95, 0x01, // Report Count (1)
  357. 0x81, 0x02, // Input (variable,absolute)
  358. 0x09, 0x30, // Usage (Pressure)
  359. 0x26, 0xFF, 0x00, // Logical Maximum (255)
  360. 0x75, 0x08, // Report Size (8)
  361. 0x95, 0x01, // Report Count (1)
  362. 0x81, 0x02, // Input (variable,absolute)
  363. 0x05, 0x01, // Usage Page (Generic Desktop)
  364. 0x09, 0x30, // Usage (X)
  365. 0x09, 0x31, // Usage (Y)
  366. 0x26, 0xFF, 0x7F, // Logical Maximum (32767)
  367. 0x65, 0x00, // Unit (None) <-- probably needs real units?
  368. 0x75, 0x10, // Report Size (16)
  369. 0x95, 0x02, // Report Count (2)
  370. 0x81, 0x02, // Input (variable,absolute)
  371. 0xC0, // End Collection
  372. 0x05, 0x0D, // Usage Page (Digitizer)
  373. 0x27, 0xFF, 0xFF, 0, 0, // Logical Maximum (65535)
  374. 0x75, 0x10, // Report Size (16)
  375. 0x95, 0x01, // Report Count (1)
  376. 0x09, 0x56, // Usage (Scan Time)
  377. 0x81, 0x02, // Input (variable,absolute)
  378. 0x05, 0x0D, // Usage Page (Digitizers)
  379. 0x09, 0x55, // Usage (Contact Count Maximum)
  380. 0x25, MULTITOUCH_FINGERS, // Logical Maximum (10)
  381. 0x75, 0x08, // Report Size (8)
  382. 0x95, 0x01, // Report Count (1)
  383. 0xB1, 0x02, // Feature (variable,absolute)
  384. 0xC0 // End Collection
  385. };
  386. #endif
  387. #ifdef SEREMU_INTERFACE
  388. static uint8_t seremu_report_desc[] = {
  389. 0x06, 0xC9, 0xFF, // Usage Page 0xFFC9 (vendor defined)
  390. 0x09, 0x04, // Usage 0x04
  391. 0xA1, 0x5C, // Collection 0x5C
  392. 0x75, 0x08, // report size = 8 bits (global)
  393. 0x15, 0x00, // logical minimum = 0 (global)
  394. 0x26, 0xFF, 0x00, // logical maximum = 255 (global)
  395. 0x95, SEREMU_TX_SIZE, // report count (global)
  396. 0x09, 0x75, // usage (local)
  397. 0x81, 0x02, // Input
  398. 0x95, SEREMU_RX_SIZE, // report count (global)
  399. 0x09, 0x76, // usage (local)
  400. 0x91, 0x02, // Output
  401. 0x95, 0x04, // report count (global)
  402. 0x09, 0x76, // usage (local)
  403. 0xB1, 0x02, // Feature
  404. 0xC0 // end collection
  405. };
  406. #endif
  407. #ifdef RAWHID_INTERFACE
  408. static uint8_t rawhid_report_desc[] = {
  409. 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE),
  410. 0x0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE),
  411. 0xA1, 0x01, // Collection 0x01
  412. 0x75, 0x08, // report size = 8 bits
  413. 0x15, 0x00, // logical minimum = 0
  414. 0x26, 0xFF, 0x00, // logical maximum = 255
  415. 0x95, RAWHID_TX_SIZE, // report count
  416. 0x09, 0x01, // usage
  417. 0x81, 0x02, // Input (array)
  418. 0x95, RAWHID_RX_SIZE, // report count
  419. 0x09, 0x02, // usage
  420. 0x91, 0x02, // Output (array)
  421. 0xC0 // end collection
  422. };
  423. #endif
  424. #ifdef FLIGHTSIM_INTERFACE
  425. static uint8_t flightsim_report_desc[] = {
  426. 0x06, 0x1C, 0xFF, // Usage page = 0xFF1C
  427. 0x0A, 0x39, 0xA7, // Usage = 0xA739
  428. 0xA1, 0x01, // Collection 0x01
  429. 0x75, 0x08, // report size = 8 bits
  430. 0x15, 0x00, // logical minimum = 0
  431. 0x26, 0xFF, 0x00, // logical maximum = 255
  432. 0x95, FLIGHTSIM_TX_SIZE, // report count
  433. 0x09, 0x01, // usage
  434. 0x81, 0x02, // Input (array)
  435. 0x95, FLIGHTSIM_RX_SIZE, // report count
  436. 0x09, 0x02, // usage
  437. 0x91, 0x02, // Output (array)
  438. 0xC0 // end collection
  439. };
  440. #endif
  441. // **************************************************************
  442. // USB Descriptor Sizes
  443. // **************************************************************
  444. // pre-compute the size and position of everything in the config descriptor
  445. //
  446. #define CONFIG_HEADER_DESCRIPTOR_SIZE 9
  447. #define CDC_IAD_DESCRIPTOR_POS CONFIG_HEADER_DESCRIPTOR_SIZE
  448. #ifdef CDC_IAD_DESCRIPTOR
  449. #define CDC_IAD_DESCRIPTOR_SIZE 8
  450. #else
  451. #define CDC_IAD_DESCRIPTOR_SIZE 0
  452. #endif
  453. #define CDC_DATA_INTERFACE_DESC_POS CDC_IAD_DESCRIPTOR_POS+CDC_IAD_DESCRIPTOR_SIZE
  454. #ifdef CDC_DATA_INTERFACE
  455. #define CDC_DATA_INTERFACE_DESC_SIZE 9+5+5+4+5+7+9+7+7
  456. #else
  457. #define CDC_DATA_INTERFACE_DESC_SIZE 0
  458. #endif
  459. #define CDC2_DATA_INTERFACE_DESC_POS CDC_DATA_INTERFACE_DESC_POS+CDC_DATA_INTERFACE_DESC_SIZE
  460. #ifdef CDC2_DATA_INTERFACE
  461. #define CDC2_DATA_INTERFACE_DESC_SIZE 8 + 9+5+5+4+5+7+9+7+7
  462. #else
  463. #define CDC2_DATA_INTERFACE_DESC_SIZE 0
  464. #endif
  465. #define CDC3_DATA_INTERFACE_DESC_POS CDC2_DATA_INTERFACE_DESC_POS+CDC2_DATA_INTERFACE_DESC_SIZE
  466. #ifdef CDC3_DATA_INTERFACE
  467. #define CDC3_DATA_INTERFACE_DESC_SIZE 8 + 9+5+5+4+5+7+9+7+7
  468. #else
  469. #define CDC3_DATA_INTERFACE_DESC_SIZE 0
  470. #endif
  471. #define MIDI_INTERFACE_DESC_POS CDC3_DATA_INTERFACE_DESC_POS+CDC3_DATA_INTERFACE_DESC_SIZE
  472. #ifdef MIDI_INTERFACE
  473. #if !defined(MIDI_NUM_CABLES) || MIDI_NUM_CABLES < 1 || MIDI_NUM_CABLES > 16
  474. #error "MIDI_NUM_CABLES must be defined between 1 to 16"
  475. #endif
  476. #define MIDI_INTERFACE_DESC_SIZE 9+7+((6+6+9+9)*MIDI_NUM_CABLES)+(9+4+MIDI_NUM_CABLES)*2
  477. #else
  478. #define MIDI_INTERFACE_DESC_SIZE 0
  479. #endif
  480. #define KEYBOARD_INTERFACE_DESC_POS MIDI_INTERFACE_DESC_POS+MIDI_INTERFACE_DESC_SIZE
  481. #ifdef KEYBOARD_INTERFACE
  482. #define KEYBOARD_INTERFACE_DESC_SIZE 9+9+7
  483. #define KEYBOARD_HID_DESC_OFFSET KEYBOARD_INTERFACE_DESC_POS+9
  484. #else
  485. #define KEYBOARD_INTERFACE_DESC_SIZE 0
  486. #endif
  487. #define MOUSE_INTERFACE_DESC_POS KEYBOARD_INTERFACE_DESC_POS+KEYBOARD_INTERFACE_DESC_SIZE
  488. #ifdef MOUSE_INTERFACE
  489. #define MOUSE_INTERFACE_DESC_SIZE 9+9+7
  490. #define MOUSE_HID_DESC_OFFSET MOUSE_INTERFACE_DESC_POS+9
  491. #else
  492. #define MOUSE_INTERFACE_DESC_SIZE 0
  493. #endif
  494. #define RAWHID_INTERFACE_DESC_POS MOUSE_INTERFACE_DESC_POS+MOUSE_INTERFACE_DESC_SIZE
  495. #ifdef RAWHID_INTERFACE
  496. #define RAWHID_INTERFACE_DESC_SIZE 9+9+7+7
  497. #define RAWHID_HID_DESC_OFFSET RAWHID_INTERFACE_DESC_POS+9
  498. #else
  499. #define RAWHID_INTERFACE_DESC_SIZE 0
  500. #endif
  501. #define FLIGHTSIM_INTERFACE_DESC_POS RAWHID_INTERFACE_DESC_POS+RAWHID_INTERFACE_DESC_SIZE
  502. #ifdef FLIGHTSIM_INTERFACE
  503. #define FLIGHTSIM_INTERFACE_DESC_SIZE 9+9+7+7
  504. #define FLIGHTSIM_HID_DESC_OFFSET FLIGHTSIM_INTERFACE_DESC_POS+9
  505. #else
  506. #define FLIGHTSIM_INTERFACE_DESC_SIZE 0
  507. #endif
  508. #define SEREMU_INTERFACE_DESC_POS FLIGHTSIM_INTERFACE_DESC_POS+FLIGHTSIM_INTERFACE_DESC_SIZE
  509. #ifdef SEREMU_INTERFACE
  510. #define SEREMU_INTERFACE_DESC_SIZE 9+9+7+7
  511. #define SEREMU_HID_DESC_OFFSET SEREMU_INTERFACE_DESC_POS+9
  512. #else
  513. #define SEREMU_INTERFACE_DESC_SIZE 0
  514. #endif
  515. #define JOYSTICK_INTERFACE_DESC_POS SEREMU_INTERFACE_DESC_POS+SEREMU_INTERFACE_DESC_SIZE
  516. #ifdef JOYSTICK_INTERFACE
  517. #define JOYSTICK_INTERFACE_DESC_SIZE 9+9+7
  518. #define JOYSTICK_HID_DESC_OFFSET JOYSTICK_INTERFACE_DESC_POS+9
  519. #else
  520. #define JOYSTICK_INTERFACE_DESC_SIZE 0
  521. #endif
  522. #define MTP_INTERFACE_DESC_POS JOYSTICK_INTERFACE_DESC_POS+JOYSTICK_INTERFACE_DESC_SIZE
  523. #ifdef MTP_INTERFACE
  524. #define MTP_INTERFACE_DESC_SIZE 9+7+7+7
  525. #else
  526. #define MTP_INTERFACE_DESC_SIZE 0
  527. #endif
  528. #define KEYMEDIA_INTERFACE_DESC_POS MTP_INTERFACE_DESC_POS+MTP_INTERFACE_DESC_SIZE
  529. #ifdef KEYMEDIA_INTERFACE
  530. #define KEYMEDIA_INTERFACE_DESC_SIZE 9+9+7
  531. #define KEYMEDIA_HID_DESC_OFFSET KEYMEDIA_INTERFACE_DESC_POS+9
  532. #else
  533. #define KEYMEDIA_INTERFACE_DESC_SIZE 0
  534. #endif
  535. #define AUDIO_INTERFACE_DESC_POS KEYMEDIA_INTERFACE_DESC_POS+KEYMEDIA_INTERFACE_DESC_SIZE
  536. #ifdef AUDIO_INTERFACE
  537. #define AUDIO_INTERFACE_DESC_SIZE 8 + 9+10+12+9+12+10+9 + 9+9+7+11+9+7 + 9+9+7+11+9+7+9
  538. #else
  539. #define AUDIO_INTERFACE_DESC_SIZE 0
  540. #endif
  541. #define MULTITOUCH_INTERFACE_DESC_POS AUDIO_INTERFACE_DESC_POS+AUDIO_INTERFACE_DESC_SIZE
  542. #ifdef MULTITOUCH_INTERFACE
  543. #define MULTITOUCH_INTERFACE_DESC_SIZE 9+9+7
  544. #define MULTITOUCH_HID_DESC_OFFSET MULTITOUCH_INTERFACE_DESC_POS+9
  545. #else
  546. #define MULTITOUCH_INTERFACE_DESC_SIZE 0
  547. #endif
  548. #define CONFIG_DESC_SIZE MULTITOUCH_INTERFACE_DESC_POS+MULTITOUCH_INTERFACE_DESC_SIZE
  549. // **************************************************************
  550. // USB Configuration
  551. // **************************************************************
  552. #define EMIT_CDC_IAD_DESCRIPTOR(prefix) \
  553. /* interface association descriptor, USB ECN, Table 9-Z */ \
  554. 8, /* bLength */ \
  555. 11, /* bDescriptorType */ \
  556. prefix ## _STATUS_INTERFACE, /* bFirstInterface */ \
  557. 2, /* bInterfaceCount */ \
  558. 0x02, /* bFunctionClass */ \
  559. 0x02, /* bFunctionSubClass */ \
  560. 0x01, /* bFunctionProtocol */ \
  561. 0 /* iFunction */
  562. #define EMIT_CDC_DESCRIPTORS(prefix) \
  563. /* interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12 */ \
  564. 9, /* bLength */ \
  565. 4, /* bDescriptorType */ \
  566. prefix ## _STATUS_INTERFACE, /* bInterfaceNumber */ \
  567. 0, /* bAlternateSetting */ \
  568. 1, /* bNumEndpoints */ \
  569. 0x02, /* bInterfaceClass */ \
  570. 0x02, /* bInterfaceSubClass */ \
  571. 0x01, /* bInterfaceProtocol */ \
  572. 0, /* iInterface */ \
  573. /* CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26 */ \
  574. 5, /* bFunctionLength */ \
  575. 0x24, /* bDescriptorType */ \
  576. 0x00, /* bDescriptorSubtype */ \
  577. 0x10, 0x01, /* bcdCDC */ \
  578. /* Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27 */\
  579. 5, /* bFunctionLength */ \
  580. 0x24, /* bDescriptorType */ \
  581. 0x01, /* bDescriptorSubtype */ \
  582. 0x01, /* bmCapabilities */ \
  583. 1, /* bDataInterface */ \
  584. /* Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28 */\
  585. 4, /* bFunctionLength */ \
  586. 0x24, /* bDescriptorType */ \
  587. 0x02, /* bDescriptorSubtype */ \
  588. 0x06, /* bmCapabilities */ \
  589. /* Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33 */ \
  590. 5, /* bFunctionLength */ \
  591. 0x24, /* bDescriptorType */ \
  592. 0x06, /* bDescriptorSubtype */ \
  593. prefix ## _STATUS_INTERFACE, /* bMasterInterface */ \
  594. prefix ## _DATA_INTERFACE, /* bSlaveInterface0 */ \
  595. /* endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 */ \
  596. 7, /* bLength */ \
  597. 5, /* bDescriptorType */ \
  598. prefix ## _ACM_ENDPOINT | 0x80, /* bEndpointAddress */ \
  599. 0x03, /* bmAttributes (0x03=intr) */ \
  600. prefix ## _ACM_SIZE, 0, /* wMaxPacketSize */ \
  601. 64, /* bInterval */ \
  602. /* interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12 */ \
  603. 9, /* bLength */ \
  604. 4, /* bDescriptorType */ \
  605. prefix ## _DATA_INTERFACE, /* bInterfaceNumber */ \
  606. 0, /* bAlternateSetting */ \
  607. 2, /* bNumEndpoints */ \
  608. 0x0A, /* bInterfaceClass */ \
  609. 0x00, /* bInterfaceSubClass */ \
  610. 0x00, /* bInterfaceProtocol */ \
  611. 0, /* iInterface */ \
  612. /* endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 */ \
  613. 7, /* bLength */ \
  614. 5, /* bDescriptorType */ \
  615. prefix ## _RX_ENDPOINT, /* bEndpointAddress */ \
  616. 0x02, /* bmAttributes (0x02=bulk) */ \
  617. prefix ## _RX_SIZE, 0, /* wMaxPacketSize */ \
  618. 0, /* bInterval */ \
  619. /* endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 */ \
  620. 7, /* bLength */ \
  621. 5, /* bDescriptorType */ \
  622. prefix ## _TX_ENDPOINT | 0x80, /* bEndpointAddress */ \
  623. 0x02, /* bmAttributes (0x02=bulk) */ \
  624. prefix ## _TX_SIZE, 0, /* wMaxPacketSize */ \
  625. 0 /* bInterval */ \
  626. // USB Configuration Descriptor. This huge descriptor tells all
  627. // of the devices capbilities.
  628. static uint8_t config_descriptor[CONFIG_DESC_SIZE] = {
  629. // configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10
  630. 9, // bLength;
  631. 2, // bDescriptorType;
  632. LSB(CONFIG_DESC_SIZE), // wTotalLength
  633. MSB(CONFIG_DESC_SIZE),
  634. NUM_INTERFACE, // bNumInterfaces
  635. 1, // bConfigurationValue
  636. 0, // iConfiguration
  637. 0xC0, // bmAttributes
  638. 50, // bMaxPower
  639. #ifdef CDC_IAD_DESCRIPTOR
  640. EMIT_CDC_IAD_DESCRIPTOR(CDC),
  641. #endif
  642. #ifdef CDC_DATA_INTERFACE
  643. EMIT_CDC_DESCRIPTORS(CDC),
  644. #endif // CDC_DATA_INTERFACE
  645. #ifdef CDC2_DATA_INTERFACE
  646. EMIT_CDC_IAD_DESCRIPTOR(CDC2),
  647. EMIT_CDC_DESCRIPTORS(CDC2),
  648. #endif // CDC2_DATA_INTERFACE
  649. #ifdef CDC3_DATA_INTERFACE
  650. EMIT_CDC_IAD_DESCRIPTOR(CDC3),
  651. EMIT_CDC_DESCRIPTORS(CDC3),
  652. #endif // CDC3_DATA_INTERFACE
  653. #ifdef MIDI_INTERFACE
  654. // Standard MS Interface Descriptor,
  655. 9, // bLength
  656. 4, // bDescriptorType
  657. MIDI_INTERFACE, // bInterfaceNumber
  658. 0, // bAlternateSetting
  659. 2, // bNumEndpoints
  660. 0x01, // bInterfaceClass (0x01 = Audio)
  661. 0x03, // bInterfaceSubClass (0x03 = MIDI)
  662. 0x00, // bInterfaceProtocol (unused for MIDI)
  663. 0, // iInterface
  664. // MIDI MS Interface Header, USB MIDI 6.1.2.1, page 21, Table 6-2
  665. 7, // bLength
  666. 0x24, // bDescriptorType = CS_INTERFACE
  667. 0x01, // bDescriptorSubtype = MS_HEADER
  668. 0x00, 0x01, // bcdMSC = revision 01.00
  669. LSB(7+(6+6+9+9)*MIDI_NUM_CABLES), // wTotalLength
  670. MSB(7+(6+6+9+9)*MIDI_NUM_CABLES),
  671. // MIDI IN Jack Descriptor, B.4.3, Table B-7 (embedded), page 40
  672. 6, // bLength
  673. 0x24, // bDescriptorType = CS_INTERFACE
  674. 0x02, // bDescriptorSubtype = MIDI_IN_JACK
  675. 0x01, // bJackType = EMBEDDED
  676. 1, // bJackID, ID = 1
  677. 0, // iJack
  678. // MIDI IN Jack Descriptor, B.4.3, Table B-8 (external), page 40
  679. 6, // bLength
  680. 0x24, // bDescriptorType = CS_INTERFACE
  681. 0x02, // bDescriptorSubtype = MIDI_IN_JACK
  682. 0x02, // bJackType = EXTERNAL
  683. 2, // bJackID, ID = 2
  684. 0, // iJack
  685. // MIDI OUT Jack Descriptor, B.4.4, Table B-9, page 41
  686. 9,
  687. 0x24, // bDescriptorType = CS_INTERFACE
  688. 0x03, // bDescriptorSubtype = MIDI_OUT_JACK
  689. 0x01, // bJackType = EMBEDDED
  690. 3, // bJackID, ID = 3
  691. 1, // bNrInputPins = 1 pin
  692. 2, // BaSourceID(1) = 2
  693. 1, // BaSourcePin(1) = first pin
  694. 0, // iJack
  695. // MIDI OUT Jack Descriptor, B.4.4, Table B-10, page 41
  696. 9,
  697. 0x24, // bDescriptorType = CS_INTERFACE
  698. 0x03, // bDescriptorSubtype = MIDI_OUT_JACK
  699. 0x02, // bJackType = EXTERNAL
  700. 4, // bJackID, ID = 4
  701. 1, // bNrInputPins = 1 pin
  702. 1, // BaSourceID(1) = 1
  703. 1, // BaSourcePin(1) = first pin
  704. 0, // iJack
  705. #if MIDI_NUM_CABLES >= 2
  706. #define MIDI_INTERFACE_JACK_PAIR(a, b, c, d) \
  707. 6, 0x24, 0x02, 0x01, (a), 0, \
  708. 6, 0x24, 0x02, 0x02, (b), 0, \
  709. 9, 0x24, 0x03, 0x01, (c), 1, (b), 1, 0, \
  710. 9, 0x24, 0x03, 0x02, (d), 1, (a), 1, 0,
  711. MIDI_INTERFACE_JACK_PAIR(5, 6, 7, 8)
  712. #endif
  713. #if MIDI_NUM_CABLES >= 3
  714. MIDI_INTERFACE_JACK_PAIR(9, 10, 11, 12)
  715. #endif
  716. #if MIDI_NUM_CABLES >= 4
  717. MIDI_INTERFACE_JACK_PAIR(13, 14, 15, 16)
  718. #endif
  719. #if MIDI_NUM_CABLES >= 5
  720. MIDI_INTERFACE_JACK_PAIR(17, 18, 19, 20)
  721. #endif
  722. #if MIDI_NUM_CABLES >= 6
  723. MIDI_INTERFACE_JACK_PAIR(21, 22, 23, 24)
  724. #endif
  725. #if MIDI_NUM_CABLES >= 7
  726. MIDI_INTERFACE_JACK_PAIR(25, 26, 27, 28)
  727. #endif
  728. #if MIDI_NUM_CABLES >= 8
  729. MIDI_INTERFACE_JACK_PAIR(29, 30, 31, 32)
  730. #endif
  731. #if MIDI_NUM_CABLES >= 9
  732. MIDI_INTERFACE_JACK_PAIR(33, 34, 35, 36)
  733. #endif
  734. #if MIDI_NUM_CABLES >= 10
  735. MIDI_INTERFACE_JACK_PAIR(37, 38, 39, 40)
  736. #endif
  737. #if MIDI_NUM_CABLES >= 11
  738. MIDI_INTERFACE_JACK_PAIR(41, 42, 43, 44)
  739. #endif
  740. #if MIDI_NUM_CABLES >= 12
  741. MIDI_INTERFACE_JACK_PAIR(45, 46, 47, 48)
  742. #endif
  743. #if MIDI_NUM_CABLES >= 13
  744. MIDI_INTERFACE_JACK_PAIR(49, 50, 51, 52)
  745. #endif
  746. #if MIDI_NUM_CABLES >= 14
  747. MIDI_INTERFACE_JACK_PAIR(53, 54, 55, 56)
  748. #endif
  749. #if MIDI_NUM_CABLES >= 15
  750. MIDI_INTERFACE_JACK_PAIR(57, 58, 59, 60)
  751. #endif
  752. #if MIDI_NUM_CABLES >= 16
  753. MIDI_INTERFACE_JACK_PAIR(61, 62, 63, 64)
  754. #endif
  755. // Standard Bulk OUT Endpoint Descriptor, B.5.1, Table B-11, pae 42
  756. 9, // bLength
  757. 5, // bDescriptorType = ENDPOINT
  758. MIDI_RX_ENDPOINT, // bEndpointAddress
  759. 0x02, // bmAttributes (0x02=bulk)
  760. MIDI_RX_SIZE, 0, // wMaxPacketSize
  761. 0, // bInterval
  762. 0, // bRefresh
  763. 0, // bSynchAddress
  764. // Class-specific MS Bulk OUT Endpoint Descriptor, B.5.2, Table B-12, page 42
  765. 4+MIDI_NUM_CABLES, // bLength
  766. 0x25, // bDescriptorSubtype = CS_ENDPOINT
  767. 0x01, // bJackType = MS_GENERAL
  768. MIDI_NUM_CABLES, // bNumEmbMIDIJack = number of jacks
  769. 1, // BaAssocJackID(1) = jack ID #1
  770. #if MIDI_NUM_CABLES >= 2
  771. 5,
  772. #endif
  773. #if MIDI_NUM_CABLES >= 3
  774. 9,
  775. #endif
  776. #if MIDI_NUM_CABLES >= 4
  777. 13,
  778. #endif
  779. #if MIDI_NUM_CABLES >= 5
  780. 17,
  781. #endif
  782. #if MIDI_NUM_CABLES >= 6
  783. 21,
  784. #endif
  785. #if MIDI_NUM_CABLES >= 7
  786. 25,
  787. #endif
  788. #if MIDI_NUM_CABLES >= 8
  789. 29,
  790. #endif
  791. #if MIDI_NUM_CABLES >= 9
  792. 33,
  793. #endif
  794. #if MIDI_NUM_CABLES >= 10
  795. 37,
  796. #endif
  797. #if MIDI_NUM_CABLES >= 11
  798. 41,
  799. #endif
  800. #if MIDI_NUM_CABLES >= 12
  801. 45,
  802. #endif
  803. #if MIDI_NUM_CABLES >= 13
  804. 49,
  805. #endif
  806. #if MIDI_NUM_CABLES >= 14
  807. 53,
  808. #endif
  809. #if MIDI_NUM_CABLES >= 15
  810. 57,
  811. #endif
  812. #if MIDI_NUM_CABLES >= 16
  813. 61,
  814. #endif
  815. // Standard Bulk IN Endpoint Descriptor, B.5.1, Table B-11, pae 42
  816. 9, // bLength
  817. 5, // bDescriptorType = ENDPOINT
  818. MIDI_TX_ENDPOINT | 0x80, // bEndpointAddress
  819. 0x02, // bmAttributes (0x02=bulk)
  820. MIDI_TX_SIZE, 0, // wMaxPacketSize
  821. 0, // bInterval
  822. 0, // bRefresh
  823. 0, // bSynchAddress
  824. // Class-specific MS Bulk IN Endpoint Descriptor, B.5.2, Table B-12, page 42
  825. 4+MIDI_NUM_CABLES, // bLength
  826. 0x25, // bDescriptorSubtype = CS_ENDPOINT
  827. 0x01, // bJackType = MS_GENERAL
  828. MIDI_NUM_CABLES, // bNumEmbMIDIJack = number of jacks
  829. 3, // BaAssocJackID(1) = jack ID #3
  830. #if MIDI_NUM_CABLES >= 2
  831. 7,
  832. #endif
  833. #if MIDI_NUM_CABLES >= 3
  834. 11,
  835. #endif
  836. #if MIDI_NUM_CABLES >= 4
  837. 15,
  838. #endif
  839. #if MIDI_NUM_CABLES >= 5
  840. 19,
  841. #endif
  842. #if MIDI_NUM_CABLES >= 6
  843. 23,
  844. #endif
  845. #if MIDI_NUM_CABLES >= 7
  846. 27,
  847. #endif
  848. #if MIDI_NUM_CABLES >= 8
  849. 31,
  850. #endif
  851. #if MIDI_NUM_CABLES >= 9
  852. 35,
  853. #endif
  854. #if MIDI_NUM_CABLES >= 10
  855. 39,
  856. #endif
  857. #if MIDI_NUM_CABLES >= 11
  858. 43,
  859. #endif
  860. #if MIDI_NUM_CABLES >= 12
  861. 47,
  862. #endif
  863. #if MIDI_NUM_CABLES >= 13
  864. 51,
  865. #endif
  866. #if MIDI_NUM_CABLES >= 14
  867. 55,
  868. #endif
  869. #if MIDI_NUM_CABLES >= 15
  870. 59,
  871. #endif
  872. #if MIDI_NUM_CABLES >= 16
  873. 63,
  874. #endif
  875. #endif // MIDI_INTERFACE
  876. #ifdef KEYBOARD_INTERFACE
  877. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  878. 9, // bLength
  879. 4, // bDescriptorType
  880. KEYBOARD_INTERFACE, // bInterfaceNumber
  881. 0, // bAlternateSetting
  882. 1, // bNumEndpoints
  883. 0x03, // bInterfaceClass (0x03 = HID)
  884. 0x01, // bInterfaceSubClass (0x01 = Boot)
  885. 0x01, // bInterfaceProtocol (0x01 = Keyboard)
  886. 0, // iInterface
  887. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  888. 9, // bLength
  889. 0x21, // bDescriptorType
  890. 0x11, 0x01, // bcdHID
  891. 0, // bCountryCode
  892. 1, // bNumDescriptors
  893. 0x22, // bDescriptorType
  894. LSB(sizeof(keyboard_report_desc)), // wDescriptorLength
  895. MSB(sizeof(keyboard_report_desc)),
  896. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  897. 7, // bLength
  898. 5, // bDescriptorType
  899. KEYBOARD_ENDPOINT | 0x80, // bEndpointAddress
  900. 0x03, // bmAttributes (0x03=intr)
  901. KEYBOARD_SIZE, 0, // wMaxPacketSize
  902. KEYBOARD_INTERVAL, // bInterval
  903. #endif // KEYBOARD_INTERFACE
  904. #ifdef MOUSE_INTERFACE
  905. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  906. 9, // bLength
  907. 4, // bDescriptorType
  908. MOUSE_INTERFACE, // bInterfaceNumber
  909. 0, // bAlternateSetting
  910. 1, // bNumEndpoints
  911. 0x03, // bInterfaceClass (0x03 = HID)
  912. 0x00, // bInterfaceSubClass (0x01 = Boot)
  913. 0x00, // bInterfaceProtocol (0x02 = Mouse)
  914. 0, // iInterface
  915. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  916. 9, // bLength
  917. 0x21, // bDescriptorType
  918. 0x11, 0x01, // bcdHID
  919. 0, // bCountryCode
  920. 1, // bNumDescriptors
  921. 0x22, // bDescriptorType
  922. LSB(sizeof(mouse_report_desc)), // wDescriptorLength
  923. MSB(sizeof(mouse_report_desc)),
  924. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  925. 7, // bLength
  926. 5, // bDescriptorType
  927. MOUSE_ENDPOINT | 0x80, // bEndpointAddress
  928. 0x03, // bmAttributes (0x03=intr)
  929. MOUSE_SIZE, 0, // wMaxPacketSize
  930. MOUSE_INTERVAL, // bInterval
  931. #endif // MOUSE_INTERFACE
  932. #ifdef RAWHID_INTERFACE
  933. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  934. 9, // bLength
  935. 4, // bDescriptorType
  936. RAWHID_INTERFACE, // bInterfaceNumber
  937. 0, // bAlternateSetting
  938. 2, // bNumEndpoints
  939. 0x03, // bInterfaceClass (0x03 = HID)
  940. 0x00, // bInterfaceSubClass
  941. 0x00, // bInterfaceProtocol
  942. 0, // iInterface
  943. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  944. 9, // bLength
  945. 0x21, // bDescriptorType
  946. 0x11, 0x01, // bcdHID
  947. 0, // bCountryCode
  948. 1, // bNumDescriptors
  949. 0x22, // bDescriptorType
  950. LSB(sizeof(rawhid_report_desc)), // wDescriptorLength
  951. MSB(sizeof(rawhid_report_desc)),
  952. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  953. 7, // bLength
  954. 5, // bDescriptorType
  955. RAWHID_TX_ENDPOINT | 0x80, // bEndpointAddress
  956. 0x03, // bmAttributes (0x03=intr)
  957. RAWHID_TX_SIZE, 0, // wMaxPacketSize
  958. RAWHID_TX_INTERVAL, // bInterval
  959. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  960. 7, // bLength
  961. 5, // bDescriptorType
  962. RAWHID_RX_ENDPOINT, // bEndpointAddress
  963. 0x03, // bmAttributes (0x03=intr)
  964. RAWHID_RX_SIZE, 0, // wMaxPacketSize
  965. RAWHID_RX_INTERVAL, // bInterval
  966. #endif // RAWHID_INTERFACE
  967. #ifdef FLIGHTSIM_INTERFACE
  968. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  969. 9, // bLength
  970. 4, // bDescriptorType
  971. FLIGHTSIM_INTERFACE, // bInterfaceNumber
  972. 0, // bAlternateSetting
  973. 2, // bNumEndpoints
  974. 0x03, // bInterfaceClass (0x03 = HID)
  975. 0x00, // bInterfaceSubClass
  976. 0x00, // bInterfaceProtocol
  977. 0, // iInterface
  978. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  979. 9, // bLength
  980. 0x21, // bDescriptorType
  981. 0x11, 0x01, // bcdHID
  982. 0, // bCountryCode
  983. 1, // bNumDescriptors
  984. 0x22, // bDescriptorType
  985. LSB(sizeof(flightsim_report_desc)), // wDescriptorLength
  986. MSB(sizeof(flightsim_report_desc)),
  987. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  988. 7, // bLength
  989. 5, // bDescriptorType
  990. FLIGHTSIM_TX_ENDPOINT | 0x80, // bEndpointAddress
  991. 0x03, // bmAttributes (0x03=intr)
  992. FLIGHTSIM_TX_SIZE, 0, // wMaxPacketSize
  993. FLIGHTSIM_TX_INTERVAL, // bInterval
  994. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  995. 7, // bLength
  996. 5, // bDescriptorType
  997. FLIGHTSIM_RX_ENDPOINT, // bEndpointAddress
  998. 0x03, // bmAttributes (0x03=intr)
  999. FLIGHTSIM_RX_SIZE, 0, // wMaxPacketSize
  1000. FLIGHTSIM_RX_INTERVAL, // bInterval
  1001. #endif // FLIGHTSIM_INTERFACE
  1002. #ifdef SEREMU_INTERFACE
  1003. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  1004. 9, // bLength
  1005. 4, // bDescriptorType
  1006. SEREMU_INTERFACE, // bInterfaceNumber
  1007. 0, // bAlternateSetting
  1008. 2, // bNumEndpoints
  1009. 0x03, // bInterfaceClass (0x03 = HID)
  1010. 0x00, // bInterfaceSubClass
  1011. 0x00, // bInterfaceProtocol
  1012. 0, // iInterface
  1013. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  1014. 9, // bLength
  1015. 0x21, // bDescriptorType
  1016. 0x11, 0x01, // bcdHID
  1017. 0, // bCountryCode
  1018. 1, // bNumDescriptors
  1019. 0x22, // bDescriptorType
  1020. LSB(sizeof(seremu_report_desc)), // wDescriptorLength
  1021. MSB(sizeof(seremu_report_desc)),
  1022. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1023. 7, // bLength
  1024. 5, // bDescriptorType
  1025. SEREMU_TX_ENDPOINT | 0x80, // bEndpointAddress
  1026. 0x03, // bmAttributes (0x03=intr)
  1027. SEREMU_TX_SIZE, 0, // wMaxPacketSize
  1028. SEREMU_TX_INTERVAL, // bInterval
  1029. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1030. 7, // bLength
  1031. 5, // bDescriptorType
  1032. SEREMU_RX_ENDPOINT, // bEndpointAddress
  1033. 0x03, // bmAttributes (0x03=intr)
  1034. SEREMU_RX_SIZE, 0, // wMaxPacketSize
  1035. SEREMU_RX_INTERVAL, // bInterval
  1036. #endif // SEREMU_INTERFACE
  1037. #ifdef JOYSTICK_INTERFACE
  1038. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  1039. 9, // bLength
  1040. 4, // bDescriptorType
  1041. JOYSTICK_INTERFACE, // bInterfaceNumber
  1042. 0, // bAlternateSetting
  1043. 1, // bNumEndpoints
  1044. 0x03, // bInterfaceClass (0x03 = HID)
  1045. 0x00, // bInterfaceSubClass
  1046. 0x00, // bInterfaceProtocol
  1047. 0, // iInterface
  1048. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  1049. 9, // bLength
  1050. 0x21, // bDescriptorType
  1051. 0x11, 0x01, // bcdHID
  1052. 0, // bCountryCode
  1053. 1, // bNumDescriptors
  1054. 0x22, // bDescriptorType
  1055. LSB(sizeof(joystick_report_desc)), // wDescriptorLength
  1056. MSB(sizeof(joystick_report_desc)),
  1057. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1058. 7, // bLength
  1059. 5, // bDescriptorType
  1060. JOYSTICK_ENDPOINT | 0x80, // bEndpointAddress
  1061. 0x03, // bmAttributes (0x03=intr)
  1062. JOYSTICK_SIZE, 0, // wMaxPacketSize
  1063. JOYSTICK_INTERVAL, // bInterval
  1064. #endif // JOYSTICK_INTERFACE
  1065. #ifdef MTP_INTERFACE
  1066. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  1067. 9, // bLength
  1068. 4, // bDescriptorType
  1069. MTP_INTERFACE, // bInterfaceNumber
  1070. 0, // bAlternateSetting
  1071. 3, // bNumEndpoints
  1072. 0x06, // bInterfaceClass (0x06 = still image)
  1073. 0x01, // bInterfaceSubClass
  1074. 0x01, // bInterfaceProtocol
  1075. 0, // iInterface
  1076. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1077. 7, // bLength
  1078. 5, // bDescriptorType
  1079. MTP_TX_ENDPOINT | 0x80, // bEndpointAddress
  1080. 0x02, // bmAttributes (0x02=bulk)
  1081. MTP_TX_SIZE, 0, // wMaxPacketSize
  1082. 0, // bInterval
  1083. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1084. 7, // bLength
  1085. 5, // bDescriptorType
  1086. MTP_RX_ENDPOINT, // bEndpointAddress
  1087. 0x02, // bmAttributes (0x02=bulk)
  1088. MTP_RX_SIZE, 0, // wMaxPacketSize
  1089. 0, // bInterval
  1090. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1091. 7, // bLength
  1092. 5, // bDescriptorType
  1093. MTP_EVENT_ENDPOINT | 0x80, // bEndpointAddress
  1094. 0x03, // bmAttributes (0x03=intr)
  1095. MTP_EVENT_SIZE, 0, // wMaxPacketSize
  1096. MTP_EVENT_INTERVAL, // bInterval
  1097. #endif // MTP_INTERFACE
  1098. #ifdef KEYMEDIA_INTERFACE
  1099. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  1100. 9, // bLength
  1101. 4, // bDescriptorType
  1102. KEYMEDIA_INTERFACE, // bInterfaceNumber
  1103. 0, // bAlternateSetting
  1104. 1, // bNumEndpoints
  1105. 0x03, // bInterfaceClass (0x03 = HID)
  1106. 0x00, // bInterfaceSubClass
  1107. 0x00, // bInterfaceProtocol
  1108. 0, // iInterface
  1109. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  1110. 9, // bLength
  1111. 0x21, // bDescriptorType
  1112. 0x11, 0x01, // bcdHID
  1113. 0, // bCountryCode
  1114. 1, // bNumDescriptors
  1115. 0x22, // bDescriptorType
  1116. LSB(sizeof(keymedia_report_desc)), // wDescriptorLength
  1117. MSB(sizeof(keymedia_report_desc)),
  1118. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1119. 7, // bLength
  1120. 5, // bDescriptorType
  1121. KEYMEDIA_ENDPOINT | 0x80, // bEndpointAddress
  1122. 0x03, // bmAttributes (0x03=intr)
  1123. KEYMEDIA_SIZE, 0, // wMaxPacketSize
  1124. KEYMEDIA_INTERVAL, // bInterval
  1125. #endif // KEYMEDIA_INTERFACE
  1126. #ifdef AUDIO_INTERFACE
  1127. // interface association descriptor, USB ECN, Table 9-Z
  1128. 8, // bLength
  1129. 11, // bDescriptorType
  1130. AUDIO_INTERFACE, // bFirstInterface
  1131. 3, // bInterfaceCount
  1132. 0x01, // bFunctionClass
  1133. 0x01, // bFunctionSubClass
  1134. 0x00, // bFunctionProtocol
  1135. 0, // iFunction
  1136. // Standard AudioControl (AC) Interface Descriptor
  1137. // USB DCD for Audio Devices 1.0, Table 4-1, page 36
  1138. 9, // bLength
  1139. 4, // bDescriptorType, 4 = INTERFACE
  1140. AUDIO_INTERFACE, // bInterfaceNumber
  1141. 0, // bAlternateSetting
  1142. 0, // bNumEndpoints
  1143. 1, // bInterfaceClass, 1 = AUDIO
  1144. 1, // bInterfaceSubclass, 1 = AUDIO_CONTROL
  1145. 0, // bInterfaceProtocol
  1146. 0, // iInterface
  1147. // Class-specific AC Interface Header Descriptor
  1148. // USB DCD for Audio Devices 1.0, Table 4-2, page 37-38
  1149. 10, // bLength
  1150. 0x24, // bDescriptorType, 0x24 = CS_INTERFACE
  1151. 0x01, // bDescriptorSubtype, 1 = HEADER
  1152. 0x00, 0x01, // bcdADC (version 1.0)
  1153. LSB(62), MSB(62), // wTotalLength
  1154. 2, // bInCollection
  1155. AUDIO_INTERFACE+1, // baInterfaceNr(1) - Transmit to PC
  1156. AUDIO_INTERFACE+2, // baInterfaceNr(2) - Receive from PC
  1157. // Input Terminal Descriptor
  1158. // USB DCD for Audio Devices 1.0, Table 4-3, page 39
  1159. 12, // bLength
  1160. 0x24, // bDescriptorType, 0x24 = CS_INTERFACE
  1161. 0x02, // bDescriptorSubType, 2 = INPUT_TERMINAL
  1162. 1, // bTerminalID
  1163. //0x01, 0x02, // wTerminalType, 0x0201 = MICROPHONE
  1164. //0x03, 0x06, // wTerminalType, 0x0603 = Line Connector
  1165. 0x02, 0x06, // wTerminalType, 0x0602 = Digital Audio
  1166. 0, // bAssocTerminal, 0 = unidirectional
  1167. 2, // bNrChannels
  1168. 0x03, 0x00, // wChannelConfig, 0x0003 = Left & Right Front
  1169. 0, // iChannelNames
  1170. 0, // iTerminal
  1171. // Output Terminal Descriptor
  1172. // USB DCD for Audio Devices 1.0, Table 4-4, page 40
  1173. 9, // bLength
  1174. 0x24, // bDescriptorType, 0x24 = CS_INTERFACE
  1175. 3, // bDescriptorSubtype, 3 = OUTPUT_TERMINAL
  1176. 2, // bTerminalID
  1177. 0x01, 0x01, // wTerminalType, 0x0101 = USB_STREAMING
  1178. 0, // bAssocTerminal, 0 = unidirectional
  1179. 1, // bCSourceID, connected to input terminal, ID=1
  1180. 0, // iTerminal
  1181. // Input Terminal Descriptor
  1182. // USB DCD for Audio Devices 1.0, Table 4-3, page 39
  1183. 12, // bLength
  1184. 0x24, // bDescriptorType, 0x24 = CS_INTERFACE
  1185. 2, // bDescriptorSubType, 2 = INPUT_TERMINAL
  1186. 3, // bTerminalID
  1187. 0x01, 0x01, // wTerminalType, 0x0101 = USB_STREAMING
  1188. 0, // bAssocTerminal, 0 = unidirectional
  1189. 2, // bNrChannels
  1190. 0x03, 0x00, // wChannelConfig, 0x0003 = Left & Right Front
  1191. 0, // iChannelNames
  1192. 0, // iTerminal
  1193. // Volume feature descriptor
  1194. 10, // bLength
  1195. 0x24, // bDescriptorType = CS_INTERFACE
  1196. 0x06, // bDescriptorSubType = FEATURE_UNIT
  1197. 0x31, // bUnitID
  1198. 0x03, // bSourceID (Input Terminal)
  1199. 0x01, // bControlSize (each channel is 1 byte, 3 channels)
  1200. 0x01, // bmaControls(0) Master: Mute
  1201. 0x02, // bmaControls(1) Left: Volume
  1202. 0x02, // bmaControls(2) Right: Volume
  1203. 0x00, // iFeature
  1204. // Output Terminal Descriptor
  1205. // USB DCD for Audio Devices 1.0, Table 4-4, page 40
  1206. 9, // bLength
  1207. 0x24, // bDescriptorType, 0x24 = CS_INTERFACE
  1208. 3, // bDescriptorSubtype, 3 = OUTPUT_TERMINAL
  1209. 4, // bTerminalID
  1210. //0x02, 0x03, // wTerminalType, 0x0302 = Headphones
  1211. 0x02, 0x06, // wTerminalType, 0x0602 = Digital Audio
  1212. 0, // bAssocTerminal, 0 = unidirectional
  1213. 0x31, // bCSourceID, connected to feature, ID=31
  1214. 0, // iTerminal
  1215. // Standard AS Interface Descriptor
  1216. // USB DCD for Audio Devices 1.0, Section 4.5.1, Table 4-18, page 59
  1217. // Alternate 0: default setting, disabled zero bandwidth
  1218. 9, // bLenght
  1219. 4, // bDescriptorType = INTERFACE
  1220. AUDIO_INTERFACE+1, // bInterfaceNumber
  1221. 0, // bAlternateSetting
  1222. 0, // bNumEndpoints
  1223. 1, // bInterfaceClass, 1 = AUDIO
  1224. 2, // bInterfaceSubclass, 2 = AUDIO_STREAMING
  1225. 0, // bInterfaceProtocol
  1226. 0, // iInterface
  1227. // Alternate 1: streaming data
  1228. 9, // bLenght
  1229. 4, // bDescriptorType = INTERFACE
  1230. AUDIO_INTERFACE+1, // bInterfaceNumber
  1231. 1, // bAlternateSetting
  1232. 1, // bNumEndpoints
  1233. 1, // bInterfaceClass, 1 = AUDIO
  1234. 2, // bInterfaceSubclass, 2 = AUDIO_STREAMING
  1235. 0, // bInterfaceProtocol
  1236. 0, // iInterface
  1237. // Class-Specific AS Interface Descriptor
  1238. // USB DCD for Audio Devices 1.0, Section 4.5.2, Table 4-19, page 60
  1239. 7, // bLength
  1240. 0x24, // bDescriptorType = CS_INTERFACE
  1241. 1, // bDescriptorSubtype, 1 = AS_GENERAL
  1242. 2, // bTerminalLink: Terminal ID = 2
  1243. 3, // bDelay (approx 3ms delay, audio lib updates)
  1244. 0x01, 0x00, // wFormatTag, 0x0001 = PCM
  1245. // Type I Format Descriptor
  1246. // USB DCD for Audio Data Formats 1.0, Section 2.2.5, Table 2-1, page 10
  1247. 11, // bLength
  1248. 0x24, // bDescriptorType = CS_INTERFACE
  1249. 2, // bDescriptorSubtype = FORMAT_TYPE
  1250. 1, // bFormatType = FORMAT_TYPE_I
  1251. 2, // bNrChannels = 2
  1252. 2, // bSubFrameSize = 2 byte
  1253. 16, // bBitResolution = 16 bits
  1254. 1, // bSamFreqType = 1 frequency
  1255. LSB(44100), MSB(44100), 0, // tSamFreq
  1256. // Standard AS Isochronous Audio Data Endpoint Descriptor
  1257. // USB DCD for Audio Devices 1.0, Section 4.6.1.1, Table 4-20, page 61-62
  1258. 9, // bLength
  1259. 5, // bDescriptorType, 5 = ENDPOINT_DESCRIPTOR
  1260. AUDIO_TX_ENDPOINT | 0x80, // bEndpointAddress
  1261. 0x09, // bmAttributes = isochronous, adaptive
  1262. LSB(AUDIO_TX_SIZE), MSB(AUDIO_TX_SIZE), // wMaxPacketSize
  1263. 1, // bInterval, 1 = every frame
  1264. 0, // bRefresh
  1265. 0, // bSynchAddress
  1266. // Class-Specific AS Isochronous Audio Data Endpoint Descriptor
  1267. // USB DCD for Audio Devices 1.0, Section 4.6.1.2, Table 4-21, page 62-63
  1268. 7, // bLength
  1269. 0x25, // bDescriptorType, 0x25 = CS_ENDPOINT
  1270. 1, // bDescriptorSubtype, 1 = EP_GENERAL
  1271. 0x00, // bmAttributes
  1272. 0, // bLockDelayUnits, 1 = ms
  1273. 0x00, 0x00, // wLockDelay
  1274. // Standard AS Interface Descriptor
  1275. // USB DCD for Audio Devices 1.0, Section 4.5.1, Table 4-18, page 59
  1276. // Alternate 0: default setting, disabled zero bandwidth
  1277. 9, // bLenght
  1278. 4, // bDescriptorType = INTERFACE
  1279. AUDIO_INTERFACE+2, // bInterfaceNumber
  1280. 0, // bAlternateSetting
  1281. 0, // bNumEndpoints
  1282. 1, // bInterfaceClass, 1 = AUDIO
  1283. 2, // bInterfaceSubclass, 2 = AUDIO_STREAMING
  1284. 0, // bInterfaceProtocol
  1285. 0, // iInterface
  1286. // Alternate 1: streaming data
  1287. 9, // bLenght
  1288. 4, // bDescriptorType = INTERFACE
  1289. AUDIO_INTERFACE+2, // bInterfaceNumber
  1290. 1, // bAlternateSetting
  1291. 2, // bNumEndpoints
  1292. 1, // bInterfaceClass, 1 = AUDIO
  1293. 2, // bInterfaceSubclass, 2 = AUDIO_STREAMING
  1294. 0, // bInterfaceProtocol
  1295. 0, // iInterface
  1296. // Class-Specific AS Interface Descriptor
  1297. // USB DCD for Audio Devices 1.0, Section 4.5.2, Table 4-19, page 60
  1298. 7, // bLength
  1299. 0x24, // bDescriptorType = CS_INTERFACE
  1300. 1, // bDescriptorSubtype, 1 = AS_GENERAL
  1301. 3, // bTerminalLink: Terminal ID = 3
  1302. 3, // bDelay (approx 3ms delay, audio lib updates)
  1303. 0x01, 0x00, // wFormatTag, 0x0001 = PCM
  1304. // Type I Format Descriptor
  1305. // USB DCD for Audio Data Formats 1.0, Section 2.2.5, Table 2-1, page 10
  1306. 11, // bLength
  1307. 0x24, // bDescriptorType = CS_INTERFACE
  1308. 2, // bDescriptorSubtype = FORMAT_TYPE
  1309. 1, // bFormatType = FORMAT_TYPE_I
  1310. 2, // bNrChannels = 2
  1311. 2, // bSubFrameSize = 2 byte
  1312. 16, // bBitResolution = 16 bits
  1313. 1, // bSamFreqType = 1 frequency
  1314. LSB(44100), MSB(44100), 0, // tSamFreq
  1315. // Standard AS Isochronous Audio Data Endpoint Descriptor
  1316. // USB DCD for Audio Devices 1.0, Section 4.6.1.1, Table 4-20, page 61-62
  1317. 9, // bLength
  1318. 5, // bDescriptorType, 5 = ENDPOINT_DESCRIPTOR
  1319. AUDIO_RX_ENDPOINT, // bEndpointAddress
  1320. 0x05, // bmAttributes = isochronous, asynchronous
  1321. LSB(AUDIO_RX_SIZE), MSB(AUDIO_RX_SIZE), // wMaxPacketSize
  1322. 1, // bInterval, 1 = every frame
  1323. 0, // bRefresh
  1324. AUDIO_SYNC_ENDPOINT | 0x80, // bSynchAddress
  1325. // Class-Specific AS Isochronous Audio Data Endpoint Descriptor
  1326. // USB DCD for Audio Devices 1.0, Section 4.6.1.2, Table 4-21, page 62-63
  1327. 7, // bLength
  1328. 0x25, // bDescriptorType, 0x25 = CS_ENDPOINT
  1329. 1, // bDescriptorSubtype, 1 = EP_GENERAL
  1330. 0x00, // bmAttributes
  1331. 0, // bLockDelayUnits, 1 = ms
  1332. 0x00, 0x00, // wLockDelay
  1333. // Standard AS Isochronous Audio Synch Endpoint Descriptor
  1334. // USB DCD for Audio Devices 1.0, Section 4.6.2.1, Table 4-22, page 63-64
  1335. 9, // bLength
  1336. 5, // bDescriptorType, 5 = ENDPOINT_DESCRIPTOR
  1337. AUDIO_SYNC_ENDPOINT | 0x80, // bEndpointAddress
  1338. 0x11, // bmAttributes = isochronous, feedback
  1339. 3, 0, // wMaxPacketSize, 3 bytes
  1340. 1, // bInterval, 1 = every frame
  1341. 5, // bRefresh, 5 = 32ms
  1342. 0, // bSynchAddress
  1343. #endif
  1344. #ifdef MULTITOUCH_INTERFACE
  1345. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  1346. 9, // bLength
  1347. 4, // bDescriptorType
  1348. MULTITOUCH_INTERFACE, // bInterfaceNumber
  1349. 0, // bAlternateSetting
  1350. 1, // bNumEndpoints
  1351. 0x03, // bInterfaceClass (0x03 = HID)
  1352. 0x00, // bInterfaceSubClass
  1353. 0x00, // bInterfaceProtocol
  1354. 0, // iInterface
  1355. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  1356. 9, // bLength
  1357. 0x21, // bDescriptorType
  1358. 0x11, 0x01, // bcdHID
  1359. 0, // bCountryCode
  1360. 1, // bNumDescriptors
  1361. 0x22, // bDescriptorType
  1362. LSB(sizeof(multitouch_report_desc)), // wDescriptorLength
  1363. MSB(sizeof(multitouch_report_desc)),
  1364. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1365. 7, // bLength
  1366. 5, // bDescriptorType
  1367. MULTITOUCH_ENDPOINT | 0x80, // bEndpointAddress
  1368. 0x03, // bmAttributes (0x03=intr)
  1369. MULTITOUCH_SIZE, 0, // wMaxPacketSize
  1370. 1, // bInterval
  1371. #endif // KEYMEDIA_INTERFACE
  1372. };
  1373. // **************************************************************
  1374. // String Descriptors
  1375. // **************************************************************
  1376. // The descriptors above can provide human readable strings,
  1377. // referenced by index numbers. These descriptors are the
  1378. // actual string data
  1379. /* defined in usb_names.h
  1380. struct usb_string_descriptor_struct {
  1381. uint8_t bLength;
  1382. uint8_t bDescriptorType;
  1383. uint16_t wString[];
  1384. };
  1385. */
  1386. extern struct usb_string_descriptor_struct usb_string_manufacturer_name
  1387. __attribute__ ((weak, alias("usb_string_manufacturer_name_default")));
  1388. extern struct usb_string_descriptor_struct usb_string_product_name
  1389. __attribute__ ((weak, alias("usb_string_product_name_default")));
  1390. extern struct usb_string_descriptor_struct usb_string_serial_number
  1391. __attribute__ ((weak, alias("usb_string_serial_number_default")));
  1392. struct usb_string_descriptor_struct string0 = {
  1393. 4,
  1394. 3,
  1395. {0x0409}
  1396. };
  1397. struct usb_string_descriptor_struct usb_string_manufacturer_name_default = {
  1398. 2 + MANUFACTURER_NAME_LEN * 2,
  1399. 3,
  1400. MANUFACTURER_NAME
  1401. };
  1402. struct usb_string_descriptor_struct usb_string_product_name_default = {
  1403. 2 + PRODUCT_NAME_LEN * 2,
  1404. 3,
  1405. PRODUCT_NAME
  1406. };
  1407. struct usb_string_descriptor_struct usb_string_serial_number_default = {
  1408. 12,
  1409. 3,
  1410. {0,0,0,0,0,0,0,0,0,0}
  1411. };
  1412. #ifdef MTP_INTERFACE
  1413. struct usb_string_descriptor_struct usb_string_mtp = {
  1414. 2 + 3 * 2,
  1415. 3,
  1416. {'M','T','P'}
  1417. };
  1418. #endif
  1419. void usb_init_serialnumber(void)
  1420. {
  1421. char buf[11];
  1422. uint32_t i, num;
  1423. __disable_irq();
  1424. #if defined(HAS_KINETIS_FLASH_FTFA) || defined(HAS_KINETIS_FLASH_FTFL)
  1425. FTFL_FSTAT = FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL;
  1426. FTFL_FCCOB0 = 0x41;
  1427. FTFL_FCCOB1 = 15;
  1428. FTFL_FSTAT = FTFL_FSTAT_CCIF;
  1429. while (!(FTFL_FSTAT & FTFL_FSTAT_CCIF)) ; // wait
  1430. num = *(uint32_t *)&FTFL_FCCOB7;
  1431. #elif defined(HAS_KINETIS_FLASH_FTFE)
  1432. kinetis_hsrun_disable();
  1433. FTFL_FSTAT = FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL;
  1434. *(uint32_t *)&FTFL_FCCOB3 = 0x41070000;
  1435. FTFL_FSTAT = FTFL_FSTAT_CCIF;
  1436. while (!(FTFL_FSTAT & FTFL_FSTAT_CCIF)) ; // wait
  1437. num = *(uint32_t *)&FTFL_FCCOBB;
  1438. kinetis_hsrun_enable();
  1439. #endif
  1440. __enable_irq();
  1441. // add extra zero to work around OS-X CDC-ACM driver bug
  1442. if (num < 10000000) num = num * 10;
  1443. ultoa(num, buf, 10);
  1444. for (i=0; i<10; i++) {
  1445. char c = buf[i];
  1446. if (!c) break;
  1447. usb_string_serial_number_default.wString[i] = c;
  1448. }
  1449. usb_string_serial_number_default.bLength = i * 2 + 2;
  1450. }
  1451. // **************************************************************
  1452. // Descriptors List
  1453. // **************************************************************
  1454. // This table provides access to all the descriptor data above.
  1455. const usb_descriptor_list_t usb_descriptor_list[] = {
  1456. //wValue, wIndex, address, length
  1457. {0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},
  1458. {0x0200, 0x0000, config_descriptor, sizeof(config_descriptor)},
  1459. #ifdef SEREMU_INTERFACE
  1460. {0x2200, SEREMU_INTERFACE, seremu_report_desc, sizeof(seremu_report_desc)},
  1461. {0x2100, SEREMU_INTERFACE, config_descriptor+SEREMU_HID_DESC_OFFSET, 9},
  1462. #endif
  1463. #ifdef KEYBOARD_INTERFACE
  1464. {0x2200, KEYBOARD_INTERFACE, keyboard_report_desc, sizeof(keyboard_report_desc)},
  1465. {0x2100, KEYBOARD_INTERFACE, config_descriptor+KEYBOARD_HID_DESC_OFFSET, 9},
  1466. #endif
  1467. #ifdef MOUSE_INTERFACE
  1468. {0x2200, MOUSE_INTERFACE, mouse_report_desc, sizeof(mouse_report_desc)},
  1469. {0x2100, MOUSE_INTERFACE, config_descriptor+MOUSE_HID_DESC_OFFSET, 9},
  1470. #endif
  1471. #ifdef JOYSTICK_INTERFACE
  1472. {0x2200, JOYSTICK_INTERFACE, joystick_report_desc, sizeof(joystick_report_desc)},
  1473. {0x2100, JOYSTICK_INTERFACE, config_descriptor+JOYSTICK_HID_DESC_OFFSET, 9},
  1474. #endif
  1475. #ifdef RAWHID_INTERFACE
  1476. {0x2200, RAWHID_INTERFACE, rawhid_report_desc, sizeof(rawhid_report_desc)},
  1477. {0x2100, RAWHID_INTERFACE, config_descriptor+RAWHID_HID_DESC_OFFSET, 9},
  1478. #endif
  1479. #ifdef FLIGHTSIM_INTERFACE
  1480. {0x2200, FLIGHTSIM_INTERFACE, flightsim_report_desc, sizeof(flightsim_report_desc)},
  1481. {0x2100, FLIGHTSIM_INTERFACE, config_descriptor+FLIGHTSIM_HID_DESC_OFFSET, 9},
  1482. #endif
  1483. #ifdef KEYMEDIA_INTERFACE
  1484. {0x2200, KEYMEDIA_INTERFACE, keymedia_report_desc, sizeof(keymedia_report_desc)},
  1485. {0x2100, KEYMEDIA_INTERFACE, config_descriptor+KEYMEDIA_HID_DESC_OFFSET, 9},
  1486. #endif
  1487. #ifdef MULTITOUCH_INTERFACE
  1488. {0x2200, MULTITOUCH_INTERFACE, multitouch_report_desc, sizeof(multitouch_report_desc)},
  1489. {0x2100, MULTITOUCH_INTERFACE, config_descriptor+MULTITOUCH_HID_DESC_OFFSET, 9},
  1490. #endif
  1491. #ifdef MTP_INTERFACE
  1492. {0x0304, 0x0409, (const uint8_t *)&usb_string_mtp, 0},
  1493. #endif
  1494. {0x0300, 0x0000, (const uint8_t *)&string0, 0},
  1495. {0x0301, 0x0409, (const uint8_t *)&usb_string_manufacturer_name, 0},
  1496. {0x0302, 0x0409, (const uint8_t *)&usb_string_product_name, 0},
  1497. {0x0303, 0x0409, (const uint8_t *)&usb_string_serial_number, 0},
  1498. {0, 0, NULL, 0}
  1499. };
  1500. // **************************************************************
  1501. // Endpoint Configuration
  1502. // **************************************************************
  1503. #if 0
  1504. // 0x00 = not used
  1505. // 0x19 = Recieve only
  1506. // 0x15 = Transmit only
  1507. // 0x1D = Transmit & Recieve
  1508. //
  1509. const uint8_t usb_endpoint_config_table[NUM_ENDPOINTS] =
  1510. {
  1511. 0x00, 0x15, 0x19, 0x15, 0x00, 0x00, 0x00, 0x00,
  1512. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1513. };
  1514. #endif
  1515. const uint8_t usb_endpoint_config_table[NUM_ENDPOINTS] =
  1516. {
  1517. #if (defined(ENDPOINT1_CONFIG) && NUM_ENDPOINTS >= 1)
  1518. ENDPOINT1_CONFIG,
  1519. #elif (NUM_ENDPOINTS >= 1)
  1520. ENDPOINT_UNUSED,
  1521. #endif
  1522. #if (defined(ENDPOINT2_CONFIG) && NUM_ENDPOINTS >= 2)
  1523. ENDPOINT2_CONFIG,
  1524. #elif (NUM_ENDPOINTS >= 2)
  1525. ENDPOINT_UNUSED,
  1526. #endif
  1527. #if (defined(ENDPOINT3_CONFIG) && NUM_ENDPOINTS >= 3)
  1528. ENDPOINT3_CONFIG,
  1529. #elif (NUM_ENDPOINTS >= 3)
  1530. ENDPOINT_UNUSED,
  1531. #endif
  1532. #if (defined(ENDPOINT4_CONFIG) && NUM_ENDPOINTS >= 4)
  1533. ENDPOINT4_CONFIG,
  1534. #elif (NUM_ENDPOINTS >= 4)
  1535. ENDPOINT_UNUSED,
  1536. #endif
  1537. #if (defined(ENDPOINT5_CONFIG) && NUM_ENDPOINTS >= 5)
  1538. ENDPOINT5_CONFIG,
  1539. #elif (NUM_ENDPOINTS >= 5)
  1540. ENDPOINT_UNUSED,
  1541. #endif
  1542. #if (defined(ENDPOINT6_CONFIG) && NUM_ENDPOINTS >= 6)
  1543. ENDPOINT6_CONFIG,
  1544. #elif (NUM_ENDPOINTS >= 6)
  1545. ENDPOINT_UNUSED,
  1546. #endif
  1547. #if (defined(ENDPOINT7_CONFIG) && NUM_ENDPOINTS >= 7)
  1548. ENDPOINT7_CONFIG,
  1549. #elif (NUM_ENDPOINTS >= 7)
  1550. ENDPOINT_UNUSED,
  1551. #endif
  1552. #if (defined(ENDPOINT8_CONFIG) && NUM_ENDPOINTS >= 8)
  1553. ENDPOINT8_CONFIG,
  1554. #elif (NUM_ENDPOINTS >= 8)
  1555. ENDPOINT_UNUSED,
  1556. #endif
  1557. #if (defined(ENDPOINT9_CONFIG) && NUM_ENDPOINTS >= 9)
  1558. ENDPOINT9_CONFIG,
  1559. #elif (NUM_ENDPOINTS >= 9)
  1560. ENDPOINT_UNUSED,
  1561. #endif
  1562. #if (defined(ENDPOINT10_CONFIG) && NUM_ENDPOINTS >= 10)
  1563. ENDPOINT10_CONFIG,
  1564. #elif (NUM_ENDPOINTS >= 10)
  1565. ENDPOINT_UNUSED,
  1566. #endif
  1567. #if (defined(ENDPOINT11_CONFIG) && NUM_ENDPOINTS >= 11)
  1568. ENDPOINT11_CONFIG,
  1569. #elif (NUM_ENDPOINTS >= 11)
  1570. ENDPOINT_UNUSED,
  1571. #endif
  1572. #if (defined(ENDPOINT12_CONFIG) && NUM_ENDPOINTS >= 12)
  1573. ENDPOINT12_CONFIG,
  1574. #elif (NUM_ENDPOINTS >= 12)
  1575. ENDPOINT_UNUSED,
  1576. #endif
  1577. #if (defined(ENDPOINT13_CONFIG) && NUM_ENDPOINTS >= 13)
  1578. ENDPOINT13_CONFIG,
  1579. #elif (NUM_ENDPOINTS >= 13)
  1580. ENDPOINT_UNUSED,
  1581. #endif
  1582. #if (defined(ENDPOINT14_CONFIG) && NUM_ENDPOINTS >= 14)
  1583. ENDPOINT14_CONFIG,
  1584. #elif (NUM_ENDPOINTS >= 14)
  1585. ENDPOINT_UNUSED,
  1586. #endif
  1587. #if (defined(ENDPOINT15_CONFIG) && NUM_ENDPOINTS >= 15)
  1588. ENDPOINT15_CONFIG,
  1589. #elif (NUM_ENDPOINTS >= 15)
  1590. ENDPOINT_UNUSED,
  1591. #endif
  1592. };
  1593. #endif // NUM_ENDPOINTS
  1594. #endif // F_CPU >= 20 MHz