Comment créer des règles udev pour désactiver l'un des appareils Android?

8

J'ai un téléphone HTC Android.

Chaque fois que je le connecte à un ordinateur, je reçois un message:

Android Phone: Could not open MTP device "[usb:002,003]"

Les chiffres peuvent être différents. Mais le téléphone se connecte correctement.

usb-devices production

T:  Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 28 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0bb4 ProdID=0f91 Rev=02.33
S:  Manufacturer=HTC
S:  Product=Android Phone
S:  SerialNumber=FA41BWB00560
C:  #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=500mA
I:  If#= 0 Alt= 0 #EPs= 3 Cls=06(still) Sub=01 Prot=01 Driver=usbfs
I:  If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=00 Driver=(none)

lsusb

Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 048d:1336 Integrated Technology Express, Inc. SD/MMC Cardreader
Bus 002 Device 004: ID 0bb4:0f91 HTC (High Tech Computer Corp.) 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 04b8:0898 Seiko Epson Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 002: ID 046d:c05a Logitech, Inc. M90/M100 Optical Mouse
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

lsusb -t

/:  Bus 07.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/2p, 12M
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/3p, 12M
/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/3p, 12M
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/3p, 12M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/3p, 12M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
    |__ Port 1: Dev 4, If 0, Class=Imaging, Driver=usbfs, 480M
    |__ Port 1: Dev 4, If 1, Class=Vendor Specific Class, Driver=, 480M
    |__ Port 3: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
    |__ Port 2: Dev 2, If 0, Class=Vendor Specific Class, Driver=, 480M
    |__ Port 2: Dev 2, If 1, Class=Printer, Driver=usblp, 480M
    |__ Port 2: Dev 2, If 2, Class=Mass Storage, Driver=usb-storage, 480M

udevadm info -q all -n /dev/bus/usb/002/004

P: /devices/pci0000:00/0000:00:13.2/usb2/2-1
N: bus/usb/002/004
S: libmtp-2-1
E: BUSNUM=002
E: COLORD_DEVICE=1
E: COLORD_KIND=camera
E: DEVLINKS=/dev/libmtp-2-1
E: DEVNAME=/dev/bus/usb/002/004
E: DEVNUM=004
E: DEVPATH=/devices/pci0000:00/0000:00:13.2/usb2/2-1
E: DEVTYPE=usb_device
E: DRIVER=usb
E: GPHOTO2_DRIVER=PTP
E: ID_BUS=usb
E: ID_FOR_SEAT=usb-pci-0000_00_13_2-usb-0_1
E: ID_GPHOTO2=1
E: ID_MEDIA_PLAYER=1
E: ID_MODEL=Android_Phone
E: ID_MODEL_ENC=Android\x20Phone
E: ID_MODEL_ID=0f91
E: ID_MTP_DEVICE=1
E: ID_PATH=pci-0000:00:13.2-usb-0:1
E: ID_PATH_TAG=pci-0000_00_13_2-usb-0_1
E: ID_REVISION=0233
E: ID_SERIAL=HTC_Android_Phone_FA41BWB00560
E: ID_SERIAL_SHORT=FA41BWB00560
E: ID_USB_INTERFACES=:060101:ffff00:
E: ID_VENDOR=HTC
E: ID_VENDOR_ENC=HTC
E: ID_VENDOR_FROM_DATABASE=HTC (High Tech Computer Corp.)
E: ID_VENDOR_ID=0bb4
E: MAJOR=189
E: MINOR=131
E: PRODUCT=bb4/f91/233
E: SUBSYSTEM=usb
E: TAGS=:seat:uaccess:
E: TYPE=0/0/0
E: USEC_INITIALIZED=611981507

dmesg

[   40.632283] usb 2-1: new high-speed USB device number 3 using ehci-pci
[   40.765458] usb 2-1: New USB device found, idVendor=0bb4, idProduct=0f91
[   40.765469] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=4
[   40.765475] usb 2-1: Product: Android Phone
[   40.765480] usb 2-1: Manufacturer: HTC
[   40.765485] usb 2-1: SerialNumber: FA41BWB00560
[   40.766646] usb-storage 2-1:1.1: USB Mass Storage device detected
[   40.767102] scsi host10: usb-storage 2-1:1.1
[   40.864690] usb 2-1: USB disconnect, device number 3
[   41.613079] usb 2-1: new high-speed USB device number 4 using ehci-pci
[   41.746616] usb 2-1: New USB device found, idVendor=0bb4, idProduct=0f91
[   41.746626] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=4
[   41.746633] usb 2-1: Product: Android Phone
[   41.746638] usb 2-1: Manufacturer: HTC
[   41.746643] usb 2-1: SerialNumber: FA41BWB00560
[  101.942087] usb 2-1: reset high-speed USB device number 4 using ehci-pci

J'ai également constaté que pendant une courte période après la connexion du téléphone, un périphérique de stockage USB est déclaré

I:  If#= 0 Alt= 0 #EPs= 3 Cls=06(still) Sub=01 Prot=01 Driver=usbfs
I:  If#= 1 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage

Ensuite, il se déconnecte et la classe est remplacée par ff.

I:  If#= 0 Alt= 0 #EPs= 3 Cls=06(still) Sub=01 Prot=01 Driver=usbfs
I:  If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=00 Driver=(none)
Pilot6
la source
Veuillez faire ce qui suit pour moi: 1) lsusbet trouvez votre appareil ou vos appareils (Bus et appareil). 2) Lancez la commande udevadm info -q all -n /dev/bus/usb/your_bus_id/your_device_idet utilisez Bus et périphérique. Ajoutez la sortie de la commande de l'étape 2 à votre question.
AB
Ok et la sortie de lsusbtrop, je n'ai besoin que de la partie de votre téléphone
AB
Je vais l'ajouter, mais vous pouvez voir VID & PID dans usb-devices. @AB
Pilot6
Je n'ai pas vu le premier commentaire. Ajouté cela aussi.
Pilot6
1
Je ne suis pas sûr que ce soient vraiment deux périphériques USB.
AB

Réponses:

6

De la dmesgsortie, il est clair que le téléphone s'est connecté deux fois.

  • [40.632283] 1er connecté en tant que bus USB 2 dev 3
  • [40.864690] déconnecté
  • [41.613079] 2ème connecté en tant que bus USB 2 dev 4

Le problème est:

  • Les deux modes de connexion téléphonique utilisent les mêmes attributs idVendor/ idProduct/ bcdDevice.

  • les règles libmtp udev utilisent uniquement idVendor/ idProductpour filtrer les périphériques en plus des attributs non importants / communs ACTION!="add", ENV{MAJOR}!="?*"et SUBSYSTEM=="usb"

  • les règles libmtp udev utilisent ATTR(pas ATTRS), elles ciblent exactement ce nœud de périphérique /devices/pci0000:00/0000:00:13.2/usb2/2-1. Nous ne pouvons donc pas utiliser les détails des nœuds d'interfaces car ils sont des nœuds enfants de celui-ci.

Pour savoir ce qui se passe, utilisez udevadm monitor. Pour voir uniquement les événements sans détails.

  1. Débranchez le téléphone
  2. Ouvrir le terminal et exécuter udevadm monitor -u, -upour afficher uniquement les événements UDEV (pour une sortie propre)
  3. Branchez le téléphone et attendez que les choses se calment
  4. Ctrl+ Cpour arrêter la surveillance

Pour obtenir des détails (propriétés d'environnement), utilisez udevadm monitor -u -pplutôt et comparez la sortie sur ce nœud:

  • UDEV [107.024195] add /devices/pci0000:00/0000:00:13.2/usb2/2-1 (usb)
  • UDEV [107.998137] add /devices/pci0000:00/0000:00:13.2/usb2/2-1 (usb)

Remarquez la différence ID_USB_INTERFACES

Une autre façon plus propre, en utilisant une règle udev pour collecter uniquement ce dont nous avons besoin:

  1. Ajoutez une règle /lib/udev/rules.d/69-libmtp.rulesjuste après LABEL="libmtp_usb_rules":

    ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0f91", RUN+="/bin/sh -c 'env >> /home/username/udev-phone-mtp_%E{SEQNUM}.log'"
    
  2. Règles de rechargement

    sudo udevadm control -R
    
  3. Rebranchez le téléphone une fois.

  4. Cette règle doit être déclenchée deux fois. Comparaison de la sortie à ce nœud:

    diff udev-phone-mtp_*.log

    devrait apporter: (c'est juste la partie intéressante)

    < ID_USB_INTERFACES=:060101:080650:
    ---
    > ID_USB_INTERFACES=:060101:ffff00:
    

Exactement ce que Pilot6 (OP) pourrait l'attraper en utilisant usb-devicesavant de se reconnecter.


Je suggère d'ajouter cette règle /lib/udev/rules.d/69-libmtp.rulesjuste après LABEL="libmtp_usb_rules":

ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0f91", ENV{ID_USB_INTERFACES}==":060101:080650:", GOTO="libmtp_rules_end"
user.dz
la source
Cette discussion de chat chat.stackexchange.com/rooms/28790/… s'y rapportait. A rapporté que: Première fois, cela a bien fonctionné Une deuxième fois après le débranchement, il y a eu une erreur, puis s'est ouvert après un délai.
user.dz
1
Je ne vois aucune erreur maintenant. Mais le retard est toujours là. Il faut jusqu'à une minute pour monter l'appareil. J'obtiens l'erreur si je n'attends pas qu'il soit monté automatiquement et j'essaye de l'ouvrir dans Nautilus.
Pilot6
1
Mais cela ne semble pas lié, car j'ai commenté votre ligne et le retard est toujours là. Le téléphone apparaît dans le lanceur mais il ne peut pas être monté pendant un certain temps.
Pilot6
Le retard n'est pas lié à Ubuntu. Il s'agit d'un bug Android. J'ai branché le téléphone d'un ordinateur et connecté à un autre. Il y a le même délai.
Pilot6
1
C'était vraiment un problème Android avec le retard. J'ai réinstallé le firmware pour une autre raison et le retard a disparu.
Pilot6