Come creare regole udev per disabilitare uno dei dispositivi Android?


8

Ho un telefono Android HTC.

Ogni volta che lo collego al computer ricevo un messaggio:

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

I numeri possono essere diversi. Ma il telefono si collega correttamente.

usb-devices produzione

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

Ho anche scoperto che per un breve periodo di tempo dopo la connessione del telefono viene dichiarato un dispositivo di archiviazione USB

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

Quindi si disconnette e la classe viene cambiata in 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)

Per favore, procedi come segue: 1) lsusbe trova il tuo dispositivo o i tuoi dispositivi (bus e dispositivo). 2) Avviare il comando udevadm info -q all -n /dev/bus/usb/your_bus_id/your_device_ide utilizzare Bus e dispositivo. Aggiungi l'output del comando nel passaggio 2 alla tua domanda.
AB,

Ok e anche l'output di lsusb, ho bisogno solo della parte del tuo telefono
AB

Lo aggiungerò, ma puoi vedere VID e PID in usb-devices. @AB
Pilot6,

Non ho visto il primo commento. Aggiunto anche quello.
Pilot6,

1
Non sono sicuro che quelli siano davvero due dispositivi USB.
AB,

Risposte:


6

Da dmesguscita, è chiaro che il telefono collegato due volte.

  • [40.632283] 1o collegato come bus USB 2 dev 3
  • [40.864690] disconnesso
  • [41.613079] Secondo collegato come bus USB 2 dev 4

Il problema è:

  • Entrambe le modalità di connessione del telefono utilizzano gli stessi attributi idVendor/ idProduct/ bcdDevice.

  • regole udev libmtp utilizzano solo idVendor/ idProducta dispositivi di filtraggio oltre agli attributi non importante / comuni ACTION!="add", ENV{MAJOR}!="?*"e SUBSYSTEM=="usb"

  • Le regole udev di libmtp usano ATTR(non ATTRS), si rivolge esattamente a questo nodo del dispositivo /devices/pci0000:00/0000:00:13.2/usb2/2-1. Quindi non possiamo usare i dettagli dei nodi delle interfacce poiché sono nodi figli di questo.

Per capire cosa succede, usa udevadm monitor. Per vedere solo eventi senza dettagli.

  1. Scollegare il telefono
  2. Apri terminale ed esegui udevadm monitor -u, -uper mostrare solo gli eventi UDEV (per output pulito)
  3. Collegare il telefono e attendere che le cose si stabilizzino
  4. Ctrl+ Cper interrompere il monitoraggio

Per ottenere i dettagli (Proprietà dell'ambiente) utilizzare udevadm monitor -u -pinvece e confrontare l'output in quel nodo:

  • 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)

Notare la differenza in ID_USB_INTERFACES

Un altro modo più pulito, utilizzando una regola udev per raccogliere solo ciò di cui abbiamo bisogno:

  1. Aggiungi una regola /lib/udev/rules.d/69-libmtp.rulessubito dopo LABEL="libmtp_usb_rules":

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

    sudo udevadm control -R
    
  3. Ricollegare il telefono una volta.

  4. Questa regola dovrebbe essere attivata due volte. Confronto dell'output su quel nodo:

    diff udev-phone-mtp_*.log

    dovrebbe portare: (questa è solo la parte interessante)

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

Esattamente quello che Pilot6 (OP) potrebbe catturarlo usando usb-devicesprima che si riconnettesse.


Suggerisco di aggiungere questa regola a /lib/udev/rules.d/69-libmtp.rules, subito dopo LABEL="libmtp_usb_rules":

ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0f91", ENV{ID_USB_INTERFACES}==":060101:080650:", GOTO="libmtp_rules_end"

Questa discussione di chat chat.stackexchange.com/rooms/28790/… riguardava questo. Riferito che: La prima volta ha funzionato bene Una seconda volta dopo lo scollegamento si è verificato un errore, quindi si è aperto dopo un ritardo.
user.dz,

1
Non vedo alcun errore ora. Ma il ritardo è ancora lì. È necessario un minuto per montare il dispositivo. Ottengo l'errore se non aspetto fino a quando non viene montato automaticamente e provo ad aprirlo in nautilus.
Pilota

1
Ma questo non sembra correlato, perché ho commentato la tua linea e il ritardo è ancora lì. Il telefono appare nel programma di avvio ma non può essere montato per qualche tempo.
Pilota

Il ritardo non è legato a Ubuntu. È un bug di Android. Ho collegato il telefono da un computer e mi sono collegato a un altro. C'è lo stesso ritardo.
Pilota

1
È stato davvero un problema Android con il ritardo. Ho reinstallato il firmware per un altro motivo e il ritardo è scomparso.
Pilota 6
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.