1*4882a593SmuzhiyunFrom 5701bed80c75ee2aabdbc896bd6e73157517e006 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Lin Huang <hl@rock-chips.com> 3*4882a593SmuzhiyunDate: Fri, 26 Apr 2019 17:33:18 +0800 4*4882a593SmuzhiyunSubject: [PATCH 13/20] adbd: Support usb3.0 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunSigned-off-by: Lin Huang <hl@rock-chips.com> 7*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 8*4882a593Smuzhiyun--- 9*4882a593Smuzhiyun core/adbd/functionfs.h | 12 +++++-- 10*4882a593Smuzhiyun core/adbd/usb_linux_client.c | 63 ++++++++++++++++++++++++++++++++---- 11*4882a593Smuzhiyun 2 files changed, 66 insertions(+), 9 deletions(-) 12*4882a593Smuzhiyun 13*4882a593Smuzhiyundiff --git a/core/adbd/functionfs.h b/core/adbd/functionfs.h 14*4882a593Smuzhiyunindex 53a3f30..42993f2 100644 15*4882a593Smuzhiyun--- a/core/adbd/functionfs.h 16*4882a593Smuzhiyun+++ b/core/adbd/functionfs.h 17*4882a593Smuzhiyun@@ -10,10 +10,18 @@ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun enum { 20*4882a593Smuzhiyun FUNCTIONFS_DESCRIPTORS_MAGIC = 1, 21*4882a593Smuzhiyun- FUNCTIONFS_STRINGS_MAGIC = 2 22*4882a593Smuzhiyun+ FUNCTIONFS_STRINGS_MAGIC = 2, 23*4882a593Smuzhiyun+ FUNCTIONFS_DESCRIPTORS_MAGIC_V2 = 3, 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun- 27*4882a593Smuzhiyun+enum functionfs_flags { 28*4882a593Smuzhiyun+ FUNCTIONFS_HAS_FS_DESC = 1, 29*4882a593Smuzhiyun+ FUNCTIONFS_HAS_HS_DESC = 2, 30*4882a593Smuzhiyun+ FUNCTIONFS_HAS_SS_DESC = 4, 31*4882a593Smuzhiyun+ FUNCTIONFS_HAS_MS_OS_DESC = 8, 32*4882a593Smuzhiyun+ FUNCTIONFS_VIRTUAL_ADDR = 16, 33*4882a593Smuzhiyun+ FUNCTIONFS_EVENTFD = 32, 34*4882a593Smuzhiyun+}; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* Descriptor of an non-audio endpoint */ 37*4882a593Smuzhiyun struct usb_endpoint_descriptor_no_audio { 38*4882a593Smuzhiyundiff --git a/core/adbd/usb_linux_client.c b/core/adbd/usb_linux_client.c 39*4882a593Smuzhiyunindex 0e4d200..a437ad1 100644 40*4882a593Smuzhiyun--- a/core/adbd/usb_linux_client.c 41*4882a593Smuzhiyun+++ b/core/adbd/usb_linux_client.c 42*4882a593Smuzhiyun@@ -33,6 +33,7 @@ 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define MAX_PACKET_SIZE_FS 64 45*4882a593Smuzhiyun #define MAX_PACKET_SIZE_HS 512 46*4882a593Smuzhiyun+#define MAX_PACKET_SIZE_SS 1024 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #if __BYTE_ORDER == __LITTLE_ENDIAN 49*4882a593Smuzhiyun # define cpu_to_le16(x) (x) 50*4882a593Smuzhiyun@@ -63,19 +64,33 @@ struct usb_handle 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun static const struct { 54*4882a593Smuzhiyun- struct usb_functionfs_descs_head header; 55*4882a593Smuzhiyun+ __le32 magic; 56*4882a593Smuzhiyun+ __le32 length; 57*4882a593Smuzhiyun+ __le32 flags; 58*4882a593Smuzhiyun+ __le32 fs_count; 59*4882a593Smuzhiyun+ __le32 hs_count; 60*4882a593Smuzhiyun+ __le32 ss_count; 61*4882a593Smuzhiyun struct { 62*4882a593Smuzhiyun struct usb_interface_descriptor intf; 63*4882a593Smuzhiyun struct usb_endpoint_descriptor_no_audio source; 64*4882a593Smuzhiyun struct usb_endpoint_descriptor_no_audio sink; 65*4882a593Smuzhiyun } __attribute__((packed)) fs_descs, hs_descs; 66*4882a593Smuzhiyun+ struct { 67*4882a593Smuzhiyun+ struct usb_interface_descriptor intf; 68*4882a593Smuzhiyun+ struct usb_endpoint_descriptor_no_audio source; 69*4882a593Smuzhiyun+ struct usb_ss_ep_comp_descriptor source_comp; 70*4882a593Smuzhiyun+ struct usb_endpoint_descriptor_no_audio sink; 71*4882a593Smuzhiyun+ struct usb_ss_ep_comp_descriptor sink_comp; 72*4882a593Smuzhiyun+ } __attribute__((packed)) ss_descs; 73*4882a593Smuzhiyun } __attribute__((packed)) descriptors = { 74*4882a593Smuzhiyun- .header = { 75*4882a593Smuzhiyun- .magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC), 76*4882a593Smuzhiyun- .length = cpu_to_le32(sizeof(descriptors)), 77*4882a593Smuzhiyun- .fs_count = 3, 78*4882a593Smuzhiyun- .hs_count = 3, 79*4882a593Smuzhiyun- }, 80*4882a593Smuzhiyun+ .magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2), 81*4882a593Smuzhiyun+ .length = cpu_to_le32(sizeof(descriptors)), 82*4882a593Smuzhiyun+ .flags = cpu_to_le32(FUNCTIONFS_HAS_FS_DESC | 83*4882a593Smuzhiyun+ FUNCTIONFS_HAS_HS_DESC | 84*4882a593Smuzhiyun+ FUNCTIONFS_HAS_SS_DESC), 85*4882a593Smuzhiyun+ .fs_count = 3, 86*4882a593Smuzhiyun+ .hs_count = 3, 87*4882a593Smuzhiyun+ .ss_count = 5, 88*4882a593Smuzhiyun .fs_descs = { 89*4882a593Smuzhiyun .intf = { 90*4882a593Smuzhiyun .bLength = sizeof(descriptors.fs_descs.intf), 91*4882a593Smuzhiyun@@ -128,6 +143,40 @@ static const struct { 92*4882a593Smuzhiyun .wMaxPacketSize = MAX_PACKET_SIZE_HS, 93*4882a593Smuzhiyun }, 94*4882a593Smuzhiyun }, 95*4882a593Smuzhiyun+ .ss_descs = { 96*4882a593Smuzhiyun+ .intf = { 97*4882a593Smuzhiyun+ .bLength = sizeof(descriptors.ss_descs.intf), 98*4882a593Smuzhiyun+ .bDescriptorType = USB_DT_INTERFACE, 99*4882a593Smuzhiyun+ .bInterfaceNumber = 0, 100*4882a593Smuzhiyun+ .bNumEndpoints = 2, 101*4882a593Smuzhiyun+ .bInterfaceClass = ADB_CLASS, 102*4882a593Smuzhiyun+ .bInterfaceSubClass = ADB_SUBCLASS, 103*4882a593Smuzhiyun+ .bInterfaceProtocol = ADB_PROTOCOL, 104*4882a593Smuzhiyun+ .iInterface = 1, /* first string from the provided table */ 105*4882a593Smuzhiyun+ }, 106*4882a593Smuzhiyun+ .source = { 107*4882a593Smuzhiyun+ .bLength = sizeof(descriptors.ss_descs.source), 108*4882a593Smuzhiyun+ .bDescriptorType = USB_DT_ENDPOINT, 109*4882a593Smuzhiyun+ .bEndpointAddress = 1 | USB_DIR_OUT, 110*4882a593Smuzhiyun+ .bmAttributes = USB_ENDPOINT_XFER_BULK, 111*4882a593Smuzhiyun+ .wMaxPacketSize = MAX_PACKET_SIZE_SS, 112*4882a593Smuzhiyun+ }, 113*4882a593Smuzhiyun+ .source_comp = { 114*4882a593Smuzhiyun+ .bLength = sizeof(descriptors.ss_descs.source_comp), 115*4882a593Smuzhiyun+ .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 116*4882a593Smuzhiyun+ }, 117*4882a593Smuzhiyun+ .sink = { 118*4882a593Smuzhiyun+ .bLength = sizeof(descriptors.ss_descs.sink), 119*4882a593Smuzhiyun+ .bDescriptorType = USB_DT_ENDPOINT, 120*4882a593Smuzhiyun+ .bEndpointAddress = 2 | USB_DIR_IN, 121*4882a593Smuzhiyun+ .bmAttributes = USB_ENDPOINT_XFER_BULK, 122*4882a593Smuzhiyun+ .wMaxPacketSize = MAX_PACKET_SIZE_SS, 123*4882a593Smuzhiyun+ }, 124*4882a593Smuzhiyun+ .sink_comp = { 125*4882a593Smuzhiyun+ .bLength = sizeof(descriptors.ss_descs.sink_comp), 126*4882a593Smuzhiyun+ .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 127*4882a593Smuzhiyun+ }, 128*4882a593Smuzhiyun+ }, 129*4882a593Smuzhiyun }; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define STR_INTERFACE_ "ADB Interface" 132*4882a593Smuzhiyun-- 133*4882a593Smuzhiyun2.20.1 134*4882a593Smuzhiyun 135