Làm cách nào để tạo quy tắc udev để vô hiệu hóa một trong các thiết bị Android?


8

Tôi có một điện thoại HTC Android.

Mỗi lần tôi kết nối nó với máy tính, tôi nhận được một tin nhắn:

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

Các con số có thể khác nhau. Nhưng điện thoại kết nối chính xác.

usb-devices đầu ra

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

Tôi cũng thấy rằng trong một khoảng thời gian ngắn sau khi điện thoại được kết nối, một thiết bị lưu trữ usb được khai báo

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

Sau đó, nó ngắt kết nối và lớp được thay đổi thành 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)

Vui lòng làm như sau cho tôi: 1) lsusbvà tìm thiết bị của bạn hoặc thiết bị của bạn (Xe buýt và Thiết bị). 2) Bắt đầu lệnh udevadm info -q all -n /dev/bus/usb/your_bus_id/your_device_idvà sử dụng Bus và Thiết bị. Thêm đầu ra của lệnh trong bước 2 vào câu hỏi của bạn.
AB

Ok và đầu ra lsusbcũng vậy, tôi chỉ cần một phần của Điện thoại của bạn
AB

Tôi sẽ thêm nó, nhưng bạn có thể thấy VID & PID usb-devices. @AB
Pilot6

Tôi không thấy bình luận đầu tiên. Thêm vào đó nữa.
Pilot6

1
Tôi không chắc chắn đó thực sự là hai thiết bị USB.
AB

Câu trả lời:


6

Từ dmesgđầu ra, rõ ràng điện thoại kết nối hai lần.

  • [40.632283] Đầu tiên được kết nối dưới dạng bus USB 2 dev 3
  • [40.864690] bị ngắt kết nối
  • [41.613079] Kết nối thứ 2 dưới dạng bus USB 2 dev 4

Vấn đề là:

  • Cả hai chế độ kết nối điện thoại đều sử dụng cùng thuộc tính idVendor/ idProduct/ bcdDevice.

  • quy tắc udev libmtp chỉ sử dụng idVendor/ idProductthiết bị lọc, thêm vào các thuộc tính không quan trọng / chung ACTION!="add", ENV{MAJOR}!="?*"SUBSYSTEM=="usb"

  • quy tắc libmtp udev sử dụng ATTR(không ATTRS), nó nhắm mục tiêu chính xác nút thiết bị này /devices/pci0000:00/0000:00:13.2/usb2/2-1. Vì vậy, chúng ta không thể sử dụng các chi tiết nút giao diện vì chúng là các nút con cho cái này.

Để có được những gì đang xảy ra, sử dụng udevadm monitor. Để xem chỉ các sự kiện mà không có chi tiết.

  1. Rút điện thoại ra
  2. Mở terminal và chạy udevadm monitor -u, -uđể chỉ hiển thị các sự kiện UDEV (cho đầu ra sạch)
  3. Cắm điện thoại và đợi cho đến khi mọi thứ lắng xuống
  4. Ctrl+ Cdừng theo dõi

Để lấy chi tiết (Thuộc tính môi trường) sử dụng udevadm monitor -u -pthay thế và so sánh đầu ra tại nút đó:

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

Lưu ý sự khác biệt trong ID_USB_INTERFACES

Một cách khác sạch hơn, sử dụng quy tắc udev để chỉ thu thập những gì chúng ta cần:

  1. Thêm quy tắc vào /lib/udev/rules.d/69-libmtp.rulesngay sau LABEL="libmtp_usb_rules":

    ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0f91", RUN+="/bin/sh -c 'env >> /home/username/udev-phone-mtp_%E{SEQNUM}.log'"
    
  2. Quy tắc tải lại

    sudo udevadm control -R
    
  3. Gọi lại điện thoại một lần.

  4. Quy tắc này nên được kích hoạt hai lần. So sánh đầu ra tại nút đó:

    diff udev-phone-mtp_*.log

    nên mang theo: (đây chỉ là phần thú vị)

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

Chính xác những gì Pilot6 (OP) có thể bắt nó sử dụng usb-devicestrước khi kết nối lại.


Tôi đề nghị thêm quy tắc này vào /lib/udev/rules.d/69-libmtp.rules, ngay sau LABEL="libmtp_usb_rules":

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

Cuộc thảo luận trò chuyện này chat.stackexchange.com/rooms/28790/. Liên quan đến vấn đề này. Báo cáo rằng: Lần đầu tiên nó hoạt động tốt Lần thứ hai sau khi rút phích cắm có lỗi sau đó mở ra sau khi trì hoãn.
user.dz

1
Tôi không thấy bất kỳ lỗi nào. Nhưng sự chậm trễ vẫn còn đó. Phải mất đến một phút để thiết bị được gắn kết. Tôi gặp lỗi nếu tôi không đợi cho đến khi nó được tự động gắn kết và cố gắng mở nó trong nautilus.
Pilot6

1
Nhưng điều này dường như không liên quan, bởi vì tôi đã nhận xét dòng của bạn và sự chậm trễ vẫn còn đó. Điện thoại xuất hiện trong trình khởi chạy nhưng không thể kết nối trong một thời gian.
Pilot6

Sự chậm trễ không liên quan đến Ubuntu. Đây là một lỗi Android. Tôi cắm điện thoại từ một máy tính và kết nối với một máy tính khác. Có sự chậm trễ tương tự.
Pilot6

1
Đó thực sự là một vấn đề của Android với sự chậm trễ. Tôi cài đặt lại firmware cho một lý do khác và sự chậm trễ biến mất.
Pilot6
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.