Bagaimana cara membuat aturan udev untuk menonaktifkan salah satu perangkat Android?

8

Saya memiliki ponsel Android HTC.

Setiap kali saya menghubungkannya ke komputer saya menerima pesan:

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

Jumlahnya mungkin berbeda. Tetapi telepon terhubung dengan benar.

usb-devices keluaran

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

Saya juga menemukan bahwa untuk waktu yang singkat setelah telepon terhubung perangkat penyimpanan usb dinyatakan

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

Kemudian terputus dan kelas diubah menjadi 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
sumber
Silakan lakukan hal berikut untuk saya: 1) lsusbdan temukan perangkat Anda atau perangkat Anda (Bus dan Perangkat). 2) Mulai perintah udevadm info -q all -n /dev/bus/usb/your_bus_id/your_device_iddan gunakan Bus dan Perangkat. Tambahkan output dari perintah di langkah 2 ke pertanyaan Anda.
AB
Ok dan output lsusbjuga, saya hanya perlu bagian dari Ponsel Anda
AB
Saya akan menambahkannya, tetapi Anda dapat melihat VID & PID di usb-devices. @ AB
Pilot6
Saya tidak melihat komentar pertama. Menambahkan itu juga.
Pilot6
1
Saya tidak yakin itu benar-benar dua perangkat USB.
AB

Jawaban:

6

Dari dmesgoutput, jelas bahwa ponsel terhubung dua kali.

  • [40.632283] 1st terhubung sebagai USB bus 2 dev 3
  • [40.864690] terputus
  • [41.613079] 2 terhubung sebagai bus USB 2 dev 4

Masalahnya adalah:

  • Kedua mode koneksi telepon menggunakan atribut yang sama idVendor/ idProduct/ bcdDevice.

  • libmtp udev aturan hanya menggunakan idVendor/ idProductuntuk menyaring perangkat selain atribut yang tidak penting / umum ACTION!="add", ENV{MAJOR}!="?*"dan SUBSYSTEM=="usb"

  • libmtp udev menggunakan aturan ATTR(tidak ATTRS), ia menargetkan tepat simpul perangkat ini /devices/pci0000:00/0000:00:13.2/usb2/2-1. Jadi kita tidak bisa menggunakan detail antarmuka node karena mereka adalah node anak untuk yang ini.

Untuk mendapatkan apa yang terjadi, gunakan udevadm monitor. Untuk melihat acara saja tanpa detail.

  1. Cabut telepon
  2. Buka terminal dan jalankan udevadm monitor -u, -uuntuk menampilkan acara UDEV saja (untuk keluaran bersih)
  3. Pasang telepon dan tunggu sampai semuanya beres
  4. Ctrl+ Cuntuk menghentikan pemantauan

Untuk mendapatkan detail (properti Environment) gunakan udevadm monitor -u -psebagai gantinya dan bandingkan keluaran di simpul itu:

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

Perhatikan perbedaannya ID_USB_INTERFACES

Cara lain yang lebih bersih, menggunakan aturan udev untuk mengumpulkan hanya apa yang kita butuhkan:

  1. Tambahkan aturan /lib/udev/rules.d/69-libmtp.rulessetelah LABEL="libmtp_usb_rules":

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

    sudo udevadm control -R
    
  3. Pasang kembali telepon satu kali.

  4. Aturan ini harus dipicu dua kali. Membandingkan output pada simpul itu:

    diff udev-phone-mtp_*.log

    harus membawa: (ini hanya bagian yang menarik)

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

Persis seperti yang dapat ditangkap Pilot6 (OP) usb-devicessebelum terhubung kembali.


Saya sarankan menambahkan aturan ini ke /lib/udev/rules.d/69-libmtp.rules, tepat setelah LABEL="libmtp_usb_rules":

ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0f91", ENV{ID_USB_INTERFACES}==":060101:080650:", GOTO="libmtp_rules_end"
user.dz
sumber
Diskusi obrolan ini chat.stackexchange.com/rooms/28790/… terkait dengan ini. Dilaporkan bahwa: Pertama kali bekerja dengan baik. Kedua kalinya setelah mencabut ada kesalahan kemudian dibuka setelah penundaan.
user.dz
1
Saya tidak melihat kesalahan apa pun sekarang. Namun penundaan masih ada. Terserah satu menit untuk memasang perangkat. Saya mendapatkan kesalahan jika saya tidak menunggu sampai terpasang secara otomatis dan mencoba membukanya di nautilus.
Pilot6
1
Tapi ini sepertinya tidak berhubungan, karena saya berkomentar keluar dari Anda dan penundaan masih ada Telepon muncul di peluncur tetapi tidak dapat dipasang untuk beberapa waktu.
Pilot6
Penundaan tidak terkait Ubuntu. Ini adalah bug Android. Saya menyambungkan ponsel dari satu komputer dan terhubung ke yang lain. Ada penundaan yang sama.
Pilot6
1
Itu benar-benar masalah Android dengan penundaan itu. Saya menginstal ulang firmware untuk alasan lain dan penundaan itu hilang.
Pilot6