使用 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;