web-dev-qa-db-fra.com

Impossible de détecter un périphérique adb sur USB3.0

Lors de la connexion d'un périphérique à l'aide d'un câble USB 2.0, adb se connecte correctement au périphérique. Lors de la connexion du même périphérique à l'aide d'un câble USB 3.0, adb ne le détecte pas.

Ce que je remarque (à l’aide d’un analyseur LeCroy), c’est qu’après avoir défini la configuration USB, la différence (IMO) pertinente est qu’il n’existe aucune demande pour le descripteur de chaîne portant l’ID de périphérique adb.

Vous trouverez ci-dessous le descripteur lu pour USB 2.0 mais pas pour USB 3.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) 

En outre, le fichier /tmp/adb.log indique

find_usb_device():endpoints not found

Existe-t-il une limite dont je ne suis pas au courant?

3
levengli

Le code du serveur ADB (system/core/adb/usb_linux.c) n'est pas à la recherche de descripteurs d'accompagnement de noeud final. Il suppose que les descripteurs de points de terminaison en bloc et en bloc suivent le descripteur d'interface. Voir diff pour la fixation

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;
2
levengli