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

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