¿Cómo crear una regla udev para deshabilitar uno de los dispositivos Android?

8

Tengo un teléfono HTC Android.

Cada vez que lo conecto a la computadora recibo un mensaje:

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

Los números pueden ser diferentes. Pero el teléfono se conecta correctamente.

usb-devices salida

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

También descubrí que durante un corto período de tiempo después de conectar el teléfono, se declara un dispositivo de almacenamiento 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

Luego se desconecta y la clase cambia a 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)
Piloto6
fuente
Haga lo siguiente por mí: 1) lsusby encuentre su dispositivo o sus dispositivos (Bus y Dispositivo). 2) Inicie el comando udevadm info -q all -n /dev/bus/usb/your_bus_id/your_device_idy use Bus y Dispositivo. Agregue el resultado del comando en el paso 2 en su pregunta.
AB
Ok y la salida lsusbtambién, solo necesito la parte de tu teléfono
AB
Lo agregaré, pero puedes ver VID y PID en usb-devices. @AB
Pilot6
No vi el primer comentario. Agregó eso también.
Pilot6
1
No estoy seguro de que esos sean realmente dos dispositivos USB.
AB

Respuestas:

6

Desde la dmesgsalida, está claro que el teléfono se conectó dos veces.

  • [40.632283] Primero conectado como bus USB 2 dev 3
  • [40.864690] desconectado
  • [41.613079] 2do conectado como bus USB 2 dev 4

El problema es:

  • Ambos modos de conexión telefónica utilizan los mismos atributos idVendor/ idProduct/ bcdDevice.

  • Las reglas de libmtp udev usan solo idVendor/ idProductpara filtrar dispositivos además de atributos no importantes / comunes ACTION!="add", ENV{MAJOR}!="?*"y SUBSYSTEM=="usb"

  • El uso de las reglas libmtp udev ATTR(no ATTRS), se dirige exactamente a este nodo del dispositivo /devices/pci0000:00/0000:00:13.2/usb2/2-1. Por lo tanto, no podemos usar los detalles de los nodos de las interfaces, ya que son nodos secundarios para este.

Para saber qué está pasando, use udevadm monitor. Para ver solo eventos sin detalles.

  1. Desenchufe el teléfono
  2. Abra el terminal y ejecútelo udevadm monitor -u, -upara mostrar solo eventos UDEV (para salida limpia)
  3. Enchufe el teléfono y espere hasta que las cosas se calmen
  4. Ctrl+ Cpara detener el monitoreo

Para obtener detalles (propiedades del entorno) use udevadm monitor -u -pen su lugar y compare la salida en ese 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)

Note la diferencia en ID_USB_INTERFACES

Otra forma más limpia, utilizando una regla udev para recopilar solo lo que necesitamos:

  1. Agregue una regla a /lib/udev/rules.d/69-libmtp.rulesjusto despué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. Reglas de recarga

    sudo udevadm control -R
    
  3. Vuelva a enchufar el teléfono una vez.

  4. Esta regla debe activarse dos veces. Comparación de salida en ese nodo:

    diff udev-phone-mtp_*.log

    debería traer: (esta es solo la parte interesante)

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

Exactamente qué Pilot6 (OP) podría atraparlo usando usb-devicesantes de que se volviera a conectar.


Sugiero agregar esta regla a /lib/udev/rules.d/69-libmtp.rules, justo después de LABEL="libmtp_usb_rules":

ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0f91", ENV{ID_USB_INTERFACES}==":060101:080650:", GOTO="libmtp_rules_end"
user.dz
fuente
Esta discusión de chat chat.stackexchange.com/rooms/28790/… se relacionó con esto. Informó que: La primera vez funcionó bien Una segunda vez después de desconectar hubo un error y luego se abrió después de un retraso.
user.dz
1
No veo ningún error ahora. Pero la demora sigue ahí. Es necesario hasta un minuto para montar el dispositivo. Recibo el error si no espero hasta que se monte automáticamente e intento abrirlo en nautilus.
Pilot6
1
Pero esto no parece estar relacionado, porque comenté tu línea y la demora sigue ahí. El teléfono aparece en el iniciador, pero no se puede montar por un tiempo.
Pilot6
El retraso no está relacionado con Ubuntu. Es un error de Android. Conecté el teléfono de una computadora y me conecté a otra. Hay el mismo retraso.
Pilot6
1
Realmente fue un problema de Android con el retraso. Reinstalé el firmware por otro motivo y la demora desapareció.
Pilot6