无法检测到 USB3.0 上的 adb 设备

无法检测到 USB3.0 上的 adb 设备

使用 USB2.0 线缆连接设备时,adb 可以正确连接该设备。使用 USB3.0 线缆连接同一设备时,adb 检测不到该设备。

我注意到(使用 LeCroy 分析器)在设置 USB 配置后,相关的(IMO)区别是没有对具有 adb 设备 ID 的字符串描述符的请求。

以下是针对 USB2.0 读取但未针对 USB3.0 读取的描述符

Transfer(10) H(S) Control(GET) ADDR(16) ENDP(0) 
_______| bRequest(GET_DESCRIPTOR) wValue(STRING type, Index 3) 
_______| wIndex(Language ID 0x0409) Descriptors(e736c55eec1a) 
_______| Time Stamp(5 . 923 353 566) 

此外,/tmp/adb.log 显示

find_usb_device():endpoints not found

是否存在我不知道的限制?

答案1

ADB 服务器代码 ( system/core/adb/usb_linux.c) 未查找端点伴随描述符。它假设批量输入和批量输出端点描述符遵循接口描述符。请参阅 diff 以进行修复

diff --git a/adb/usb_linux.c b/adb/usb_linux.c
index 7bf2057..52e6412 100644
--- a/adb/usb_linux.c
+++ b/adb/usb_linux.c
@@ -160,6 +160,7 @@ static void find_usb_device(const char *base,
             unsigned zero_mask = 0;
             unsigned vid, pid;
             size_t desclength;
+           int is_ss = 0; /* boolean */

             if(badname(de->d_name)) continue;
             snprintf(devname, sizeof devname, "%s/%s", busname, de->d_name);
@@ -195,6 +196,10 @@ static void find_usb_device(const char *base,
             vid = device->idVendor;
             pid = device->idProduct;
             DBGX("[ %s is V:%04x P:%04x ]\n", devname, vid, pid);
+           if (device->bcdUSB == 0x0300) {
+                    D("super speed device found: V:%04x P:%04x\n", vid, pid);
+                   is_ss = 1;
+           }

                 // should have config descriptor next
             config = (struct usb_config_descriptor *)bufptr;
@@ -237,6 +242,8 @@ static void find_usb_device(const char *base,
                             // looks like ADB...
                         ep1 = (struct usb_endpoint_descriptor *)bufptr;
                         bufptr += USB_DT_ENDPOINT_SIZE;
+                       if (is_ss)
+                               bufptr += 6; /* USB_DT_SS_EP_COMP_SIZE */
                         ep2 = (struct usb_endpoint_descriptor *)bufptr;
                         bufptr += USB_DT_ENDPOINT_SIZE;

相关内容