1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33#ifndef __LINUX_USB_CH9_H
34#define __LINUX_USB_CH9_H
35
36#include <linux/types.h>
37
38
39
40
41
42
43
44
45
46
47
48#define USB_DIR_OUT 0
49#define USB_DIR_IN 0x80
50
51
52
53
54#define USB_TYPE_MASK (0x03 << 5)
55#define USB_TYPE_STANDARD (0x00 << 5)
56#define USB_TYPE_CLASS (0x01 << 5)
57#define USB_TYPE_VENDOR (0x02 << 5)
58#define USB_TYPE_RESERVED (0x03 << 5)
59
60
61
62
63#define USB_RECIP_MASK 0x1f
64#define USB_RECIP_DEVICE 0x00
65#define USB_RECIP_INTERFACE 0x01
66#define USB_RECIP_ENDPOINT 0x02
67#define USB_RECIP_OTHER 0x03
68
69#define USB_RECIP_PORT 0x04
70#define USB_RECIP_RPIPE 0x05
71
72
73
74
75
76
77
78
79#define USB_REQ_GET_STATUS 0x00
80#define USB_REQ_CLEAR_FEATURE 0x01
81#define USB_REQ_SET_FEATURE 0x03
82#define USB_REQ_SET_ADDRESS 0x05
83#define USB_REQ_GET_DESCRIPTOR 0x06
84#define USB_REQ_SET_DESCRIPTOR 0x07
85#define USB_REQ_GET_CONFIGURATION 0x08
86#define USB_REQ_SET_CONFIGURATION 0x09
87#define USB_REQ_GET_INTERFACE 0x0A
88#define USB_REQ_SET_INTERFACE 0x0B
89#define USB_REQ_SYNCH_FRAME 0x0C
90
91#define USB_REQ_SET_ENCRYPTION 0x0D
92#define USB_REQ_GET_ENCRYPTION 0x0E
93#define USB_REQ_RPIPE_ABORT 0x0E
94#define USB_REQ_SET_HANDSHAKE 0x0F
95#define USB_REQ_RPIPE_RESET 0x0F
96#define USB_REQ_GET_HANDSHAKE 0x10
97#define USB_REQ_SET_CONNECTION 0x11
98#define USB_REQ_SET_SECURITY_DATA 0x12
99#define USB_REQ_GET_SECURITY_DATA 0x13
100#define USB_REQ_SET_WUSB_DATA 0x14
101#define USB_REQ_LOOPBACK_DATA_WRITE 0x15
102#define USB_REQ_LOOPBACK_DATA_READ 0x16
103#define USB_REQ_SET_INTERFACE_DS 0x17
104
105
106
107
108
109
110
111
112
113
114
115
116#define USB_DEVICE_SELF_POWERED 0
117#define USB_DEVICE_REMOTE_WAKEUP 1
118#define USB_DEVICE_TEST_MODE 2
119#define USB_DEVICE_BATTERY 2
120#define USB_DEVICE_B_HNP_ENABLE 3
121#define USB_DEVICE_WUSB_DEVICE 3
122#define USB_DEVICE_A_HNP_SUPPORT 4
123#define USB_DEVICE_A_ALT_HNP_SUPPORT 5
124#define USB_DEVICE_DEBUG_MODE 6
125
126
127
128
129
130#define TEST_J 1
131#define TEST_K 2
132#define TEST_SE0_NAK 3
133#define TEST_PACKET 4
134#define TEST_FORCE_EN 5
135
136
137
138
139
140#define USB_DEVICE_U1_ENABLE 48
141#define USB_DEVICE_U2_ENABLE 49
142#define USB_DEVICE_LTM_ENABLE 50
143#define USB_INTRF_FUNC_SUSPEND 0
144
145#define USB_INTR_FUNC_SUSPEND_OPT_MASK 0xFF00
146
147#define USB_ENDPOINT_HALT 0
148
149
150#define USB_DEV_STAT_U1_ENABLED 2
151#define USB_DEV_STAT_U2_ENABLED 3
152#define USB_DEV_STAT_LTM_ENABLED 4
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171struct usb_ctrlrequest {
172 __u8 bRequestType;
173 __u8 bRequest;
174 __le16 wValue;
175 __le16 wIndex;
176 __le16 wLength;
177} __attribute__ ((packed));
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197#define USB_DT_DEVICE 0x01
198#define USB_DT_CONFIG 0x02
199#define USB_DT_STRING 0x03
200#define USB_DT_INTERFACE 0x04
201#define USB_DT_ENDPOINT 0x05
202#define USB_DT_DEVICE_QUALIFIER 0x06
203#define USB_DT_OTHER_SPEED_CONFIG 0x07
204#define USB_DT_INTERFACE_POWER 0x08
205
206#define USB_DT_OTG 0x09
207#define USB_DT_DEBUG 0x0a
208#define USB_DT_INTERFACE_ASSOCIATION 0x0b
209
210#define USB_DT_SECURITY 0x0c
211#define USB_DT_KEY 0x0d
212#define USB_DT_ENCRYPTION_TYPE 0x0e
213#define USB_DT_BOS 0x0f
214#define USB_DT_DEVICE_CAPABILITY 0x10
215#define USB_DT_WIRELESS_ENDPOINT_COMP 0x11
216#define USB_DT_WIRE_ADAPTER 0x21
217#define USB_DT_RPIPE 0x22
218#define USB_DT_CS_RADIO_CONTROL 0x23
219
220#define USB_DT_PIPE_USAGE 0x24
221
222#define USB_DT_SS_ENDPOINT_COMP 0x30
223
224
225
226
227
228#define USB_DT_CS_DEVICE (USB_TYPE_CLASS | USB_DT_DEVICE)
229#define USB_DT_CS_CONFIG (USB_TYPE_CLASS | USB_DT_CONFIG)
230#define USB_DT_CS_STRING (USB_TYPE_CLASS | USB_DT_STRING)
231#define USB_DT_CS_INTERFACE (USB_TYPE_CLASS | USB_DT_INTERFACE)
232#define USB_DT_CS_ENDPOINT (USB_TYPE_CLASS | USB_DT_ENDPOINT)
233
234
235struct usb_descriptor_header {
236 __u8 bLength;
237 __u8 bDescriptorType;
238} __attribute__ ((packed));
239
240
241
242
243
244struct usb_device_descriptor {
245 __u8 bLength;
246 __u8 bDescriptorType;
247
248 __le16 bcdUSB;
249 __u8 bDeviceClass;
250 __u8 bDeviceSubClass;
251 __u8 bDeviceProtocol;
252 __u8 bMaxPacketSize0;
253 __le16 idVendor;
254 __le16 idProduct;
255 __le16 bcdDevice;
256 __u8 iManufacturer;
257 __u8 iProduct;
258 __u8 iSerialNumber;
259 __u8 bNumConfigurations;
260} __attribute__ ((packed));
261
262#define USB_DT_DEVICE_SIZE 18
263
264
265
266
267
268
269
270#define USB_CLASS_PER_INTERFACE 0
271#define USB_CLASS_AUDIO 1
272#define USB_CLASS_COMM 2
273#define USB_CLASS_HID 3
274#define USB_CLASS_PHYSICAL 5
275#define USB_CLASS_STILL_IMAGE 6
276#define USB_CLASS_PRINTER 7
277#define USB_CLASS_MASS_STORAGE 8
278#define USB_CLASS_HUB 9
279#define USB_CLASS_CDC_DATA 0x0a
280#define USB_CLASS_CSCID 0x0b
281#define USB_CLASS_CONTENT_SEC 0x0d
282#define USB_CLASS_VIDEO 0x0e
283#define USB_CLASS_WIRELESS_CONTROLLER 0xe0
284#define USB_CLASS_MISC 0xef
285#define USB_CLASS_APP_SPEC 0xfe
286#define USB_CLASS_VENDOR_SPEC 0xff
287
288#define USB_SUBCLASS_VENDOR_SPEC 0xff
289
290
291
292
293
294
295
296
297
298
299
300struct usb_config_descriptor {
301 __u8 bLength;
302 __u8 bDescriptorType;
303
304 __le16 wTotalLength;
305 __u8 bNumInterfaces;
306 __u8 bConfigurationValue;
307 __u8 iConfiguration;
308 __u8 bmAttributes;
309 __u8 bMaxPower;
310} __attribute__ ((packed));
311
312#define USB_DT_CONFIG_SIZE 9
313
314
315#define USB_CONFIG_ATT_ONE (1 << 7)
316#define USB_CONFIG_ATT_SELFPOWER (1 << 6)
317#define USB_CONFIG_ATT_WAKEUP (1 << 5)
318#define USB_CONFIG_ATT_BATTERY (1 << 4)
319
320
321
322
323struct usb_string_descriptor {
324 __u8 bLength;
325 __u8 bDescriptorType;
326
327 __le16 wData[1];
328} __attribute__ ((packed));
329
330
331
332
333
334
335
336
337struct usb_interface_descriptor {
338 __u8 bLength;
339 __u8 bDescriptorType;
340
341 __u8 bInterfaceNumber;
342 __u8 bAlternateSetting;
343 __u8 bNumEndpoints;
344 __u8 bInterfaceClass;
345 __u8 bInterfaceSubClass;
346 __u8 bInterfaceProtocol;
347 __u8 iInterface;
348} __attribute__ ((packed));
349
350#define USB_DT_INTERFACE_SIZE 9
351
352
353
354
355struct usb_endpoint_descriptor {
356 __u8 bLength;
357 __u8 bDescriptorType;
358
359 __u8 bEndpointAddress;
360 __u8 bmAttributes;
361 __le16 wMaxPacketSize;
362 __u8 bInterval;
363
364
365
366 __u8 bRefresh;
367 __u8 bSynchAddress;
368} __attribute__ ((packed));
369
370#define USB_DT_ENDPOINT_SIZE 7
371#define USB_DT_ENDPOINT_AUDIO_SIZE 9
372
373
374
375
376
377#define USB_ENDPOINT_NUMBER_MASK 0x0f
378#define USB_ENDPOINT_DIR_MASK 0x80
379
380#define USB_ENDPOINT_SYNCTYPE 0x0c
381#define USB_ENDPOINT_SYNC_NONE (0 << 2)
382#define USB_ENDPOINT_SYNC_ASYNC (1 << 2)
383#define USB_ENDPOINT_SYNC_ADAPTIVE (2 << 2)
384#define USB_ENDPOINT_SYNC_SYNC (3 << 2)
385
386#define USB_ENDPOINT_XFERTYPE_MASK 0x03
387#define USB_ENDPOINT_XFER_CONTROL 0
388#define USB_ENDPOINT_XFER_ISOC 1
389#define USB_ENDPOINT_XFER_BULK 2
390#define USB_ENDPOINT_XFER_INT 3
391#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80
392
393
394
395
396
397
398
399
400
401static inline int usb_endpoint_num(const struct usb_endpoint_descriptor *epd)
402{
403 return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
404}
405
406
407
408
409
410
411
412
413static inline int usb_endpoint_type(const struct usb_endpoint_descriptor *epd)
414{
415 return epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
416}
417
418
419
420
421
422
423
424static inline int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd)
425{
426 return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN);
427}
428
429
430
431
432
433
434
435static inline int usb_endpoint_dir_out(
436 const struct usb_endpoint_descriptor *epd)
437{
438 return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT);
439}
440
441
442
443
444
445
446
447static inline int usb_endpoint_xfer_bulk(
448 const struct usb_endpoint_descriptor *epd)
449{
450 return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
451 USB_ENDPOINT_XFER_BULK);
452}
453
454
455
456
457
458
459
460static inline int usb_endpoint_xfer_control(
461 const struct usb_endpoint_descriptor *epd)
462{
463 return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
464 USB_ENDPOINT_XFER_CONTROL);
465}
466
467
468
469
470
471
472
473
474static inline int usb_endpoint_xfer_int(
475 const struct usb_endpoint_descriptor *epd)
476{
477 return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
478 USB_ENDPOINT_XFER_INT);
479}
480
481
482
483
484
485
486
487
488static inline int usb_endpoint_xfer_isoc(
489 const struct usb_endpoint_descriptor *epd)
490{
491 return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
492 USB_ENDPOINT_XFER_ISOC);
493}
494
495
496
497
498
499
500
501
502static inline int usb_endpoint_is_bulk_in(
503 const struct usb_endpoint_descriptor *epd)
504{
505 return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd);
506}
507
508
509
510
511
512
513
514
515static inline int usb_endpoint_is_bulk_out(
516 const struct usb_endpoint_descriptor *epd)
517{
518 return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd);
519}
520
521
522
523
524
525
526
527
528static inline int usb_endpoint_is_int_in(
529 const struct usb_endpoint_descriptor *epd)
530{
531 return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd);
532}
533
534
535
536
537
538
539
540
541static inline int usb_endpoint_is_int_out(
542 const struct usb_endpoint_descriptor *epd)
543{
544 return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd);
545}
546
547
548
549
550
551
552
553
554static inline int usb_endpoint_is_isoc_in(
555 const struct usb_endpoint_descriptor *epd)
556{
557 return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd);
558}
559
560
561
562
563
564
565
566
567static inline int usb_endpoint_is_isoc_out(
568 const struct usb_endpoint_descriptor *epd)
569{
570 return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd);
571}
572
573
574
575
576struct usb_ss_ep_comp_descriptor {
577 __u8 bLength;
578 __u8 bDescriptorType;
579
580 __u8 bMaxBurst;
581 __u8 bmAttributes;
582 __u16 wBytesPerInterval;
583} __attribute__ ((packed));
584
585#define USB_DT_SS_EP_COMP_SIZE 6
586
587#define USB_SS_MAX_STREAMS(p) (1 << (p & 0x1f))
588
589
590
591
592struct usb_qualifier_descriptor {
593 __u8 bLength;
594 __u8 bDescriptorType;
595
596 __le16 bcdUSB;
597 __u8 bDeviceClass;
598 __u8 bDeviceSubClass;
599 __u8 bDeviceProtocol;
600 __u8 bMaxPacketSize0;
601 __u8 bNumConfigurations;
602 __u8 bRESERVED;
603} __attribute__ ((packed));
604
605
606
607
608
609struct usb_otg_descriptor {
610 __u8 bLength;
611 __u8 bDescriptorType;
612
613 __u8 bmAttributes;
614} __attribute__ ((packed));
615
616
617#define USB_OTG_SRP (1 << 0)
618#define USB_OTG_HNP (1 << 1)
619
620
621
622
623struct usb_debug_descriptor {
624 __u8 bLength;
625 __u8 bDescriptorType;
626
627
628 __u8 bDebugInEndpoint;
629 __u8 bDebugOutEndpoint;
630} __attribute__((packed));
631
632
633
634
635struct usb_interface_assoc_descriptor {
636 __u8 bLength;
637 __u8 bDescriptorType;
638
639 __u8 bFirstInterface;
640 __u8 bInterfaceCount;
641 __u8 bFunctionClass;
642 __u8 bFunctionSubClass;
643 __u8 bFunctionProtocol;
644 __u8 iFunction;
645} __attribute__ ((packed));
646
647
648
649
650
651
652
653struct usb_security_descriptor {
654 __u8 bLength;
655 __u8 bDescriptorType;
656
657 __le16 wTotalLength;
658 __u8 bNumEncryptionTypes;
659} __attribute__((packed));
660
661
662
663
664
665
666struct usb_key_descriptor {
667 __u8 bLength;
668 __u8 bDescriptorType;
669
670 __u8 tTKID[3];
671 __u8 bReserved;
672 __u8 bKeyData[0];
673} __attribute__((packed));
674
675
676
677
678struct usb_encryption_descriptor {
679 __u8 bLength;
680 __u8 bDescriptorType;
681
682 __u8 bEncryptionType;
683#define USB_ENC_TYPE_UNSECURE 0
684#define USB_ENC_TYPE_WIRED 1
685#define USB_ENC_TYPE_CCM_1 2
686#define USB_ENC_TYPE_RSA_1 3
687 __u8 bEncryptionValue;
688 __u8 bAuthKeyIndex;
689} __attribute__((packed));
690
691
692
693
694
695struct usb_bos_descriptor {
696 __u8 bLength;
697 __u8 bDescriptorType;
698
699 __le16 wTotalLength;
700 __u8 bNumDeviceCaps;
701} __attribute__((packed));
702
703#define USB_DT_BOS_SIZE 5
704
705
706
707struct usb_dev_cap_header {
708 __u8 bLength;
709 __u8 bDescriptorType;
710 __u8 bDevCapabilityType;
711} __attribute__((packed));
712
713#define USB_CAP_TYPE_WIRELESS_USB 1
714
715struct usb_wireless_cap_descriptor {
716 __u8 bLength;
717 __u8 bDescriptorType;
718 __u8 bDevCapabilityType;
719
720 __u8 bmAttributes;
721#define USB_WIRELESS_P2P_DRD (1 << 1)
722#define USB_WIRELESS_BEACON_MASK (3 << 2)
723#define USB_WIRELESS_BEACON_SELF (1 << 2)
724#define USB_WIRELESS_BEACON_DIRECTED (2 << 2)
725#define USB_WIRELESS_BEACON_NONE (3 << 2)
726 __le16 wPHYRates;
727#define USB_WIRELESS_PHY_53 (1 << 0)
728#define USB_WIRELESS_PHY_80 (1 << 1)
729#define USB_WIRELESS_PHY_107 (1 << 2)
730#define USB_WIRELESS_PHY_160 (1 << 3)
731#define USB_WIRELESS_PHY_200 (1 << 4)
732#define USB_WIRELESS_PHY_320 (1 << 5)
733#define USB_WIRELESS_PHY_400 (1 << 6)
734#define USB_WIRELESS_PHY_480 (1 << 7)
735 __u8 bmTFITXPowerInfo;
736 __u8 bmFFITXPowerInfo;
737 __le16 bmBandGroup;
738 __u8 bReserved;
739} __attribute__((packed));
740
741
742#define USB_CAP_TYPE_EXT 2
743
744struct usb_ext_cap_descriptor {
745 __u8 bLength;
746 __u8 bDescriptorType;
747 __u8 bDevCapabilityType;
748 __le32 bmAttributes;
749#define USB_LPM_SUPPORT (1 << 1)
750} __attribute__((packed));
751
752#define USB_DT_USB_EXT_CAP_SIZE 7
753
754
755
756
757
758#define USB_SS_CAP_TYPE 3
759struct usb_ss_cap_descriptor {
760 __u8 bLength;
761 __u8 bDescriptorType;
762 __u8 bDevCapabilityType;
763 __u8 bmAttributes;
764#define USB_LTM_SUPPORT (1 << 1)
765 __le16 wSpeedSupported;
766#define USB_LOW_SPEED_OPERATION (1)
767#define USB_FULL_SPEED_OPERATION (1 << 1)
768#define USB_HIGH_SPEED_OPERATION (1 << 2)
769#define USB_5GBPS_OPERATION (1 << 3)
770 __u8 bFunctionalitySupport;
771 __u8 bU1devExitLat;
772 __le16 bU2DevExitLat;
773} __attribute__((packed));
774
775#define USB_DT_USB_SS_CAP_SIZE 10
776
777
778
779
780
781#define CONTAINER_ID_TYPE 4
782struct usb_ss_container_id_descriptor {
783 __u8 bLength;
784 __u8 bDescriptorType;
785 __u8 bDevCapabilityType;
786 __u8 bReserved;
787 __u8 ContainerID[16];
788} __attribute__((packed));
789
790#define USB_DT_USB_SS_CONTN_ID_SIZE 20
791
792
793
794
795
796struct usb_wireless_ep_comp_descriptor {
797 __u8 bLength;
798 __u8 bDescriptorType;
799
800 __u8 bMaxBurst;
801 __u8 bMaxSequence;
802 __le16 wMaxStreamDelay;
803 __le16 wOverTheAirPacketSize;
804 __u8 bOverTheAirInterval;
805 __u8 bmCompAttributes;
806#define USB_ENDPOINT_SWITCH_MASK 0x03
807#define USB_ENDPOINT_SWITCH_NO 0
808#define USB_ENDPOINT_SWITCH_SWITCH 1
809#define USB_ENDPOINT_SWITCH_SCALE 2
810} __attribute__((packed));
811
812
813
814
815
816
817
818struct usb_handshake {
819 __u8 bMessageNumber;
820 __u8 bStatus;
821 __u8 tTKID[3];
822 __u8 bReserved;
823 __u8 CDID[16];
824 __u8 nonce[16];
825 __u8 MIC[8];
826} __attribute__((packed));
827
828
829
830
831
832
833
834struct usb_connection_context {
835 __u8 CHID[16];
836 __u8 CDID[16];
837 __u8 CK[16];
838} __attribute__((packed));
839
840
841
842
843
844enum usb_device_speed {
845 USB_SPEED_UNKNOWN = 0,
846 USB_SPEED_LOW, USB_SPEED_FULL,
847 USB_SPEED_HIGH,
848 USB_SPEED_WIRELESS,
849 USB_SPEED_SUPER,
850};
851
852enum usb_device_state {
853
854
855
856 USB_STATE_NOTATTACHED = 0,
857
858
859 USB_STATE_ATTACHED,
860 USB_STATE_POWERED,
861 USB_STATE_RECONNECTING,
862 USB_STATE_UNAUTHENTICATED,
863 USB_STATE_DEFAULT,
864 USB_STATE_ADDRESS,
865 USB_STATE_CONFIGURED,
866
867 USB_STATE_SUSPENDED
868
869
870
871
872
873
874
875};
876
877
878
879
880
881
882
883
884
885#define USB_SELF_POWER_VBUS_MAX_DRAW 100
886
887#endif
888