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