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 година
пре 9 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 9 година
пре 9 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 10 година
пре 11 година
пре 11 година
пре 11 година
пре 10 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 10 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 9 година
пре 11 година
пре 10 година
пре 11 година
пре 10 година
пре 11 година
пре 10 година
пре 11 година
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673
  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_DESCRIPTORS(prefix) \
  553. /* interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12 */ \
  554. 9, /* bLength */ \
  555. 4, /* bDescriptorType */ \
  556. prefix ## _STATUS_INTERFACE, /* bInterfaceNumber */ \
  557. 0, /* bAlternateSetting */ \
  558. 1, /* bNumEndpoints */ \
  559. 0x02, /* bInterfaceClass */ \
  560. 0x02, /* bInterfaceSubClass */ \
  561. 0x01, /* bInterfaceProtocol */ \
  562. 0, /* iInterface */ \
  563. /* CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26 */ \
  564. 5, /* bFunctionLength */ \
  565. 0x24, /* bDescriptorType */ \
  566. 0x00, /* bDescriptorSubtype */ \
  567. 0x10, 0x01, /* bcdCDC */ \
  568. /* Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27 */\
  569. 5, /* bFunctionLength */ \
  570. 0x24, /* bDescriptorType */ \
  571. 0x01, /* bDescriptorSubtype */ \
  572. 0x01, /* bmCapabilities */ \
  573. 1, /* bDataInterface */ \
  574. /* Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28 */\
  575. 4, /* bFunctionLength */ \
  576. 0x24, /* bDescriptorType */ \
  577. 0x02, /* bDescriptorSubtype */ \
  578. 0x06, /* bmCapabilities */ \
  579. /* Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33 */ \
  580. 5, /* bFunctionLength */ \
  581. 0x24, /* bDescriptorType */ \
  582. 0x06, /* bDescriptorSubtype */ \
  583. prefix ## _STATUS_INTERFACE, /* bMasterInterface */ \
  584. prefix ## _DATA_INTERFACE, /* bSlaveInterface0 */ \
  585. /* endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 */ \
  586. 7, /* bLength */ \
  587. 5, /* bDescriptorType */ \
  588. prefix ## _ACM_ENDPOINT | 0x80, /* bEndpointAddress */ \
  589. 0x03, /* bmAttributes (0x03=intr) */ \
  590. prefix ## _ACM_SIZE, 0, /* wMaxPacketSize */ \
  591. 64, /* bInterval */ \
  592. /* interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12 */ \
  593. 9, /* bLength */ \
  594. 4, /* bDescriptorType */ \
  595. prefix ## _DATA_INTERFACE, /* bInterfaceNumber */ \
  596. 0, /* bAlternateSetting */ \
  597. 2, /* bNumEndpoints */ \
  598. 0x0A, /* bInterfaceClass */ \
  599. 0x00, /* bInterfaceSubClass */ \
  600. 0x00, /* bInterfaceProtocol */ \
  601. 0, /* iInterface */ \
  602. /* endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 */ \
  603. 7, /* bLength */ \
  604. 5, /* bDescriptorType */ \
  605. prefix ## _RX_ENDPOINT, /* bEndpointAddress */ \
  606. 0x02, /* bmAttributes (0x02=bulk) */ \
  607. prefix ## _RX_SIZE, 0, /* wMaxPacketSize */ \
  608. 0, /* bInterval */ \
  609. /* endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 */ \
  610. 7, /* bLength */ \
  611. 5, /* bDescriptorType */ \
  612. prefix ## _TX_ENDPOINT | 0x80, /* bEndpointAddress */ \
  613. 0x02, /* bmAttributes (0x02=bulk) */ \
  614. prefix ## _TX_SIZE, 0, /* wMaxPacketSize */ \
  615. 0 /* bInterval */ \
  616. // USB Configuration Descriptor. This huge descriptor tells all
  617. // of the devices capbilities.
  618. static uint8_t config_descriptor[CONFIG_DESC_SIZE] = {
  619. // configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10
  620. 9, // bLength;
  621. 2, // bDescriptorType;
  622. LSB(CONFIG_DESC_SIZE), // wTotalLength
  623. MSB(CONFIG_DESC_SIZE),
  624. NUM_INTERFACE, // bNumInterfaces
  625. 1, // bConfigurationValue
  626. 0, // iConfiguration
  627. 0xC0, // bmAttributes
  628. 50, // bMaxPower
  629. #ifdef CDC_IAD_DESCRIPTOR
  630. // interface association descriptor, USB ECN, Table 9-Z
  631. 8, // bLength
  632. 11, // bDescriptorType
  633. CDC_STATUS_INTERFACE, // bFirstInterface
  634. 2, // bInterfaceCount
  635. 0x02, // bFunctionClass
  636. 0x02, // bFunctionSubClass
  637. 0x01, // bFunctionProtocol
  638. 0, // iFunction
  639. #endif
  640. #ifdef CDC_DATA_INTERFACE
  641. EMIT_CDC_DESCRIPTORS(CDC),
  642. #endif // CDC_DATA_INTERFACE
  643. #ifdef CDC2_DATA_INTERFACE
  644. EMIT_CDC_IAD_DESCRIPTOR(CDC2),
  645. EMIT_CDC_DESCRIPTORS(CDC2),
  646. #endif // CDC2_DATA_INTERFACE
  647. #ifdef CDC3_DATA_INTERFACE
  648. EMIT_CDC_IAD_DESCRIPTOR(CDC3),
  649. EMIT_CDC_DESCRIPTORS(CDC3),
  650. #endif // CDC3_DATA_INTERFACE
  651. #ifdef MIDI_INTERFACE
  652. // Standard MS Interface Descriptor,
  653. 9, // bLength
  654. 4, // bDescriptorType
  655. MIDI_INTERFACE, // bInterfaceNumber
  656. 0, // bAlternateSetting
  657. 2, // bNumEndpoints
  658. 0x01, // bInterfaceClass (0x01 = Audio)
  659. 0x03, // bInterfaceSubClass (0x03 = MIDI)
  660. 0x00, // bInterfaceProtocol (unused for MIDI)
  661. 0, // iInterface
  662. // MIDI MS Interface Header, USB MIDI 6.1.2.1, page 21, Table 6-2
  663. 7, // bLength
  664. 0x24, // bDescriptorType = CS_INTERFACE
  665. 0x01, // bDescriptorSubtype = MS_HEADER
  666. 0x00, 0x01, // bcdMSC = revision 01.00
  667. LSB(7+(6+6+9+9)*MIDI_NUM_CABLES), // wTotalLength
  668. MSB(7+(6+6+9+9)*MIDI_NUM_CABLES),
  669. // MIDI IN Jack Descriptor, B.4.3, Table B-7 (embedded), page 40
  670. 6, // bLength
  671. 0x24, // bDescriptorType = CS_INTERFACE
  672. 0x02, // bDescriptorSubtype = MIDI_IN_JACK
  673. 0x01, // bJackType = EMBEDDED
  674. 1, // bJackID, ID = 1
  675. 0, // iJack
  676. // MIDI IN Jack Descriptor, B.4.3, Table B-8 (external), page 40
  677. 6, // bLength
  678. 0x24, // bDescriptorType = CS_INTERFACE
  679. 0x02, // bDescriptorSubtype = MIDI_IN_JACK
  680. 0x02, // bJackType = EXTERNAL
  681. 2, // bJackID, ID = 2
  682. 0, // iJack
  683. // MIDI OUT Jack Descriptor, B.4.4, Table B-9, page 41
  684. 9,
  685. 0x24, // bDescriptorType = CS_INTERFACE
  686. 0x03, // bDescriptorSubtype = MIDI_OUT_JACK
  687. 0x01, // bJackType = EMBEDDED
  688. 3, // bJackID, ID = 3
  689. 1, // bNrInputPins = 1 pin
  690. 2, // BaSourceID(1) = 2
  691. 1, // BaSourcePin(1) = first pin
  692. 0, // iJack
  693. // MIDI OUT Jack Descriptor, B.4.4, Table B-10, page 41
  694. 9,
  695. 0x24, // bDescriptorType = CS_INTERFACE
  696. 0x03, // bDescriptorSubtype = MIDI_OUT_JACK
  697. 0x02, // bJackType = EXTERNAL
  698. 4, // bJackID, ID = 4
  699. 1, // bNrInputPins = 1 pin
  700. 1, // BaSourceID(1) = 1
  701. 1, // BaSourcePin(1) = first pin
  702. 0, // iJack
  703. #if MIDI_NUM_CABLES >= 2
  704. #define MIDI_INTERFACE_JACK_PAIR(a, b, c, d) \
  705. 6, 0x24, 0x02, 0x01, (a), 0, \
  706. 6, 0x24, 0x02, 0x02, (b), 0, \
  707. 9, 0x24, 0x03, 0x01, (c), 1, (b), 1, 0, \
  708. 9, 0x24, 0x03, 0x02, (d), 1, (a), 1, 0,
  709. MIDI_INTERFACE_JACK_PAIR(5, 6, 7, 8)
  710. #endif
  711. #if MIDI_NUM_CABLES >= 3
  712. MIDI_INTERFACE_JACK_PAIR(9, 10, 11, 12)
  713. #endif
  714. #if MIDI_NUM_CABLES >= 4
  715. MIDI_INTERFACE_JACK_PAIR(13, 14, 15, 16)
  716. #endif
  717. #if MIDI_NUM_CABLES >= 5
  718. MIDI_INTERFACE_JACK_PAIR(17, 18, 19, 20)
  719. #endif
  720. #if MIDI_NUM_CABLES >= 6
  721. MIDI_INTERFACE_JACK_PAIR(21, 22, 23, 24)
  722. #endif
  723. #if MIDI_NUM_CABLES >= 7
  724. MIDI_INTERFACE_JACK_PAIR(25, 26, 27, 28)
  725. #endif
  726. #if MIDI_NUM_CABLES >= 8
  727. MIDI_INTERFACE_JACK_PAIR(29, 30, 31, 32)
  728. #endif
  729. #if MIDI_NUM_CABLES >= 9
  730. MIDI_INTERFACE_JACK_PAIR(33, 34, 35, 36)
  731. #endif
  732. #if MIDI_NUM_CABLES >= 10
  733. MIDI_INTERFACE_JACK_PAIR(37, 38, 39, 40)
  734. #endif
  735. #if MIDI_NUM_CABLES >= 11
  736. MIDI_INTERFACE_JACK_PAIR(41, 42, 43, 44)
  737. #endif
  738. #if MIDI_NUM_CABLES >= 12
  739. MIDI_INTERFACE_JACK_PAIR(45, 46, 47, 48)
  740. #endif
  741. #if MIDI_NUM_CABLES >= 13
  742. MIDI_INTERFACE_JACK_PAIR(49, 50, 51, 52)
  743. #endif
  744. #if MIDI_NUM_CABLES >= 14
  745. MIDI_INTERFACE_JACK_PAIR(53, 54, 55, 56)
  746. #endif
  747. #if MIDI_NUM_CABLES >= 15
  748. MIDI_INTERFACE_JACK_PAIR(57, 58, 59, 60)
  749. #endif
  750. #if MIDI_NUM_CABLES >= 16
  751. MIDI_INTERFACE_JACK_PAIR(61, 62, 63, 64)
  752. #endif
  753. // Standard Bulk OUT Endpoint Descriptor, B.5.1, Table B-11, pae 42
  754. 9, // bLength
  755. 5, // bDescriptorType = ENDPOINT
  756. MIDI_RX_ENDPOINT, // bEndpointAddress
  757. 0x02, // bmAttributes (0x02=bulk)
  758. MIDI_RX_SIZE, 0, // wMaxPacketSize
  759. 0, // bInterval
  760. 0, // bRefresh
  761. 0, // bSynchAddress
  762. // Class-specific MS Bulk OUT Endpoint Descriptor, B.5.2, Table B-12, page 42
  763. 4+MIDI_NUM_CABLES, // bLength
  764. 0x25, // bDescriptorSubtype = CS_ENDPOINT
  765. 0x01, // bJackType = MS_GENERAL
  766. MIDI_NUM_CABLES, // bNumEmbMIDIJack = number of jacks
  767. 1, // BaAssocJackID(1) = jack ID #1
  768. #if MIDI_NUM_CABLES >= 2
  769. 5,
  770. #endif
  771. #if MIDI_NUM_CABLES >= 3
  772. 9,
  773. #endif
  774. #if MIDI_NUM_CABLES >= 4
  775. 13,
  776. #endif
  777. #if MIDI_NUM_CABLES >= 5
  778. 17,
  779. #endif
  780. #if MIDI_NUM_CABLES >= 6
  781. 21,
  782. #endif
  783. #if MIDI_NUM_CABLES >= 7
  784. 25,
  785. #endif
  786. #if MIDI_NUM_CABLES >= 8
  787. 29,
  788. #endif
  789. #if MIDI_NUM_CABLES >= 9
  790. 33,
  791. #endif
  792. #if MIDI_NUM_CABLES >= 10
  793. 37,
  794. #endif
  795. #if MIDI_NUM_CABLES >= 11
  796. 41,
  797. #endif
  798. #if MIDI_NUM_CABLES >= 12
  799. 45,
  800. #endif
  801. #if MIDI_NUM_CABLES >= 13
  802. 49,
  803. #endif
  804. #if MIDI_NUM_CABLES >= 14
  805. 53,
  806. #endif
  807. #if MIDI_NUM_CABLES >= 15
  808. 57,
  809. #endif
  810. #if MIDI_NUM_CABLES >= 16
  811. 61,
  812. #endif
  813. // Standard Bulk IN Endpoint Descriptor, B.5.1, Table B-11, pae 42
  814. 9, // bLength
  815. 5, // bDescriptorType = ENDPOINT
  816. MIDI_TX_ENDPOINT | 0x80, // bEndpointAddress
  817. 0x02, // bmAttributes (0x02=bulk)
  818. MIDI_TX_SIZE, 0, // wMaxPacketSize
  819. 0, // bInterval
  820. 0, // bRefresh
  821. 0, // bSynchAddress
  822. // Class-specific MS Bulk IN Endpoint Descriptor, B.5.2, Table B-12, page 42
  823. 4+MIDI_NUM_CABLES, // bLength
  824. 0x25, // bDescriptorSubtype = CS_ENDPOINT
  825. 0x01, // bJackType = MS_GENERAL
  826. MIDI_NUM_CABLES, // bNumEmbMIDIJack = number of jacks
  827. 3, // BaAssocJackID(1) = jack ID #3
  828. #if MIDI_NUM_CABLES >= 2
  829. 7,
  830. #endif
  831. #if MIDI_NUM_CABLES >= 3
  832. 11,
  833. #endif
  834. #if MIDI_NUM_CABLES >= 4
  835. 15,
  836. #endif
  837. #if MIDI_NUM_CABLES >= 5
  838. 19,
  839. #endif
  840. #if MIDI_NUM_CABLES >= 6
  841. 23,
  842. #endif
  843. #if MIDI_NUM_CABLES >= 7
  844. 27,
  845. #endif
  846. #if MIDI_NUM_CABLES >= 8
  847. 31,
  848. #endif
  849. #if MIDI_NUM_CABLES >= 9
  850. 35,
  851. #endif
  852. #if MIDI_NUM_CABLES >= 10
  853. 39,
  854. #endif
  855. #if MIDI_NUM_CABLES >= 11
  856. 43,
  857. #endif
  858. #if MIDI_NUM_CABLES >= 12
  859. 47,
  860. #endif
  861. #if MIDI_NUM_CABLES >= 13
  862. 51,
  863. #endif
  864. #if MIDI_NUM_CABLES >= 14
  865. 55,
  866. #endif
  867. #if MIDI_NUM_CABLES >= 15
  868. 59,
  869. #endif
  870. #if MIDI_NUM_CABLES >= 16
  871. 63,
  872. #endif
  873. #endif // MIDI_INTERFACE
  874. #ifdef KEYBOARD_INTERFACE
  875. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  876. 9, // bLength
  877. 4, // bDescriptorType
  878. KEYBOARD_INTERFACE, // bInterfaceNumber
  879. 0, // bAlternateSetting
  880. 1, // bNumEndpoints
  881. 0x03, // bInterfaceClass (0x03 = HID)
  882. 0x01, // bInterfaceSubClass (0x01 = Boot)
  883. 0x01, // bInterfaceProtocol (0x01 = Keyboard)
  884. 0, // iInterface
  885. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  886. 9, // bLength
  887. 0x21, // bDescriptorType
  888. 0x11, 0x01, // bcdHID
  889. 0, // bCountryCode
  890. 1, // bNumDescriptors
  891. 0x22, // bDescriptorType
  892. LSB(sizeof(keyboard_report_desc)), // wDescriptorLength
  893. MSB(sizeof(keyboard_report_desc)),
  894. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  895. 7, // bLength
  896. 5, // bDescriptorType
  897. KEYBOARD_ENDPOINT | 0x80, // bEndpointAddress
  898. 0x03, // bmAttributes (0x03=intr)
  899. KEYBOARD_SIZE, 0, // wMaxPacketSize
  900. KEYBOARD_INTERVAL, // bInterval
  901. #endif // KEYBOARD_INTERFACE
  902. #ifdef MOUSE_INTERFACE
  903. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  904. 9, // bLength
  905. 4, // bDescriptorType
  906. MOUSE_INTERFACE, // bInterfaceNumber
  907. 0, // bAlternateSetting
  908. 1, // bNumEndpoints
  909. 0x03, // bInterfaceClass (0x03 = HID)
  910. 0x00, // bInterfaceSubClass (0x01 = Boot)
  911. 0x00, // bInterfaceProtocol (0x02 = Mouse)
  912. 0, // iInterface
  913. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  914. 9, // bLength
  915. 0x21, // bDescriptorType
  916. 0x11, 0x01, // bcdHID
  917. 0, // bCountryCode
  918. 1, // bNumDescriptors
  919. 0x22, // bDescriptorType
  920. LSB(sizeof(mouse_report_desc)), // wDescriptorLength
  921. MSB(sizeof(mouse_report_desc)),
  922. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  923. 7, // bLength
  924. 5, // bDescriptorType
  925. MOUSE_ENDPOINT | 0x80, // bEndpointAddress
  926. 0x03, // bmAttributes (0x03=intr)
  927. MOUSE_SIZE, 0, // wMaxPacketSize
  928. MOUSE_INTERVAL, // bInterval
  929. #endif // MOUSE_INTERFACE
  930. #ifdef RAWHID_INTERFACE
  931. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  932. 9, // bLength
  933. 4, // bDescriptorType
  934. RAWHID_INTERFACE, // bInterfaceNumber
  935. 0, // bAlternateSetting
  936. 2, // bNumEndpoints
  937. 0x03, // bInterfaceClass (0x03 = HID)
  938. 0x00, // bInterfaceSubClass
  939. 0x00, // bInterfaceProtocol
  940. 0, // iInterface
  941. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  942. 9, // bLength
  943. 0x21, // bDescriptorType
  944. 0x11, 0x01, // bcdHID
  945. 0, // bCountryCode
  946. 1, // bNumDescriptors
  947. 0x22, // bDescriptorType
  948. LSB(sizeof(rawhid_report_desc)), // wDescriptorLength
  949. MSB(sizeof(rawhid_report_desc)),
  950. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  951. 7, // bLength
  952. 5, // bDescriptorType
  953. RAWHID_TX_ENDPOINT | 0x80, // bEndpointAddress
  954. 0x03, // bmAttributes (0x03=intr)
  955. RAWHID_TX_SIZE, 0, // wMaxPacketSize
  956. RAWHID_TX_INTERVAL, // bInterval
  957. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  958. 7, // bLength
  959. 5, // bDescriptorType
  960. RAWHID_RX_ENDPOINT, // bEndpointAddress
  961. 0x03, // bmAttributes (0x03=intr)
  962. RAWHID_RX_SIZE, 0, // wMaxPacketSize
  963. RAWHID_RX_INTERVAL, // bInterval
  964. #endif // RAWHID_INTERFACE
  965. #ifdef FLIGHTSIM_INTERFACE
  966. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  967. 9, // bLength
  968. 4, // bDescriptorType
  969. FLIGHTSIM_INTERFACE, // bInterfaceNumber
  970. 0, // bAlternateSetting
  971. 2, // bNumEndpoints
  972. 0x03, // bInterfaceClass (0x03 = HID)
  973. 0x00, // bInterfaceSubClass
  974. 0x00, // bInterfaceProtocol
  975. 0, // iInterface
  976. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  977. 9, // bLength
  978. 0x21, // bDescriptorType
  979. 0x11, 0x01, // bcdHID
  980. 0, // bCountryCode
  981. 1, // bNumDescriptors
  982. 0x22, // bDescriptorType
  983. LSB(sizeof(flightsim_report_desc)), // wDescriptorLength
  984. MSB(sizeof(flightsim_report_desc)),
  985. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  986. 7, // bLength
  987. 5, // bDescriptorType
  988. FLIGHTSIM_TX_ENDPOINT | 0x80, // bEndpointAddress
  989. 0x03, // bmAttributes (0x03=intr)
  990. FLIGHTSIM_TX_SIZE, 0, // wMaxPacketSize
  991. FLIGHTSIM_TX_INTERVAL, // bInterval
  992. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  993. 7, // bLength
  994. 5, // bDescriptorType
  995. FLIGHTSIM_RX_ENDPOINT, // bEndpointAddress
  996. 0x03, // bmAttributes (0x03=intr)
  997. FLIGHTSIM_RX_SIZE, 0, // wMaxPacketSize
  998. FLIGHTSIM_RX_INTERVAL, // bInterval
  999. #endif // FLIGHTSIM_INTERFACE
  1000. #ifdef SEREMU_INTERFACE
  1001. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  1002. 9, // bLength
  1003. 4, // bDescriptorType
  1004. SEREMU_INTERFACE, // bInterfaceNumber
  1005. 0, // bAlternateSetting
  1006. 2, // bNumEndpoints
  1007. 0x03, // bInterfaceClass (0x03 = HID)
  1008. 0x00, // bInterfaceSubClass
  1009. 0x00, // bInterfaceProtocol
  1010. 0, // iInterface
  1011. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  1012. 9, // bLength
  1013. 0x21, // bDescriptorType
  1014. 0x11, 0x01, // bcdHID
  1015. 0, // bCountryCode
  1016. 1, // bNumDescriptors
  1017. 0x22, // bDescriptorType
  1018. LSB(sizeof(seremu_report_desc)), // wDescriptorLength
  1019. MSB(sizeof(seremu_report_desc)),
  1020. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1021. 7, // bLength
  1022. 5, // bDescriptorType
  1023. SEREMU_TX_ENDPOINT | 0x80, // bEndpointAddress
  1024. 0x03, // bmAttributes (0x03=intr)
  1025. SEREMU_TX_SIZE, 0, // wMaxPacketSize
  1026. SEREMU_TX_INTERVAL, // bInterval
  1027. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1028. 7, // bLength
  1029. 5, // bDescriptorType
  1030. SEREMU_RX_ENDPOINT, // bEndpointAddress
  1031. 0x03, // bmAttributes (0x03=intr)
  1032. SEREMU_RX_SIZE, 0, // wMaxPacketSize
  1033. SEREMU_RX_INTERVAL, // bInterval
  1034. #endif // SEREMU_INTERFACE
  1035. #ifdef JOYSTICK_INTERFACE
  1036. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  1037. 9, // bLength
  1038. 4, // bDescriptorType
  1039. JOYSTICK_INTERFACE, // bInterfaceNumber
  1040. 0, // bAlternateSetting
  1041. 1, // bNumEndpoints
  1042. 0x03, // bInterfaceClass (0x03 = HID)
  1043. 0x00, // bInterfaceSubClass
  1044. 0x00, // bInterfaceProtocol
  1045. 0, // iInterface
  1046. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  1047. 9, // bLength
  1048. 0x21, // bDescriptorType
  1049. 0x11, 0x01, // bcdHID
  1050. 0, // bCountryCode
  1051. 1, // bNumDescriptors
  1052. 0x22, // bDescriptorType
  1053. LSB(sizeof(joystick_report_desc)), // wDescriptorLength
  1054. MSB(sizeof(joystick_report_desc)),
  1055. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1056. 7, // bLength
  1057. 5, // bDescriptorType
  1058. JOYSTICK_ENDPOINT | 0x80, // bEndpointAddress
  1059. 0x03, // bmAttributes (0x03=intr)
  1060. JOYSTICK_SIZE, 0, // wMaxPacketSize
  1061. JOYSTICK_INTERVAL, // bInterval
  1062. #endif // JOYSTICK_INTERFACE
  1063. #ifdef MTP_INTERFACE
  1064. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  1065. 9, // bLength
  1066. 4, // bDescriptorType
  1067. MTP_INTERFACE, // bInterfaceNumber
  1068. 0, // bAlternateSetting
  1069. 3, // bNumEndpoints
  1070. 0x06, // bInterfaceClass (0x06 = still image)
  1071. 0x01, // bInterfaceSubClass
  1072. 0x01, // bInterfaceProtocol
  1073. 0, // iInterface
  1074. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1075. 7, // bLength
  1076. 5, // bDescriptorType
  1077. MTP_TX_ENDPOINT | 0x80, // bEndpointAddress
  1078. 0x02, // bmAttributes (0x02=bulk)
  1079. MTP_TX_SIZE, 0, // wMaxPacketSize
  1080. 0, // bInterval
  1081. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1082. 7, // bLength
  1083. 5, // bDescriptorType
  1084. MTP_RX_ENDPOINT, // bEndpointAddress
  1085. 0x02, // bmAttributes (0x02=bulk)
  1086. MTP_RX_SIZE, 0, // wMaxPacketSize
  1087. 0, // bInterval
  1088. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1089. 7, // bLength
  1090. 5, // bDescriptorType
  1091. MTP_EVENT_ENDPOINT | 0x80, // bEndpointAddress
  1092. 0x03, // bmAttributes (0x03=intr)
  1093. MTP_EVENT_SIZE, 0, // wMaxPacketSize
  1094. MTP_EVENT_INTERVAL, // bInterval
  1095. #endif // MTP_INTERFACE
  1096. #ifdef KEYMEDIA_INTERFACE
  1097. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  1098. 9, // bLength
  1099. 4, // bDescriptorType
  1100. KEYMEDIA_INTERFACE, // bInterfaceNumber
  1101. 0, // bAlternateSetting
  1102. 1, // bNumEndpoints
  1103. 0x03, // bInterfaceClass (0x03 = HID)
  1104. 0x00, // bInterfaceSubClass
  1105. 0x00, // bInterfaceProtocol
  1106. 0, // iInterface
  1107. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  1108. 9, // bLength
  1109. 0x21, // bDescriptorType
  1110. 0x11, 0x01, // bcdHID
  1111. 0, // bCountryCode
  1112. 1, // bNumDescriptors
  1113. 0x22, // bDescriptorType
  1114. LSB(sizeof(keymedia_report_desc)), // wDescriptorLength
  1115. MSB(sizeof(keymedia_report_desc)),
  1116. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1117. 7, // bLength
  1118. 5, // bDescriptorType
  1119. KEYMEDIA_ENDPOINT | 0x80, // bEndpointAddress
  1120. 0x03, // bmAttributes (0x03=intr)
  1121. KEYMEDIA_SIZE, 0, // wMaxPacketSize
  1122. KEYMEDIA_INTERVAL, // bInterval
  1123. #endif // KEYMEDIA_INTERFACE
  1124. #ifdef AUDIO_INTERFACE
  1125. // interface association descriptor, USB ECN, Table 9-Z
  1126. 8, // bLength
  1127. 11, // bDescriptorType
  1128. AUDIO_INTERFACE, // bFirstInterface
  1129. 3, // bInterfaceCount
  1130. 0x01, // bFunctionClass
  1131. 0x01, // bFunctionSubClass
  1132. 0x00, // bFunctionProtocol
  1133. 0, // iFunction
  1134. // Standard AudioControl (AC) Interface Descriptor
  1135. // USB DCD for Audio Devices 1.0, Table 4-1, page 36
  1136. 9, // bLength
  1137. 4, // bDescriptorType, 4 = INTERFACE
  1138. AUDIO_INTERFACE, // bInterfaceNumber
  1139. 0, // bAlternateSetting
  1140. 0, // bNumEndpoints
  1141. 1, // bInterfaceClass, 1 = AUDIO
  1142. 1, // bInterfaceSubclass, 1 = AUDIO_CONTROL
  1143. 0, // bInterfaceProtocol
  1144. 0, // iInterface
  1145. // Class-specific AC Interface Header Descriptor
  1146. // USB DCD for Audio Devices 1.0, Table 4-2, page 37-38
  1147. 10, // bLength
  1148. 0x24, // bDescriptorType, 0x24 = CS_INTERFACE
  1149. 0x01, // bDescriptorSubtype, 1 = HEADER
  1150. 0x00, 0x01, // bcdADC (version 1.0)
  1151. LSB(62), MSB(62), // wTotalLength
  1152. 2, // bInCollection
  1153. AUDIO_INTERFACE+1, // baInterfaceNr(1) - Transmit to PC
  1154. AUDIO_INTERFACE+2, // baInterfaceNr(2) - Receive from PC
  1155. // Input Terminal Descriptor
  1156. // USB DCD for Audio Devices 1.0, Table 4-3, page 39
  1157. 12, // bLength
  1158. 0x24, // bDescriptorType, 0x24 = CS_INTERFACE
  1159. 0x02, // bDescriptorSubType, 2 = INPUT_TERMINAL
  1160. 1, // bTerminalID
  1161. //0x01, 0x02, // wTerminalType, 0x0201 = MICROPHONE
  1162. //0x03, 0x06, // wTerminalType, 0x0603 = Line Connector
  1163. 0x02, 0x06, // wTerminalType, 0x0602 = Digital Audio
  1164. 0, // bAssocTerminal, 0 = unidirectional
  1165. 2, // bNrChannels
  1166. 0x03, 0x00, // wChannelConfig, 0x0003 = Left & Right Front
  1167. 0, // iChannelNames
  1168. 0, // iTerminal
  1169. // Output Terminal Descriptor
  1170. // USB DCD for Audio Devices 1.0, Table 4-4, page 40
  1171. 9, // bLength
  1172. 0x24, // bDescriptorType, 0x24 = CS_INTERFACE
  1173. 3, // bDescriptorSubtype, 3 = OUTPUT_TERMINAL
  1174. 2, // bTerminalID
  1175. 0x01, 0x01, // wTerminalType, 0x0101 = USB_STREAMING
  1176. 0, // bAssocTerminal, 0 = unidirectional
  1177. 1, // bCSourceID, connected to input terminal, ID=1
  1178. 0, // iTerminal
  1179. // Input Terminal Descriptor
  1180. // USB DCD for Audio Devices 1.0, Table 4-3, page 39
  1181. 12, // bLength
  1182. 0x24, // bDescriptorType, 0x24 = CS_INTERFACE
  1183. 2, // bDescriptorSubType, 2 = INPUT_TERMINAL
  1184. 3, // bTerminalID
  1185. 0x01, 0x01, // wTerminalType, 0x0101 = USB_STREAMING
  1186. 0, // bAssocTerminal, 0 = unidirectional
  1187. 2, // bNrChannels
  1188. 0x03, 0x00, // wChannelConfig, 0x0003 = Left & Right Front
  1189. 0, // iChannelNames
  1190. 0, // iTerminal
  1191. // Volume feature descriptor
  1192. 10, // bLength
  1193. 0x24, // bDescriptorType = CS_INTERFACE
  1194. 0x06, // bDescriptorSubType = FEATURE_UNIT
  1195. 0x31, // bUnitID
  1196. 0x03, // bSourceID (Input Terminal)
  1197. 0x01, // bControlSize (each channel is 1 byte, 3 channels)
  1198. 0x01, // bmaControls(0) Master: Mute
  1199. 0x02, // bmaControls(1) Left: Volume
  1200. 0x02, // bmaControls(2) Right: Volume
  1201. 0x00, // iFeature
  1202. // Output Terminal Descriptor
  1203. // USB DCD for Audio Devices 1.0, Table 4-4, page 40
  1204. 9, // bLength
  1205. 0x24, // bDescriptorType, 0x24 = CS_INTERFACE
  1206. 3, // bDescriptorSubtype, 3 = OUTPUT_TERMINAL
  1207. 4, // bTerminalID
  1208. //0x02, 0x03, // wTerminalType, 0x0302 = Headphones
  1209. 0x02, 0x06, // wTerminalType, 0x0602 = Digital Audio
  1210. 0, // bAssocTerminal, 0 = unidirectional
  1211. 0x31, // bCSourceID, connected to feature, ID=31
  1212. 0, // iTerminal
  1213. // Standard AS Interface Descriptor
  1214. // USB DCD for Audio Devices 1.0, Section 4.5.1, Table 4-18, page 59
  1215. // Alternate 0: default setting, disabled zero bandwidth
  1216. 9, // bLenght
  1217. 4, // bDescriptorType = INTERFACE
  1218. AUDIO_INTERFACE+1, // bInterfaceNumber
  1219. 0, // bAlternateSetting
  1220. 0, // bNumEndpoints
  1221. 1, // bInterfaceClass, 1 = AUDIO
  1222. 2, // bInterfaceSubclass, 2 = AUDIO_STREAMING
  1223. 0, // bInterfaceProtocol
  1224. 0, // iInterface
  1225. // Alternate 1: streaming data
  1226. 9, // bLenght
  1227. 4, // bDescriptorType = INTERFACE
  1228. AUDIO_INTERFACE+1, // bInterfaceNumber
  1229. 1, // bAlternateSetting
  1230. 1, // bNumEndpoints
  1231. 1, // bInterfaceClass, 1 = AUDIO
  1232. 2, // bInterfaceSubclass, 2 = AUDIO_STREAMING
  1233. 0, // bInterfaceProtocol
  1234. 0, // iInterface
  1235. // Class-Specific AS Interface Descriptor
  1236. // USB DCD for Audio Devices 1.0, Section 4.5.2, Table 4-19, page 60
  1237. 7, // bLength
  1238. 0x24, // bDescriptorType = CS_INTERFACE
  1239. 1, // bDescriptorSubtype, 1 = AS_GENERAL
  1240. 2, // bTerminalLink: Terminal ID = 2
  1241. 3, // bDelay (approx 3ms delay, audio lib updates)
  1242. 0x01, 0x00, // wFormatTag, 0x0001 = PCM
  1243. // Type I Format Descriptor
  1244. // USB DCD for Audio Data Formats 1.0, Section 2.2.5, Table 2-1, page 10
  1245. 11, // bLength
  1246. 0x24, // bDescriptorType = CS_INTERFACE
  1247. 2, // bDescriptorSubtype = FORMAT_TYPE
  1248. 1, // bFormatType = FORMAT_TYPE_I
  1249. 2, // bNrChannels = 2
  1250. 2, // bSubFrameSize = 2 byte
  1251. 16, // bBitResolution = 16 bits
  1252. 1, // bSamFreqType = 1 frequency
  1253. LSB(44100), MSB(44100), 0, // tSamFreq
  1254. // Standard AS Isochronous Audio Data Endpoint Descriptor
  1255. // USB DCD for Audio Devices 1.0, Section 4.6.1.1, Table 4-20, page 61-62
  1256. 9, // bLength
  1257. 5, // bDescriptorType, 5 = ENDPOINT_DESCRIPTOR
  1258. AUDIO_TX_ENDPOINT | 0x80, // bEndpointAddress
  1259. 0x09, // bmAttributes = isochronous, adaptive
  1260. LSB(AUDIO_TX_SIZE), MSB(AUDIO_TX_SIZE), // wMaxPacketSize
  1261. 1, // bInterval, 1 = every frame
  1262. 0, // bRefresh
  1263. 0, // bSynchAddress
  1264. // Class-Specific AS Isochronous Audio Data Endpoint Descriptor
  1265. // USB DCD for Audio Devices 1.0, Section 4.6.1.2, Table 4-21, page 62-63
  1266. 7, // bLength
  1267. 0x25, // bDescriptorType, 0x25 = CS_ENDPOINT
  1268. 1, // bDescriptorSubtype, 1 = EP_GENERAL
  1269. 0x00, // bmAttributes
  1270. 0, // bLockDelayUnits, 1 = ms
  1271. 0x00, 0x00, // wLockDelay
  1272. // Standard AS Interface Descriptor
  1273. // USB DCD for Audio Devices 1.0, Section 4.5.1, Table 4-18, page 59
  1274. // Alternate 0: default setting, disabled zero bandwidth
  1275. 9, // bLenght
  1276. 4, // bDescriptorType = INTERFACE
  1277. AUDIO_INTERFACE+2, // bInterfaceNumber
  1278. 0, // bAlternateSetting
  1279. 0, // bNumEndpoints
  1280. 1, // bInterfaceClass, 1 = AUDIO
  1281. 2, // bInterfaceSubclass, 2 = AUDIO_STREAMING
  1282. 0, // bInterfaceProtocol
  1283. 0, // iInterface
  1284. // Alternate 1: streaming data
  1285. 9, // bLenght
  1286. 4, // bDescriptorType = INTERFACE
  1287. AUDIO_INTERFACE+2, // bInterfaceNumber
  1288. 1, // bAlternateSetting
  1289. 2, // bNumEndpoints
  1290. 1, // bInterfaceClass, 1 = AUDIO
  1291. 2, // bInterfaceSubclass, 2 = AUDIO_STREAMING
  1292. 0, // bInterfaceProtocol
  1293. 0, // iInterface
  1294. // Class-Specific AS Interface Descriptor
  1295. // USB DCD for Audio Devices 1.0, Section 4.5.2, Table 4-19, page 60
  1296. 7, // bLength
  1297. 0x24, // bDescriptorType = CS_INTERFACE
  1298. 1, // bDescriptorSubtype, 1 = AS_GENERAL
  1299. 3, // bTerminalLink: Terminal ID = 3
  1300. 3, // bDelay (approx 3ms delay, audio lib updates)
  1301. 0x01, 0x00, // wFormatTag, 0x0001 = PCM
  1302. // Type I Format Descriptor
  1303. // USB DCD for Audio Data Formats 1.0, Section 2.2.5, Table 2-1, page 10
  1304. 11, // bLength
  1305. 0x24, // bDescriptorType = CS_INTERFACE
  1306. 2, // bDescriptorSubtype = FORMAT_TYPE
  1307. 1, // bFormatType = FORMAT_TYPE_I
  1308. 2, // bNrChannels = 2
  1309. 2, // bSubFrameSize = 2 byte
  1310. 16, // bBitResolution = 16 bits
  1311. 1, // bSamFreqType = 1 frequency
  1312. LSB(44100), MSB(44100), 0, // tSamFreq
  1313. // Standard AS Isochronous Audio Data Endpoint Descriptor
  1314. // USB DCD for Audio Devices 1.0, Section 4.6.1.1, Table 4-20, page 61-62
  1315. 9, // bLength
  1316. 5, // bDescriptorType, 5 = ENDPOINT_DESCRIPTOR
  1317. AUDIO_RX_ENDPOINT, // bEndpointAddress
  1318. 0x05, // bmAttributes = isochronous, asynchronous
  1319. LSB(AUDIO_RX_SIZE), MSB(AUDIO_RX_SIZE), // wMaxPacketSize
  1320. 1, // bInterval, 1 = every frame
  1321. 0, // bRefresh
  1322. AUDIO_SYNC_ENDPOINT | 0x80, // bSynchAddress
  1323. // Class-Specific AS Isochronous Audio Data Endpoint Descriptor
  1324. // USB DCD for Audio Devices 1.0, Section 4.6.1.2, Table 4-21, page 62-63
  1325. 7, // bLength
  1326. 0x25, // bDescriptorType, 0x25 = CS_ENDPOINT
  1327. 1, // bDescriptorSubtype, 1 = EP_GENERAL
  1328. 0x00, // bmAttributes
  1329. 0, // bLockDelayUnits, 1 = ms
  1330. 0x00, 0x00, // wLockDelay
  1331. // Standard AS Isochronous Audio Synch Endpoint Descriptor
  1332. // USB DCD for Audio Devices 1.0, Section 4.6.2.1, Table 4-22, page 63-64
  1333. 9, // bLength
  1334. 5, // bDescriptorType, 5 = ENDPOINT_DESCRIPTOR
  1335. AUDIO_SYNC_ENDPOINT | 0x80, // bEndpointAddress
  1336. 0x11, // bmAttributes = isochronous, feedback
  1337. 3, 0, // wMaxPacketSize, 3 bytes
  1338. 1, // bInterval, 1 = every frame
  1339. 5, // bRefresh, 5 = 32ms
  1340. 0, // bSynchAddress
  1341. #endif
  1342. #ifdef MULTITOUCH_INTERFACE
  1343. // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
  1344. 9, // bLength
  1345. 4, // bDescriptorType
  1346. MULTITOUCH_INTERFACE, // bInterfaceNumber
  1347. 0, // bAlternateSetting
  1348. 1, // bNumEndpoints
  1349. 0x03, // bInterfaceClass (0x03 = HID)
  1350. 0x00, // bInterfaceSubClass
  1351. 0x00, // bInterfaceProtocol
  1352. 0, // iInterface
  1353. // HID interface descriptor, HID 1.11 spec, section 6.2.1
  1354. 9, // bLength
  1355. 0x21, // bDescriptorType
  1356. 0x11, 0x01, // bcdHID
  1357. 0, // bCountryCode
  1358. 1, // bNumDescriptors
  1359. 0x22, // bDescriptorType
  1360. LSB(sizeof(multitouch_report_desc)), // wDescriptorLength
  1361. MSB(sizeof(multitouch_report_desc)),
  1362. // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
  1363. 7, // bLength
  1364. 5, // bDescriptorType
  1365. MULTITOUCH_ENDPOINT | 0x80, // bEndpointAddress
  1366. 0x03, // bmAttributes (0x03=intr)
  1367. MULTITOUCH_SIZE, 0, // wMaxPacketSize
  1368. 1, // bInterval
  1369. #endif // KEYMEDIA_INTERFACE
  1370. };
  1371. // **************************************************************
  1372. // String Descriptors
  1373. // **************************************************************
  1374. // The descriptors above can provide human readable strings,
  1375. // referenced by index numbers. These descriptors are the
  1376. // actual string data
  1377. /* defined in usb_names.h
  1378. struct usb_string_descriptor_struct {
  1379. uint8_t bLength;
  1380. uint8_t bDescriptorType;
  1381. uint16_t wString[];
  1382. };
  1383. */
  1384. extern struct usb_string_descriptor_struct usb_string_manufacturer_name
  1385. __attribute__ ((weak, alias("usb_string_manufacturer_name_default")));
  1386. extern struct usb_string_descriptor_struct usb_string_product_name
  1387. __attribute__ ((weak, alias("usb_string_product_name_default")));
  1388. extern struct usb_string_descriptor_struct usb_string_serial_number
  1389. __attribute__ ((weak, alias("usb_string_serial_number_default")));
  1390. struct usb_string_descriptor_struct string0 = {
  1391. 4,
  1392. 3,
  1393. {0x0409}
  1394. };
  1395. struct usb_string_descriptor_struct usb_string_manufacturer_name_default = {
  1396. 2 + MANUFACTURER_NAME_LEN * 2,
  1397. 3,
  1398. MANUFACTURER_NAME
  1399. };
  1400. struct usb_string_descriptor_struct usb_string_product_name_default = {
  1401. 2 + PRODUCT_NAME_LEN * 2,
  1402. 3,
  1403. PRODUCT_NAME
  1404. };
  1405. struct usb_string_descriptor_struct usb_string_serial_number_default = {
  1406. 12,
  1407. 3,
  1408. {0,0,0,0,0,0,0,0,0,0}
  1409. };
  1410. #ifdef MTP_INTERFACE
  1411. struct usb_string_descriptor_struct usb_string_mtp = {
  1412. 2 + 3 * 2,
  1413. 3,
  1414. {'M','T','P'}
  1415. };
  1416. #endif
  1417. void usb_init_serialnumber(void)
  1418. {
  1419. char buf[11];
  1420. uint32_t i, num;
  1421. __disable_irq();
  1422. #if defined(HAS_KINETIS_FLASH_FTFA) || defined(HAS_KINETIS_FLASH_FTFL)
  1423. FTFL_FSTAT = FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL;
  1424. FTFL_FCCOB0 = 0x41;
  1425. FTFL_FCCOB1 = 15;
  1426. FTFL_FSTAT = FTFL_FSTAT_CCIF;
  1427. while (!(FTFL_FSTAT & FTFL_FSTAT_CCIF)) ; // wait
  1428. num = *(uint32_t *)&FTFL_FCCOB7;
  1429. #elif defined(HAS_KINETIS_FLASH_FTFE)
  1430. kinetis_hsrun_disable();
  1431. FTFL_FSTAT = FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL;
  1432. *(uint32_t *)&FTFL_FCCOB3 = 0x41070000;
  1433. FTFL_FSTAT = FTFL_FSTAT_CCIF;
  1434. while (!(FTFL_FSTAT & FTFL_FSTAT_CCIF)) ; // wait
  1435. num = *(uint32_t *)&FTFL_FCCOBB;
  1436. kinetis_hsrun_enable();
  1437. #endif
  1438. __enable_irq();
  1439. // add extra zero to work around OS-X CDC-ACM driver bug
  1440. if (num < 10000000) num = num * 10;
  1441. ultoa(num, buf, 10);
  1442. for (i=0; i<10; i++) {
  1443. char c = buf[i];
  1444. if (!c) break;
  1445. usb_string_serial_number_default.wString[i] = c;
  1446. }
  1447. usb_string_serial_number_default.bLength = i * 2 + 2;
  1448. }
  1449. // **************************************************************
  1450. // Descriptors List
  1451. // **************************************************************
  1452. // This table provides access to all the descriptor data above.
  1453. const usb_descriptor_list_t usb_descriptor_list[] = {
  1454. //wValue, wIndex, address, length
  1455. {0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},
  1456. {0x0200, 0x0000, config_descriptor, sizeof(config_descriptor)},
  1457. #ifdef SEREMU_INTERFACE
  1458. {0x2200, SEREMU_INTERFACE, seremu_report_desc, sizeof(seremu_report_desc)},
  1459. {0x2100, SEREMU_INTERFACE, config_descriptor+SEREMU_HID_DESC_OFFSET, 9},
  1460. #endif
  1461. #ifdef KEYBOARD_INTERFACE
  1462. {0x2200, KEYBOARD_INTERFACE, keyboard_report_desc, sizeof(keyboard_report_desc)},
  1463. {0x2100, KEYBOARD_INTERFACE, config_descriptor+KEYBOARD_HID_DESC_OFFSET, 9},
  1464. #endif
  1465. #ifdef MOUSE_INTERFACE
  1466. {0x2200, MOUSE_INTERFACE, mouse_report_desc, sizeof(mouse_report_desc)},
  1467. {0x2100, MOUSE_INTERFACE, config_descriptor+MOUSE_HID_DESC_OFFSET, 9},
  1468. #endif
  1469. #ifdef JOYSTICK_INTERFACE
  1470. {0x2200, JOYSTICK_INTERFACE, joystick_report_desc, sizeof(joystick_report_desc)},
  1471. {0x2100, JOYSTICK_INTERFACE, config_descriptor+JOYSTICK_HID_DESC_OFFSET, 9},
  1472. #endif
  1473. #ifdef RAWHID_INTERFACE
  1474. {0x2200, RAWHID_INTERFACE, rawhid_report_desc, sizeof(rawhid_report_desc)},
  1475. {0x2100, RAWHID_INTERFACE, config_descriptor+RAWHID_HID_DESC_OFFSET, 9},
  1476. #endif
  1477. #ifdef FLIGHTSIM_INTERFACE
  1478. {0x2200, FLIGHTSIM_INTERFACE, flightsim_report_desc, sizeof(flightsim_report_desc)},
  1479. {0x2100, FLIGHTSIM_INTERFACE, config_descriptor+FLIGHTSIM_HID_DESC_OFFSET, 9},
  1480. #endif
  1481. #ifdef KEYMEDIA_INTERFACE
  1482. {0x2200, KEYMEDIA_INTERFACE, keymedia_report_desc, sizeof(keymedia_report_desc)},
  1483. {0x2100, KEYMEDIA_INTERFACE, config_descriptor+KEYMEDIA_HID_DESC_OFFSET, 9},
  1484. #endif
  1485. #ifdef MULTITOUCH_INTERFACE
  1486. {0x2200, MULTITOUCH_INTERFACE, multitouch_report_desc, sizeof(multitouch_report_desc)},
  1487. {0x2100, MULTITOUCH_INTERFACE, config_descriptor+MULTITOUCH_HID_DESC_OFFSET, 9},
  1488. #endif
  1489. #ifdef MTP_INTERFACE
  1490. {0x0304, 0x0409, (const uint8_t *)&usb_string_mtp, 0},
  1491. #endif
  1492. {0x0300, 0x0000, (const uint8_t *)&string0, 0},
  1493. {0x0301, 0x0409, (const uint8_t *)&usb_string_manufacturer_name, 0},
  1494. {0x0302, 0x0409, (const uint8_t *)&usb_string_product_name, 0},
  1495. {0x0303, 0x0409, (const uint8_t *)&usb_string_serial_number, 0},
  1496. {0, 0, NULL, 0}
  1497. };
  1498. // **************************************************************
  1499. // Endpoint Configuration
  1500. // **************************************************************
  1501. #if 0
  1502. // 0x00 = not used
  1503. // 0x19 = Recieve only
  1504. // 0x15 = Transmit only
  1505. // 0x1D = Transmit & Recieve
  1506. //
  1507. const uint8_t usb_endpoint_config_table[NUM_ENDPOINTS] =
  1508. {
  1509. 0x00, 0x15, 0x19, 0x15, 0x00, 0x00, 0x00, 0x00,
  1510. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1511. };
  1512. #endif
  1513. const uint8_t usb_endpoint_config_table[NUM_ENDPOINTS] =
  1514. {
  1515. #if (defined(ENDPOINT1_CONFIG) && NUM_ENDPOINTS >= 1)
  1516. ENDPOINT1_CONFIG,
  1517. #elif (NUM_ENDPOINTS >= 1)
  1518. ENDPOINT_UNUSED,
  1519. #endif
  1520. #if (defined(ENDPOINT2_CONFIG) && NUM_ENDPOINTS >= 2)
  1521. ENDPOINT2_CONFIG,
  1522. #elif (NUM_ENDPOINTS >= 2)
  1523. ENDPOINT_UNUSED,
  1524. #endif
  1525. #if (defined(ENDPOINT3_CONFIG) && NUM_ENDPOINTS >= 3)
  1526. ENDPOINT3_CONFIG,
  1527. #elif (NUM_ENDPOINTS >= 3)
  1528. ENDPOINT_UNUSED,
  1529. #endif
  1530. #if (defined(ENDPOINT4_CONFIG) && NUM_ENDPOINTS >= 4)
  1531. ENDPOINT4_CONFIG,
  1532. #elif (NUM_ENDPOINTS >= 4)
  1533. ENDPOINT_UNUSED,
  1534. #endif
  1535. #if (defined(ENDPOINT5_CONFIG) && NUM_ENDPOINTS >= 5)
  1536. ENDPOINT5_CONFIG,
  1537. #elif (NUM_ENDPOINTS >= 5)
  1538. ENDPOINT_UNUSED,
  1539. #endif
  1540. #if (defined(ENDPOINT6_CONFIG) && NUM_ENDPOINTS >= 6)
  1541. ENDPOINT6_CONFIG,
  1542. #elif (NUM_ENDPOINTS >= 6)
  1543. ENDPOINT_UNUSED,
  1544. #endif
  1545. #if (defined(ENDPOINT7_CONFIG) && NUM_ENDPOINTS >= 7)
  1546. ENDPOINT7_CONFIG,
  1547. #elif (NUM_ENDPOINTS >= 7)
  1548. ENDPOINT_UNUSED,
  1549. #endif
  1550. #if (defined(ENDPOINT8_CONFIG) && NUM_ENDPOINTS >= 8)
  1551. ENDPOINT8_CONFIG,
  1552. #elif (NUM_ENDPOINTS >= 8)
  1553. ENDPOINT_UNUSED,
  1554. #endif
  1555. #if (defined(ENDPOINT9_CONFIG) && NUM_ENDPOINTS >= 9)
  1556. ENDPOINT9_CONFIG,
  1557. #elif (NUM_ENDPOINTS >= 9)
  1558. ENDPOINT_UNUSED,
  1559. #endif
  1560. #if (defined(ENDPOINT10_CONFIG) && NUM_ENDPOINTS >= 10)
  1561. ENDPOINT10_CONFIG,
  1562. #elif (NUM_ENDPOINTS >= 10)
  1563. ENDPOINT_UNUSED,
  1564. #endif
  1565. #if (defined(ENDPOINT11_CONFIG) && NUM_ENDPOINTS >= 11)
  1566. ENDPOINT11_CONFIG,
  1567. #elif (NUM_ENDPOINTS >= 11)
  1568. ENDPOINT_UNUSED,
  1569. #endif
  1570. #if (defined(ENDPOINT12_CONFIG) && NUM_ENDPOINTS >= 12)
  1571. ENDPOINT12_CONFIG,
  1572. #elif (NUM_ENDPOINTS >= 12)
  1573. ENDPOINT_UNUSED,
  1574. #endif
  1575. #if (defined(ENDPOINT13_CONFIG) && NUM_ENDPOINTS >= 13)
  1576. ENDPOINT13_CONFIG,
  1577. #elif (NUM_ENDPOINTS >= 13)
  1578. ENDPOINT_UNUSED,
  1579. #endif
  1580. #if (defined(ENDPOINT14_CONFIG) && NUM_ENDPOINTS >= 14)
  1581. ENDPOINT14_CONFIG,
  1582. #elif (NUM_ENDPOINTS >= 14)
  1583. ENDPOINT_UNUSED,
  1584. #endif
  1585. #if (defined(ENDPOINT15_CONFIG) && NUM_ENDPOINTS >= 15)
  1586. ENDPOINT15_CONFIG,
  1587. #elif (NUM_ENDPOINTS >= 15)
  1588. ENDPOINT_UNUSED,
  1589. #endif
  1590. };
  1591. #endif // NUM_ENDPOINTS
  1592. #endif // F_CPU >= 20 MHz