hv_drv_UsbCh9.h 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067
  1. /*
  2. * @file hv_drv_UsbCh9.h
  3. * @brief This file holds USB constants and structures that are needed for
  4. * USB device APIs.
  5. * These are used by the USB device model, which is
  6. * defined in chapter 9 of the USB 2.0 specification and in the
  7. * Wireless USB 1.0 (spread around).
  8. *
  9. * @author HiView SoC Software Team
  10. * @version 1.0.0
  11. * @date 2022-06-15
  12. */
  13. #ifndef __HV_DRV_USB_CH9_H_
  14. #define __HV_DRV_USB_CH9_H_
  15. #include "hv_drv_UsbDefines.h"
  16. #define cpu_to_le64(x) x
  17. #define le64_to_cpu(x) x
  18. #define cpu_to_le32(x) x
  19. #define le32_to_cpu(x) x
  20. #define cpu_to_le16(x) x
  21. #define le16_to_cpu(x) x
  22. /*-------------------------------------------------------------------------*/
  23. /* CONTROL REQUEST SUPPORT */
  24. /*
  25. * USB directions
  26. *
  27. * This bit flag is used in endpoint descriptors' bEndpointAddress field.
  28. * It's also one of three fields in control requests bRequestType.
  29. */
  30. #define USB_DIR_OUT 0 /* to device */
  31. #define USB_DIR_IN 0x80 /* to host */
  32. /*
  33. * USB types, the second of three bRequestType fields
  34. */
  35. #define USB_TYPE_MASK (0x03 << 5)
  36. #define USB_TYPE_STANDARD (0x00 << 5)
  37. #define USB_TYPE_CLASS (0x01 << 5)
  38. #define USB_TYPE_VENDOR (0x02 << 5)
  39. #define USB_TYPE_RESERVED (0x03 << 5)
  40. /*
  41. * USB recipients, the third of three bRequestType fields
  42. */
  43. #define USB_RECIP_MASK 0x1f
  44. #define USB_RECIP_DEVICE 0x00
  45. #define USB_RECIP_INTERFACE 0x01
  46. #define USB_RECIP_ENDPOINT 0x02
  47. #define USB_RECIP_OTHER 0x03
  48. /* From Wireless USB 1.0 */
  49. #define USB_RECIP_PORT 0x04
  50. #define USB_RECIP_RPIPE 0x05
  51. /*
  52. * Standard requests, for the bRequest field of a SETUP packet.
  53. *
  54. * These are qualified by the bRequestType field, so that for example
  55. * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved
  56. * by a GET_STATUS request.
  57. */
  58. #define USB_REQ_GET_STATUS 0x00
  59. #define USB_REQ_CLEAR_FEATURE 0x01
  60. #define USB_REQ_SET_FEATURE 0x03
  61. #define USB_REQ_SET_ADDRESS 0x05
  62. #define USB_REQ_GET_DESCRIPTOR 0x06
  63. #define USB_REQ_SET_DESCRIPTOR 0x07
  64. #define USB_REQ_GET_CONFIGURATION 0x08
  65. #define USB_REQ_SET_CONFIGURATION 0x09
  66. #define USB_REQ_GET_INTERFACE 0x0A
  67. #define USB_REQ_SET_INTERFACE 0x0B
  68. #define USB_REQ_SYNCH_FRAME 0x0C
  69. #define USB_REQ_SET_SEL 0x30
  70. #define USB_REQ_SET_ISOCH_DELAY 0x31
  71. #define USB_REQ_SET_ENCRYPTION 0x0D /* Wireless USB */
  72. #define USB_REQ_GET_ENCRYPTION 0x0E
  73. #define USB_REQ_RPIPE_ABORT 0x0E
  74. #define USB_REQ_SET_HANDSHAKE 0x0F
  75. #define USB_REQ_RPIPE_RESET 0x0F
  76. #define USB_REQ_GET_HANDSHAKE 0x10
  77. #define USB_REQ_SET_CONNECTION 0x11
  78. #define USB_REQ_SET_SECURITY_DATA 0x12
  79. #define USB_REQ_GET_SECURITY_DATA 0x13
  80. #define USB_REQ_SET_WUSB_DATA 0x14
  81. #define USB_REQ_LOOPBACK_DATA_WRITE 0x15
  82. #define USB_REQ_LOOPBACK_DATA_READ 0x16
  83. #define USB_REQ_SET_INTERFACE_DS 0x17
  84. /* The Link Power Management (LPM) ECN defines USB_REQ_TEST_AND_SET command,
  85. * used by hubs to put ports into a new L1 suspend state, except that it
  86. * forgot to define its number ...
  87. */
  88. /*
  89. * USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and
  90. * are read as a bit array returned by USB_REQ_GET_STATUS. (So there
  91. * are at most sixteen features of each type.) Hubs may also support a
  92. * new USB_REQ_TEST_AND_SET_FEATURE to put ports into L1 suspend.
  93. */
  94. #define USB_DEVICE_SELF_POWERED 0 /* (read only) */
  95. #define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */
  96. #define USB_DEVICE_TEST_MODE 2 /* (wired high speed only) */
  97. #define USB_DEVICE_BATTERY 2 /* (wireless) */
  98. #define USB_DEVICE_B_HNP_ENABLE 3 /* (otg) dev may initiate HNP */
  99. #define USB_DEVICE_WUSB_DEVICE 3 /* (wireless)*/
  100. #define USB_DEVICE_A_HNP_SUPPORT 4 /* (otg) RH port supports HNP */
  101. #define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */
  102. #define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */
  103. /*
  104. * Test Mode Selectors
  105. * See USB 2.0 spec Table 9-7
  106. */
  107. #define TEST_J 1
  108. #define TEST_K 2
  109. #define TEST_SE0_NAK 3
  110. #define TEST_PACKET 4
  111. #define TEST_FORCE_EN 5
  112. /*
  113. * New Feature Selectors as added by USB 3.0
  114. * See USB 3.0 spec Table 9-6
  115. */
  116. #define USB_DEVICE_U1_ENABLE 48 /* dev may initiate U1 transition */
  117. #define USB_DEVICE_U2_ENABLE 49 /* dev may initiate U2 transition */
  118. #define USB_DEVICE_LTM_ENABLE 50 /* dev may send LTM */
  119. #define USB_INTRF_FUNC_SUSPEND 0 /* function suspend */
  120. #define USB_INTR_FUNC_SUSPEND_OPT_MASK 0xFF00
  121. /*
  122. * Suspend Options, Table 9-7 USB 3.0 spec
  123. */
  124. #define USB_INTRF_FUNC_SUSPEND_LP (1 << (8 + 0))
  125. #define USB_INTRF_FUNC_SUSPEND_RW (1 << (8 + 1))
  126. #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */
  127. /* Bit array elements as returned by the USB_REQ_GET_STATUS request. */
  128. #define USB_DEV_STAT_U1_ENABLED 2 /* transition into U1 state */
  129. #define USB_DEV_STAT_U2_ENABLED 3 /* transition into U2 state */
  130. #define USB_DEV_STAT_LTM_ENABLED 4 /* Latency tolerance messages */
  131. /**
  132. * struct usb_ctrlrequest - SETUP data for a USB device control request
  133. * @bRequestType: matches the USB bmRequestType field
  134. * @bRequest: matches the USB bRequest field
  135. * @wValue: matches the USB wValue field (le16 byte order)
  136. * @wIndex: matches the USB wIndex field (le16 byte order)
  137. * @wLength: matches the USB wLength field (le16 byte order)
  138. *
  139. * This structure is used to send control requests to a USB device. It matches
  140. * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the
  141. * USB spec for a fuller description of the different fields, and what they are
  142. * used for.
  143. *
  144. * Note that the driver for any interface can issue control requests.
  145. * For most devices, interfaces don't coordinate with each other, so
  146. * such requests may be made at any time.
  147. */
  148. struct usb_ctrlrequest {
  149. u8 bRequestType;
  150. u8 bRequest;
  151. u16 wValue;
  152. u16 wIndex;
  153. u16 wLength;
  154. }__attribute__((packed));
  155. /*-------------------------------------------------------------------------*/
  156. /*
  157. * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or
  158. * (rarely) accepted by SET_DESCRIPTOR.
  159. *
  160. * Note that all multi-byte values here are encoded in little endian
  161. * byte order "on the wire". Within the kernel and when exposed
  162. * through the Linux-USB APIs, they are not converted to cpu byte
  163. * order; it is the responsibility of the client code to do this.
  164. * The single exception is when device and configuration descriptors (but
  165. * not other descriptors) are read from usbfs (i.e. /proc/bus/usb/BBB/DDD);
  166. * in this case the fields are converted to host endianness by the kernel.
  167. */
  168. /*
  169. * Descriptor types ... USB 2.0 spec table 9.5
  170. */
  171. #define USB_DT_DEVICE 0x01
  172. #define USB_DT_CONFIG 0x02
  173. #define USB_DT_STRING 0x03
  174. #define USB_DT_INTERFACE 0x04
  175. #define USB_DT_ENDPOINT 0x05
  176. #define USB_DT_DEVICE_QUALIFIER 0x06
  177. #define USB_DT_OTHER_SPEED_CONFIG 0x07
  178. #define USB_DT_INTERFACE_POWER 0x08
  179. /* these are from a minor usb 2.0 revision (ECN) */
  180. #define USB_DT_OTG 0x09
  181. #define USB_DT_DEBUG 0x0a
  182. #define USB_DT_INTERFACE_ASSOCIATION 0x0b
  183. /* these are from the Wireless USB spec */
  184. #define USB_DT_SECURITY 0x0c
  185. #define USB_DT_KEY 0x0d
  186. #define USB_DT_ENCRYPTION_TYPE 0x0e
  187. #define USB_DT_BOS 0x0f
  188. #define USB_DT_DEVICE_CAPABILITY 0x10
  189. #define USB_DT_WIRELESS_ENDPOINT_COMP 0x11
  190. #define USB_DT_WIRE_ADAPTER 0x21
  191. #define USB_DT_RPIPE 0x22
  192. #define USB_DT_CS_RADIO_CONTROL 0x23
  193. /* From the T10 UAS specification */
  194. #define USB_DT_PIPE_USAGE 0x24
  195. /* From the USB 3.0 spec */
  196. #define USB_DT_SS_ENDPOINT_COMP 0x30
  197. /* From HID 1.11 spec */
  198. #define USB_DT_HID_REPORT 0x22
  199. /* Conventional codes for class-specific descriptors. The convention is
  200. * defined in the USB "Common Class" Spec (3.11). Individual class specs
  201. * are authoritative for their usage, not the "common class" writeup.
  202. */
  203. #define USB_DT_CS_DEVICE (USB_TYPE_CLASS | USB_DT_DEVICE)
  204. #define USB_DT_CS_CONFIG (USB_TYPE_CLASS | USB_DT_CONFIG)
  205. #define USB_DT_CS_STRING (USB_TYPE_CLASS | USB_DT_STRING)
  206. #define USB_DT_CS_INTERFACE (USB_TYPE_CLASS | USB_DT_INTERFACE)
  207. #define USB_DT_CS_ENDPOINT (USB_TYPE_CLASS | USB_DT_ENDPOINT)
  208. /* All standard descriptors have these 2 fields at the beginning */
  209. struct usb_descriptor_header {
  210. u8 bLength;
  211. u8 bDescriptorType;
  212. } __attribute__ ((packed));
  213. /*-------------------------------------------------------------------------*/
  214. /* USB_DT_DEVICE: Device descriptor */
  215. struct usb_device_descriptor {
  216. u8 bLength;
  217. u8 bDescriptorType;
  218. u16 bcdUSB;
  219. u8 bDeviceClass;
  220. u8 bDeviceSubClass;
  221. u8 bDeviceProtocol;
  222. u8 bMaxPacketSize0;
  223. u16 idVendor;
  224. u16 idProduct;
  225. u16 bcdDevice;
  226. u8 iManufacturer;
  227. u8 iProduct;
  228. u8 iSerialNumber;
  229. u8 bNumConfigurations;
  230. } __attribute__ ((packed));
  231. #define USB_DT_DEVICE_SIZE 18
  232. /*
  233. * Device and/or Interface Class codes
  234. * as found in bDeviceClass or bInterfaceClass
  235. * and defined by www.usb.org documents
  236. */
  237. #define USB_CLASS_PER_INTERFACE 0x00 /* for DeviceClass */
  238. #define USB_CLASS_AUDIO 0x01
  239. #define USB_CLASS_COMM 0x02
  240. #define USB_CLASS_HID 0x03
  241. #define USB_CLASS_PHYSICAL 0x05
  242. #define USB_CLASS_STILL_IMAGE 0x06
  243. #define USB_CLASS_PRINTER 0x07
  244. #define USB_CLASS_MASS_STORAGE 0x08
  245. #define USB_CLASS_HUB 0x09
  246. #define USB_CLASS_CDC_DATA 0x0a
  247. #define USB_CLASS_CSCID 0x0b /* chip+ smart card */
  248. #define USB_CLASS_CONTENT_SEC 0x0d /* content security */
  249. #define USB_CLASS_VIDEO 0x0e
  250. #define USB_CLASS_BILLBOARD 0x11
  251. #define USB_CLASS_WIRELESS_CONTROLLER 0xe0
  252. #define USB_CLASS_MISC 0xef
  253. #define USB_CLASS_APP_SPEC 0xfe
  254. #define USB_CLASS_VENDOR_SPEC 0xff
  255. #define USB_SUBCLASS_VENDOR_SPEC 0xff
  256. /*-------------------------------------------------------------------------*/
  257. /* USB_DT_CONFIG: Configuration descriptor information.
  258. *
  259. * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the
  260. * descriptor type is different. Highspeed-capable devices can look
  261. * different depending on what speed they're currently running. Only
  262. * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG
  263. * descriptors.
  264. */
  265. struct usb_config_descriptor {
  266. u8 bLength;
  267. u8 bDescriptorType;
  268. u16 wTotalLength;
  269. u8 bNumInterfaces;
  270. u8 bConfigurationValue;
  271. u8 iConfiguration;
  272. u8 bmAttributes;
  273. u8 bMaxPower;
  274. } __attribute__ ((packed));
  275. #define USB_DT_CONFIG_SIZE 9
  276. /* from config descriptor bmAttributes */
  277. #define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */
  278. #define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */
  279. #define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */
  280. #define USB_CONFIG_ATT_BATTERY (1 << 4) /* battery powered */
  281. /*-------------------------------------------------------------------------*/
  282. /* USB_DT_STRING: String descriptor */
  283. struct usb_string_descriptor {
  284. u8 bLength;
  285. u8 bDescriptorType;
  286. u16 wData[1]; /* UTF-16LE encoded */
  287. };
  288. /* note that "string" zero is special, it holds language codes that
  289. * the device supports, not Unicode characters.
  290. */
  291. /*-------------------------------------------------------------------------*/
  292. /* USB_DT_INTERFACE: Interface descriptor */
  293. struct usb_interface_descriptor {
  294. u8 bLength;
  295. u8 bDescriptorType;
  296. u8 bInterfaceNumber;
  297. u8 bAlternateSetting;
  298. u8 bNumEndpoints;
  299. u8 bInterfaceClass;
  300. u8 bInterfaceSubClass;
  301. u8 bInterfaceProtocol;
  302. u8 iInterface;
  303. } __attribute__ ((packed));
  304. #define USB_DT_INTERFACE_SIZE 9
  305. /*-------------------------------------------------------------------------*/
  306. /* USB_DT_ENDPOINT: Endpoint descriptor */
  307. struct usb_endpoint_descriptor {
  308. u8 bLength;
  309. u8 bDescriptorType;
  310. u8 bEndpointAddress;
  311. u8 bmAttributes;
  312. u16 wMaxPacketSize;
  313. u8 bInterval;
  314. /* NOTE: these two are _only_ in audio endpoints. */
  315. /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
  316. u8 bRefresh;
  317. u8 bSynchAddress;
  318. } __attribute__ ((packed));
  319. #define USB_DT_ENDPOINT_SIZE 7
  320. #define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */
  321. /* Used to access common fields */
  322. struct usb_generic_descriptor {
  323. u8 bLength;
  324. u8 bDescriptorType;
  325. };
  326. struct usb_class_hid_descriptor {
  327. u8 bLength;
  328. u8 bDescriptorType;
  329. u16 bcdCDC;
  330. u8 bCountryCode;
  331. u8 bNumDescriptors; /* 0x01 */
  332. u8 bDescriptorType0;
  333. u16 wDescriptorLength0;
  334. /* optional descriptors are not supported. */
  335. } __attribute__ ((packed));;
  336. struct usb_class_report_descriptor {
  337. u8 bLength; /* dummy */
  338. u8 bDescriptorType;
  339. u16 wLength;
  340. u8 bData[0];
  341. } __attribute__ ((packed));;
  342. /*
  343. * Endpoints
  344. */
  345. #define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */
  346. #define USB_ENDPOINT_DIR_MASK 0x80
  347. #define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */
  348. #define USB_ENDPOINT_XFER_CONTROL 0
  349. #define USB_ENDPOINT_XFER_ISOC 1
  350. #define USB_ENDPOINT_XFER_BULK 2
  351. #define USB_ENDPOINT_XFER_INT 3
  352. #define USB_ENDPOINT_MAX_ADJUSTABLE 0x80
  353. #define USB_ENDPOINT_MAXP_MASK 0x07ff
  354. #define USB_EP_MAXP_MULT_SHIFT 11
  355. #define USB_EP_MAXP_MULT_MASK (3 << USB_EP_MAXP_MULT_SHIFT)
  356. #define USB_EP_MAXP_MULT(m) (((m) & USB_EP_MAXP_MULT_MASK) >> USB_EP_MAXP_MULT_SHIFT)
  357. /* The USB 3.0 spec redefines bits 5:4 of bmAttributes as interrupt ep type. */
  358. #define USB_ENDPOINT_INTRTYPE 0x30
  359. #define USB_ENDPOINT_INTR_PERIODIC (0 << 4)
  360. #define USB_ENDPOINT_INTR_NOTIFICATION (1 << 4)
  361. #define USB_ENDPOINT_SYNCTYPE 0x0c
  362. #define USB_ENDPOINT_SYNC_NONE (0 << 2)
  363. #define USB_ENDPOINT_SYNC_ASYNC (1 << 2)
  364. #define USB_ENDPOINT_SYNC_ADAPTIVE (2 << 2)
  365. #define USB_ENDPOINT_SYNC_SYNC (3 << 2)
  366. #define USB_ENDPOINT_USAGE_MASK 0x30
  367. #define USB_ENDPOINT_USAGE_DATA 0x00
  368. #define USB_ENDPOINT_USAGE_FEEDBACK 0x10
  369. #define USB_ENDPOINT_USAGE_IMPLICIT_FB 0x20 /* Implicit feedback Data endpoint */
  370. /*-------------------------------------------------------------------------*/
  371. /**
  372. * usb_endpoint_num - get the endpoint's number
  373. * @epd: endpoint to be checked
  374. *
  375. * Returns @epd's number: 0 to 15.
  376. */
  377. static inline int usb_endpoint_num(const struct usb_endpoint_descriptor *epd)
  378. {
  379. return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
  380. }
  381. /**
  382. * usb_endpoint_type - get the endpoint's transfer type
  383. * @epd: endpoint to be checked
  384. *
  385. * Returns one of USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT} according
  386. * to @epd's transfer type.
  387. */
  388. static inline int usb_endpoint_type(const struct usb_endpoint_descriptor *epd)
  389. {
  390. return epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
  391. }
  392. /**
  393. * usb_endpoint_dir_in - check if the endpoint has IN direction
  394. * @epd: endpoint to be checked
  395. *
  396. * Returns true if the endpoint is of type IN, otherwise it returns false.
  397. */
  398. static inline int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd)
  399. {
  400. return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN);
  401. }
  402. /**
  403. * usb_endpoint_dir_out - check if the endpoint has OUT direction
  404. * @epd: endpoint to be checked
  405. *
  406. * Returns true if the endpoint is of type OUT, otherwise it returns false.
  407. */
  408. static inline int usb_endpoint_dir_out(
  409. const struct usb_endpoint_descriptor *epd)
  410. {
  411. return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT);
  412. }
  413. /**
  414. * usb_endpoint_xfer_bulk - check if the endpoint has bulk transfer type
  415. * @epd: endpoint to be checked
  416. *
  417. * Returns true if the endpoint is of type bulk, otherwise it returns false.
  418. */
  419. static inline int usb_endpoint_xfer_bulk(
  420. const struct usb_endpoint_descriptor *epd)
  421. {
  422. return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
  423. USB_ENDPOINT_XFER_BULK);
  424. }
  425. /**
  426. * usb_endpoint_xfer_control - check if the endpoint has control transfer type
  427. * @epd: endpoint to be checked
  428. *
  429. * Returns true if the endpoint is of type control, otherwise it returns false.
  430. */
  431. static inline int usb_endpoint_xfer_control(
  432. const struct usb_endpoint_descriptor *epd)
  433. {
  434. return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
  435. USB_ENDPOINT_XFER_CONTROL);
  436. }
  437. /**
  438. * usb_endpoint_xfer_int - check if the endpoint has interrupt transfer type
  439. * @epd: endpoint to be checked
  440. *
  441. * Returns true if the endpoint is of type interrupt, otherwise it returns
  442. * false.
  443. */
  444. static inline int usb_endpoint_xfer_int(
  445. const struct usb_endpoint_descriptor *epd)
  446. {
  447. return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
  448. USB_ENDPOINT_XFER_INT);
  449. }
  450. /**
  451. * usb_endpoint_xfer_isoc - check if the endpoint has isochronous transfer type
  452. * @epd: endpoint to be checked
  453. *
  454. * Returns true if the endpoint is of type isochronous, otherwise it returns
  455. * false.
  456. */
  457. static inline int usb_endpoint_xfer_isoc(
  458. const struct usb_endpoint_descriptor *epd)
  459. {
  460. return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
  461. USB_ENDPOINT_XFER_ISOC);
  462. }
  463. /**
  464. * usb_endpoint_is_bulk_in - check if the endpoint is bulk IN
  465. * @epd: endpoint to be checked
  466. *
  467. * Returns true if the endpoint has bulk transfer type and IN direction,
  468. * otherwise it returns false.
  469. */
  470. static inline int usb_endpoint_is_bulk_in(
  471. const struct usb_endpoint_descriptor *epd)
  472. {
  473. return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd);
  474. }
  475. /**
  476. * usb_endpoint_is_bulk_out - check if the endpoint is bulk OUT
  477. * @epd: endpoint to be checked
  478. *
  479. * Returns true if the endpoint has bulk transfer type and OUT direction,
  480. * otherwise it returns false.
  481. */
  482. static inline int usb_endpoint_is_bulk_out(
  483. const struct usb_endpoint_descriptor *epd)
  484. {
  485. return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd);
  486. }
  487. /**
  488. * usb_endpoint_is_int_in - check if the endpoint is interrupt IN
  489. * @epd: endpoint to be checked
  490. *
  491. * Returns true if the endpoint has interrupt transfer type and IN direction,
  492. * otherwise it returns false.
  493. */
  494. static inline int usb_endpoint_is_int_in(
  495. const struct usb_endpoint_descriptor *epd)
  496. {
  497. return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd);
  498. }
  499. /**
  500. * usb_endpoint_is_int_out - check if the endpoint is interrupt OUT
  501. * @epd: endpoint to be checked
  502. *
  503. * Returns true if the endpoint has interrupt transfer type and OUT direction,
  504. * otherwise it returns false.
  505. */
  506. static inline int usb_endpoint_is_int_out(
  507. const struct usb_endpoint_descriptor *epd)
  508. {
  509. return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd);
  510. }
  511. /**
  512. * usb_endpoint_is_isoc_in - check if the endpoint is isochronous IN
  513. * @epd: endpoint to be checked
  514. *
  515. * Returns true if the endpoint has isochronous transfer type and IN direction,
  516. * otherwise it returns false.
  517. */
  518. static inline int usb_endpoint_is_isoc_in(
  519. const struct usb_endpoint_descriptor *epd)
  520. {
  521. return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd);
  522. }
  523. /**
  524. * usb_endpoint_is_isoc_out - check if the endpoint is isochronous OUT
  525. * @epd: endpoint to be checked
  526. *
  527. * Returns true if the endpoint has isochronous transfer type and OUT direction,
  528. * otherwise it returns false.
  529. */
  530. static inline int usb_endpoint_is_isoc_out(
  531. const struct usb_endpoint_descriptor *epd)
  532. {
  533. return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd);
  534. }
  535. /**
  536. * usb_endpoint_maxp - get endpoint's max packet size
  537. * @epd: endpoint to be checked
  538. *
  539. * Returns @epd's max packet
  540. */
  541. static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd)
  542. {
  543. return le16_to_cpu(epd->wMaxPacketSize);
  544. }
  545. /**
  546. * usb_endpoint_maxp_mult - get endpoint's transactional opportunities
  547. * @epd: endpoint to be checked
  548. *
  549. * Return @epd's wMaxPacketSize[12:11] + 1
  550. */
  551. static inline int
  552. usb_endpoint_maxp_mult(const struct usb_endpoint_descriptor *epd)
  553. {
  554. int maxp = le16_to_cpu(epd->wMaxPacketSize);
  555. return USB_EP_MAXP_MULT(maxp) + 1;
  556. }
  557. static inline int usb_endpoint_interrupt_type(
  558. const struct usb_endpoint_descriptor *epd)
  559. {
  560. return epd->bmAttributes & USB_ENDPOINT_INTRTYPE;
  561. }
  562. /*-------------------------------------------------------------------------*/
  563. /* USB_DT_SS_ENDPOINT_COMP: SuperSpeed Endpoint Companion descriptor */
  564. struct usb_ss_ep_comp_descriptor {
  565. u8 bLength;
  566. u8 bDescriptorType;
  567. u8 bMaxBurst;
  568. u8 bmAttributes;
  569. u16 wBytesPerInterval;
  570. } __attribute__ ((packed));
  571. #define USB_DT_SS_EP_COMP_SIZE 6
  572. /* Bits 4:0 of bmAttributes if this is a bulk endpoint */
  573. static inline int
  574. usb_ss_max_streams(const struct usb_ss_ep_comp_descriptor *comp)
  575. {
  576. int max_streams;
  577. if (!comp)
  578. return 0;
  579. max_streams = comp->bmAttributes & 0x1f;
  580. if (!max_streams)
  581. return 0;
  582. max_streams = 1 << max_streams;
  583. return max_streams;
  584. }
  585. /* Bits 1:0 of bmAttributes if this is an isoc endpoint */
  586. #define USB_SS_MULT(p) (1 + ((p) & 0x3))
  587. /*-------------------------------------------------------------------------*/
  588. /* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */
  589. struct usb_qualifier_descriptor {
  590. u8 bLength;
  591. u8 bDescriptorType;
  592. u16 bcdUSB;
  593. u8 bDeviceClass;
  594. u8 bDeviceSubClass;
  595. u8 bDeviceProtocol;
  596. u8 bMaxPacketSize0;
  597. u8 bNumConfigurations;
  598. u8 bRESERVED;
  599. } __attribute__ ((packed));
  600. /*-------------------------------------------------------------------------*/
  601. /* USB_DT_OTG (from OTG 1.0a supplement) */
  602. struct usb_otg_descriptor {
  603. u8 bLength;
  604. u8 bDescriptorType;
  605. u8 bmAttributes; /* support for HNP, SRP, etc */
  606. } __attribute__ ((packed));
  607. /* from usb_otg_descriptor.bmAttributes */
  608. #define USB_OTG_SRP (1 << 0)
  609. #define USB_OTG_HNP (1 << 1) /* swap host/device roles */
  610. /*-------------------------------------------------------------------------*/
  611. /* USB_DT_DEBUG: for special highspeed devices, replacing serial console */
  612. struct usb_debug_descriptor {
  613. u8 bLength;
  614. u8 bDescriptorType;
  615. /* bulk endpoints with 8 byte maxpacket */
  616. u8 bDebugInEndpoint;
  617. u8 bDebugOutEndpoint;
  618. } __attribute__((packed));
  619. /*-------------------------------------------------------------------------*/
  620. /* USB_DT_INTERFACE_ASSOCIATION: groups interfaces */
  621. struct usb_interface_assoc_descriptor {
  622. u8 bLength;
  623. u8 bDescriptorType;
  624. u8 bFirstInterface;
  625. u8 bInterfaceCount;
  626. u8 bFunctionClass;
  627. u8 bFunctionSubClass;
  628. u8 bFunctionProtocol;
  629. u8 iFunction;
  630. } __attribute__ ((packed));
  631. /*-------------------------------------------------------------------------*/
  632. /* USB_DT_SECURITY: group of wireless security descriptors, including
  633. * encryption types available for setting up a CC/association.
  634. */
  635. struct usb_security_descriptor {
  636. u8 bLength;
  637. u8 bDescriptorType;
  638. u16 wTotalLength;
  639. u8 bNumEncryptionTypes;
  640. } __attribute__((packed));
  641. /*-------------------------------------------------------------------------*/
  642. /* USB_DT_KEY: used with {GET,SET}_SECURITY_DATA; only public keys
  643. * may be retrieved.
  644. */
  645. struct usb_key_descriptor {
  646. u8 bLength;
  647. u8 bDescriptorType;
  648. u8 tTKID[3];
  649. u8 bReserved;
  650. u8 bKeyData[0];
  651. } __attribute__((packed));
  652. #pragma pack()
  653. /*-------------------------------------------------------------------------*/
  654. /* USB_DT_ENCRYPTION_TYPE: bundled in DT_SECURITY groups */
  655. struct usb_encryption_descriptor {
  656. u8 bLength;
  657. u8 bDescriptorType;
  658. u8 bEncryptionType;
  659. #define USB_ENC_TYPE_UNSECURE 0
  660. #define USB_ENC_TYPE_WIRED 1 /* non-wireless mode */
  661. #define USB_ENC_TYPE_CCM_1 2 /* aes128/cbc session */
  662. #define USB_ENC_TYPE_RSA_1 3 /* rsa3072/sha1 auth */
  663. u8 bEncryptionValue; /* use in SET_ENCRYPTION */
  664. u8 bAuthKeyIndex;
  665. } __attribute__((packed));
  666. #pragma pack()
  667. /*-------------------------------------------------------------------------*/
  668. /* USB_DT_BOS: group of device-level capabilities */
  669. struct usb_bos_descriptor {
  670. u8 bLength;
  671. u8 bDescriptorType;
  672. u16 wTotalLength;
  673. u8 bNumDeviceCaps;
  674. } __attribute__((packed));
  675. #define USB_DT_BOS_SIZE 5
  676. /*-------------------------------------------------------------------------*/
  677. /* USB_DT_DEVICE_CAPABILITY: grouped with BOS */
  678. struct usb_dev_cap_header {
  679. u8 bLength;
  680. u8 bDescriptorType;
  681. u8 bDevCapabilityType;
  682. } __attribute__((packed));
  683. #define USB_CAP_TYPE_WIRELESS_USB 1
  684. struct usb_wireless_cap_descriptor { /* Ultra Wide Band */
  685. u8 bLength;
  686. u8 bDescriptorType;
  687. u8 bDevCapabilityType;
  688. u8 bmAttributes;
  689. #define USB_WIRELESS_P2P_DRD (1 << 1)
  690. #define USB_WIRELESS_BEACON_MASK (3 << 2)
  691. #define USB_WIRELESS_BEACON_SELF (1 << 2)
  692. #define USB_WIRELESS_BEACON_DIRECTED (2 << 2)
  693. #define USB_WIRELESS_BEACON_NONE (3 << 2)
  694. u16 wPHYRates; /* bit rates, Mbps */
  695. #define USB_WIRELESS_PHY_53 (1 << 0) /* always set */
  696. #define USB_WIRELESS_PHY_80 (1 << 1)
  697. #define USB_WIRELESS_PHY_107 (1 << 2) /* always set */
  698. #define USB_WIRELESS_PHY_160 (1 << 3)
  699. #define USB_WIRELESS_PHY_200 (1 << 4) /* always set */
  700. #define USB_WIRELESS_PHY_320 (1 << 5)
  701. #define USB_WIRELESS_PHY_400 (1 << 6)
  702. #define USB_WIRELESS_PHY_480 (1 << 7)
  703. u8 bmTFITXPowerInfo; /* TFI power levels */
  704. u8 bmFFITXPowerInfo; /* FFI power levels */
  705. u16 bmBandGroup;
  706. u8 bReserved;
  707. } __attribute__((packed));
  708. /* USB 2.0 Extension descriptor */
  709. #define USB_CAP_TYPE_EXT 2
  710. struct usb_ext_cap_descriptor { /* Link Power Management */
  711. u8 bLength;
  712. u8 bDescriptorType;
  713. u8 bDevCapabilityType;
  714. le32 bmAttributes;
  715. #define USB_LPM_SUPPORT (1 << 1) /* supports LPM */
  716. #define USB_BESL_SUPPORT (1 << 2) /* supports BESL */
  717. #define USB_BESL_BASELINE_VALID (1 << 3) /* Baseline BESL valid*/
  718. #define USB_BESL_DEEP_VALID (1 << 4) /* Deep BESL valid */
  719. #define USB_GET_BESL_BASELINE(p) (((p) & (0xf << 8)) >> 8)
  720. #define USB_GET_BESL_DEEP(p) (((p) & (0xf << 12)) >> 12)
  721. } __attribute__((packed));
  722. #define USB_DT_USB_EXT_CAP_SIZE 7
  723. /*
  724. * SuperSpeed USB Capability descriptor: Defines the set of SuperSpeed USB
  725. * specific device level capabilities
  726. */
  727. #define USB_SS_CAP_TYPE 3
  728. struct usb_ss_cap_descriptor { /* Link Power Management */
  729. u8 bLength;
  730. u8 bDescriptorType;
  731. u8 bDevCapabilityType;
  732. u8 bmAttributes;
  733. #define USB_LTM_SUPPORT (1 << 1) /* supports LTM */
  734. le16 wSpeedSupported;
  735. #define USB_LOW_SPEED_OPERATION (1) /* Low speed operation */
  736. #define USB_FULL_SPEED_OPERATION (1 << 1) /* Full speed operation */
  737. #define USB_HIGH_SPEED_OPERATION (1 << 2) /* High speed operation */
  738. #define USB_5GBPS_OPERATION (1 << 3) /* Operation at 5Gbps */
  739. u8 bFunctionalitySupport;
  740. u8 bU1devExitLat;
  741. le16 bU2DevExitLat;
  742. } __attribute__((packed));
  743. #define USB_DEFAULT_U1_DEV_EXIT_LAT 0x01 /* Less then 1 microsec */
  744. #define USB_DEFAULT_U2_DEV_EXIT_LAT 0x01F4 /* Less then 500 microsec */
  745. #define USB_DT_USB_SS_CAP_SIZE 10
  746. /*
  747. * Container ID Capability descriptor: Defines the instance unique ID used to
  748. * identify the instance across all operating modes
  749. */
  750. #define CONTAINER_ID_TYPE 4
  751. struct usb_ss_container_id_descriptor {
  752. u8 bLength;
  753. u8 bDescriptorType;
  754. u8 bDevCapabilityType;
  755. u8 bReserved;
  756. u8 ContainerID[16]; /* 128-bit number */
  757. } __attribute__((packed));
  758. #define USB_DT_USB_SS_CONTN_ID_SIZE 20
  759. #define BILLBOARD_CAPABILITY_TYPE 0x0D
  760. struct usb_billboard_capability_descriptor {
  761. u8 bLength;
  762. u8 bDescriptorType;
  763. u8 bDevCapabilityType;
  764. u8 iAddtionalInfoURL;
  765. u8 bNumberOfAlternateModes;
  766. u8 bPreferredAlternateMode;
  767. le16 VCONN_Power;
  768. u8 bmConfigured[32];
  769. le16 bcdVersion;
  770. u8 bAdditionalFailureInfo;
  771. u8 bReserved;
  772. le16 wSVID;
  773. u8 bAlternateMode;
  774. u8 iAlternateModeString;
  775. } __attribute__((packed));
  776. #define USB_DT_USB_BILLBOARD_CAPABILITY_SIZE 48
  777. /*-------------------------------------------------------------------------*/
  778. /* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with
  779. * each endpoint descriptor for a wireless device
  780. */
  781. struct usb_wireless_ep_comp_descriptor {
  782. u8 bLength;
  783. u8 bDescriptorType;
  784. u8 bMaxBurst;
  785. u8 bMaxSequence;
  786. u16 wMaxStreamDelay;
  787. u16 wOverTheAirPacketSize;
  788. u8 bOverTheAirInterval;
  789. u8 bmCompAttributes;
  790. #define USB_ENDPOINT_SWITCH_MASK 0x03 /* in bmCompAttributes */
  791. #define USB_ENDPOINT_SWITCH_NO 0
  792. #define USB_ENDPOINT_SWITCH_SWITCH 1
  793. #define USB_ENDPOINT_SWITCH_SCALE 2
  794. } __attribute__((packed));
  795. /*-------------------------------------------------------------------------*/
  796. /* USB_REQ_SET_HANDSHAKE is a four-way handshake used between a wireless
  797. * host and a device for connection set up, mutual authentication, and
  798. * exchanging short lived session keys. The handshake depends on a CC.
  799. */
  800. struct usb_handshake {
  801. u8 bMessageNumber;
  802. u8 bStatus;
  803. u8 tTKID[3];
  804. u8 bReserved;
  805. u8 CDID[16];
  806. u8 nonce[16];
  807. u8 MIC[8];
  808. } __attribute__((packed));
  809. /*-------------------------------------------------------------------------*/
  810. /* USB_REQ_SET_CONNECTION modifies or revokes a connection context (CC).
  811. * A CC may also be set up using non-wireless secure channels (including
  812. * wired USB!), and some devices may support CCs with multiple hosts.
  813. */
  814. struct usb_connection_context {
  815. u8 CHID[16]; /* persistent host id */
  816. u8 CDID[16]; /* device id (unique w/in host context) */
  817. u8 CK[16]; /* connection key */
  818. } __attribute__((packed));
  819. /*-------------------------------------------------------------------------*/
  820. /* USB 2.0 defines three speeds, here's how Linux identifies them */
  821. enum usb_device_speed {
  822. USB_SPEED_UNKNOWN = 0, /* enumerating */
  823. USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */
  824. USB_SPEED_HIGH, /* usb 2.0 */
  825. USB_SPEED_WIRELESS, /* wireless (usb 2.5) */
  826. USB_SPEED_SUPER, /* usb 3.0 */
  827. };
  828. enum usb_device_state {
  829. /* NOTATTACHED isn't in the USB spec, and this state acts
  830. * the same as ATTACHED ... but it's clearer this way.
  831. */
  832. USB_STATE_NOTATTACHED = 0,
  833. /* chapter 9 and authentication (wireless) device states */
  834. USB_STATE_ATTACHED,
  835. USB_STATE_POWERED, /* wired */
  836. USB_STATE_RECONNECTING, /* auth */
  837. USB_STATE_UNAUTHENTICATED, /* auth */
  838. USB_STATE_DEFAULT, /* limited function */
  839. USB_STATE_ADDRESS,
  840. USB_STATE_CONFIGURED, /* most functions */
  841. USB_STATE_SUSPENDED
  842. /* NOTE: there are actually four different SUSPENDED
  843. * states, returning to POWERED, DEFAULT, ADDRESS, or
  844. * CONFIGURED respectively when SOF tokens flow again.
  845. * At this level there's no difference between L1 and L2
  846. * suspend states. (L2 being original USB 1.1 suspend.)
  847. */
  848. };
  849. enum usb3_link_state {
  850. USB3_LPM_U0 = 0,
  851. USB3_LPM_U1,
  852. USB3_LPM_U2,
  853. USB3_LPM_U3
  854. };
  855. /*
  856. * A U1 timeout of 0x0 means the parent hub will reject any transitions to U1.
  857. * 0xff means the parent hub will accept transitions to U1, but will not
  858. * initiate a transition.
  859. *
  860. * A U1 timeout of 0x1 to 0x7F also causes the hub to initiate a transition to
  861. * U1 after that many microseconds. Timeouts of 0x80 to 0xFE are reserved
  862. * values.
  863. *
  864. * A U2 timeout of 0x0 means the parent hub will reject any transitions to U2.
  865. * 0xff means the parent hub will accept transitions to U2, but will not
  866. * initiate a transition.
  867. *
  868. * A U2 timeout of 0x1 to 0xFE also causes the hub to initiate a transition to
  869. * U2 after N*256 microseconds. Therefore a U2 timeout value of 0x1 means a U2
  870. * idle timer of 256 microseconds, 0x2 means 512 microseconds, 0xFE means
  871. * 65.024ms.
  872. */
  873. #define USB3_LPM_DISABLED 0x0
  874. #define USB3_LPM_U1_MAX_TIMEOUT 0x7F
  875. #define USB3_LPM_U2_MAX_TIMEOUT 0xFE
  876. #define USB3_LPM_DEVICE_INITIATED 0xFF
  877. struct usb_set_sel_req {
  878. u8 u1_sel;
  879. u8 u1_pel;
  880. le16 u2_sel;
  881. le16 u2_pel;
  882. } __attribute__ ((packed));
  883. /*
  884. * The Set System Exit Latency control transfer provides one byte each for
  885. * U1 SEL and U1 PEL, so the max exit latency is 0xFF. U2 SEL and U2 PEL each
  886. * are two bytes long.
  887. */
  888. #define USB3_LPM_MAX_U1_SEL_PEL 0xFF
  889. #define USB3_LPM_MAX_U2_SEL_PEL 0xFFFF
  890. /*-------------------------------------------------------------------------*/
  891. /*
  892. * As per USB compliance update, a device that is actively drawing
  893. * more than 100mA from USB must report itself as bus-powered in
  894. * the GetStatus(DEVICE) call.
  895. * http://compliance.usb.org/index.asp?UpdateFile=Electrical&Format=Standard#34
  896. */
  897. #define USB_SELF_POWER_VBUS_MAX_DRAW 100
  898. /**
  899. * struct usb_string - wraps a C string and its USB id
  900. * @id:the (nonzero) ID for this string
  901. * @s:the string, in UTF-8 encoding
  902. *
  903. * If you're using usb_gadget_get_string(), use this to wrap a string
  904. * together with its ID.
  905. */
  906. struct usb_string {
  907. u8 id;
  908. const char *s;
  909. };
  910. #endif