mandhyl.net
Antoine Beauvillain. Le bureau d’un informaticien moderne. Photographie numérique (2015), 5616 × 3744 px.

Accéder au Huawei U8350 sous Linux

Après le passage totalement foiré de ma Debian Jessie vers Stretch, j’en suis réduit à peaufiner, pour la énième fois, la configuration d’une installation toute fraîche. Au moment de connecter mon vieillissant téléphone sur ma station de travail afin d’en extraire des fichiers, un problème se pose : il ne se passe absolument rien.

Ni une, ni deux, Google et mon ami, je part à la recherche d’une solution. Et là, j’ai beau entrer maintes mots clefs, je ne trouve aucune méthode probante pour me venir en aide…


Mon valeureux Huawei U8350 « Boulder » fonctionne sous Android 2.2.2 « Froyo » et ne permet pas d’utiliser le protocole MTP. Une fois le téléphone branché, stockage USB activé, la commande dmesg sur ma machine m’indique que Linux détecte bien un périphérique mais il n’est jamais monté, ou du moins pas comme je le voudrais. Impossible d’y accéder.

Le souci se situe au niveau des règles udev utiles à l’outil USB_ModeSwitch.

Récupérer des informations

mandhyl@zephyr:~$ lsusb
Bus 003 Device 002: ID 8087:8001 Intel Corp. 
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 008: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 001 Device 007: ID 8087:07dc Intel Corp. 
Bus 001 Device 005: ID 0bda:5684 Realtek Semiconductor Corp. 
Bus 001 Device 023: ID 12d1:1037 Huawei Technologies Co., Ltd. Ideos
Bus 001 Device 020: ID 045e:076c Microsoft Corp. Comfort Mouse 4500
Bus 001 Device 019: ID 413c:2003 Dell Computer Corp. Keyboard
Bus 001 Device 018: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Retenons les valeurs de Bus et Device de la ligne qui nous intéresse, en l’occurrence celle qui nous cause du périphérique USB Huawei Technologies Co., Ltd. Ideos. Dans cet exemple ce sera 001 et 023.

Nous savons maintenant que le nœud de notre périphérique se trouve à l’emplacement /dev/bus/usb/001/023 et udevadm va nous donner plus d’informations.

mandhyl@zephyr:~$ udevadm info --name=/dev/bus/usb/001/023 --attribute-walk

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3':
    KERNEL=="1-3"
    SUBSYSTEM=="usb"
    DRIVER=="usb"
    ATTR{authorized}=="1"
    ATTR{avoid_reset_quirk}=="0"
    ATTR{bConfigurationValue}=="1"
    ATTR{bDeviceClass}=="00"
    ATTR{bDeviceProtocol}=="00"
    ATTR{bDeviceSubClass}=="00"
    ATTR{bMaxPacketSize0}=="64"
    ATTR{bMaxPower}=="500mA"
    ATTR{bNumConfigurations}=="1"
    ATTR{bNumInterfaces}==" 1"
    ATTR{bcdDevice}=="0226"
    ATTR{bmAttributes}=="80"
    ATTR{busnum}=="1"
    ATTR{configuration}==""
    ATTR{devnum}=="23"
    ATTR{devpath}=="3"
    ATTR{idProduct}=="1037"
    ATTR{idVendor}=="12d1"
    ATTR{ltm_capable}=="no"
    ATTR{manufacturer}=="Huawei Incorporated"
    ATTR{maxchild}=="0"
    ATTR{product}=="Android Adapter"
    ATTR{quirks}=="0x0"
    ATTR{removable}=="removable"
    ATTR{serial}=="ACE87Bxxxxxx"
    ATTR{speed}=="480"
    ATTR{urbnum}=="11"
    ATTR{version}==" 2.00"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
...
    ATTRS{manufacturer}=="Linux 4.9.0-3-amd64 xhci-hcd"
...

Résoudre le problème

Éditons le fichier /lib/udev/rules.d/40-usb_modeswitch.rules en tant que super‑utilisateur et cherchons les lignes :

# Generic entry for most Huawei devices, excluding Android phones
ATTRS{idVendor}=="12d1", ATTRS{manufacturer}!="Android", ATTR{bInterfaceNumber}=="00", ATTR{bInterfaceClass}=="08", RUN+="usb_modeswitch '/%k'"

Cette règle udev fait un appel à USB_ModeSwitch lorsque ATTRS{idVendor} est égal (==) à 12d1 (Huawei) et que ATTRS{manufacturer} n’est pas égal (!=) à Android.

Comme ATTRS{manufacturer} vaut Linux 4.9.0-3-amd64 xhci-hcd, le système estime que ce n’est pas un téléphone Android qui est connecté. Il pense que ce peut être un modem et lance USB_ModeSwitch. Hors mon Huawei U8350 est bel et bien un téléphone Android.

J’ai donc choisi de modifier la règle ainsi :

ATTRS{idVendor}=="12d1", ATTR{product}!="Android Adapter", ATTR{bInterfaceNumber}=="00", ATTR{bInterfaceClass}=="08", RUN+="usb_modeswitch '/%k'"

Une fois le fichier 40-usb_modeswitch.rules enregistré, « Bling ! », une notification sur mon bureau indique que les données de mon téléphone seront disponibles depuis un volume physique amovible facilement montable par l’application Fichiers dans l’environnement GNOME.

Bibliographie :