Não é possível detectar um dispositivo adb no USB3.0 [fechado]

3

Ao conectar um dispositivo usando um cabo USB2.0, o adb se conecta ao dispositivo corretamente. Ao conectar o mesmo dispositivo usando um cabo USB3.0, o adb não detecta o dispositivo.

O que eu noto (usando um analisador LeCroy) é que depois de definir a configuração USB, a diferença relevante (IMO) é que não há solicitação para o descritor de string que possui o ID de dispositivo adb.

Abaixo está o descritor lido para USB2.0, mas não para 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) 

Além disso, o /tmp/adb.log mostra

find_usb_device():endpoints not found

Existe alguma limitação que eu desconheço?

    
por levengli 24.06.2014 / 17:18

1 resposta

2

O código do servidor ADB ( system/core/adb/usb_linux.c ) não está procurando por descritores complementares de endpoint. Ele pressupõe que os descritores de terminal em massa e em massa sigam o descritor de interface. Veja diff para fixação

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;
    
por levengli 30.06.2014 / 12:50

Tags