Я пытаюсь написать правило udev для моего программатора AVR на базе USBtiny. В других системах, отличных от Gentoo, устройство usb будет отображаться в /dev/ttyUSB0
. Я ожидаю, что оно будет отображаться в моей системе как что-то похожее, возможно, /dev/ttyACM0
или что-то в этом роде.
Я считаю, что мое ядро настроено правильно, поскольку я могу подключить преобразователь USB-последовательный порт, и он отображается как /dev/ttyUSB0
.
Это довольно современная система Gentoo openrc с установленным eudev.
При запуске «udevadm monitor» при подключении устройства происходит следующее:
KERNEL[1859.422447] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1 (usb)
KERNEL[1859.422777] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0 (usb)
KERNEL[1859.423050] bind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1 (usb)
UDEV [1859.990399] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1 (usb)
UDEV [1859.991792] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0 (usb)
UDEV [1859.996016] bind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1 (usb)
Я взял «/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1» и проверил информацию:
% udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1':
KERNEL=="1-1.1"
SUBSYSTEM=="usb"
DRIVER=="usb"
ATTR{configuration}==""
ATTR{bMaxPacketSize0}=="8"
ATTR{bDeviceClass}=="ff"
ATTR{bcdDevice}=="0105"
ATTR{bNumInterfaces}==" 1"
ATTR{bConfigurationValue}=="1"
ATTR{manufacturer}=="Adafruit"
ATTR{bNumConfigurations}=="1"
ATTR{authorized}=="1"
ATTR{speed}=="1.5"
ATTR{idProduct}=="0c9f"
ATTR{urbnum}=="9"
ATTR{devnum}=="6"
ATTR{product}=="USBtiny"
ATTR{maxchild}=="0"
ATTR{bmAttributes}=="80"
ATTR{bDeviceSubClass}=="00"
ATTR{bMaxPower}=="100mA"
ATTR{rx_lanes}=="1"
ATTR{removable}=="removable"
ATTR{idVendor}=="1781"
ATTR{version}==" 1.10"
ATTR{avoid_reset_quirk}=="0"
ATTR{bDeviceProtocol}=="00"
ATTR{tx_lanes}=="1"
ATTR{ltm_capable}=="no"
ATTR{devpath}=="1.1"
ATTR{busnum}=="1"
ATTR{quirks}=="0x0"
looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1':
KERNELS=="1-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bMaxPacketSize0}=="64"
ATTRS{bDeviceClass}=="09"
ATTRS{bcdDevice}=="0000"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bNumConfigurations}=="1"
ATTRS{authorized}=="1"
ATTRS{speed}=="480"
ATTRS{idProduct}=="0020"
ATTRS{urbnum}=="193"
ATTRS{devnum}=="2"
ATTRS{maxchild}=="6"
ATTRS{bmAttributes}=="e0"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPower}=="0mA"
ATTRS{rx_lanes}=="1"
ATTRS{removable}=="fixed"
ATTRS{idVendor}=="8087"
ATTRS{version}==" 2.00"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bDeviceProtocol}=="01"
ATTRS{tx_lanes}=="1"
ATTRS{ltm_capable}=="no"
ATTRS{devpath}=="1"
ATTRS{busnum}=="1"
ATTRS{quirks}=="0x0"
looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bMaxPacketSize0}=="64"
ATTRS{bDeviceClass}=="09"
ATTRS{bcdDevice}=="0505"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{manufacturer}=="Linux 5.5.1-gentoo ehci_hcd"
ATTRS{bNumConfigurations}=="1"
ATTRS{authorized}=="1"
ATTRS{speed}=="480"
ATTRS{idProduct}=="0002"
ATTRS{urbnum}=="134"
ATTRS{devnum}=="1"
ATTRS{product}=="EHCI Host Controller"
ATTRS{maxchild}=="3"
ATTRS{bmAttributes}=="e0"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPower}=="0mA"
ATTRS{rx_lanes}=="1"
ATTRS{removable}=="unknown"
ATTRS{idVendor}=="1d6b"
ATTRS{interface_authorized_default}=="1"
ATTRS{authorized_default}=="1"
ATTRS{version}==" 2.00"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{serial}=="0000:00:1a.0"
ATTRS{bDeviceProtocol}=="00"
ATTRS{tx_lanes}=="1"
ATTRS{ltm_capable}=="no"
ATTRS{devpath}=="0"
ATTRS{busnum}=="1"
ATTRS{quirks}=="0x0"
looking at parent device '/devices/pci0000:00/0000:00:1a.0':
KERNELS=="0000:00:1a.0"
SUBSYSTEMS=="pci"
DRIVERS=="ehci-pci"
ATTRS{broken_parity_status}=="0"
ATTRS{subsystem_device}=="0x2163"
ATTRS{dma_mask_bits}=="32"
ATTRS{vendor}=="0x8086"
ATTRS{local_cpus}=="f"
ATTRS{companion}==""
ATTRS{class}=="0x0c0320"
ATTRS{numa_node}=="-1"
ATTRS{msi_bus}=="1"
ATTRS{device}=="0x3b3c"
ATTRS{local_cpulist}=="0-3"
ATTRS{driver_override}=="(null)"
ATTRS{d3cold_allowed}=="1"
ATTRS{irq}=="23"
ATTRS{revision}=="0x06"
ATTRS{consistent_dma_mask_bits}=="32"
ATTRS{ari_enabled}=="0"
ATTRS{uframe_periodic_max}=="100"
ATTRS{enable}=="1"
ATTRS{subsystem_vendor}=="0x17aa"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
Тогда, похоже, сработает следующее правило udev:
# /etc/udev/rules.d/99-usbtiny.rules
SUBSYSTEM=="usb", ATTR{manufacturer}=="Adafruit", ATTR{product}=="USBtiny", ATTR{idProduct}=="0c9f", ATTR{idVendor}=="1781", MODE="0660", GROUP="plugdev", SYMLINK+="usbtiny%n"
Это то же самое, что и другие, которые я видел в другом месте в интернете. Одно отличие в том, что idVendor, похоже, является ATTRS, но это не атрибут родительского узла из вывода "udevadm info".
Мой процесс перезагрузки правил заключался в запуске "udevadm control -R". Я также пробовал перезапустить udev "/etc/init.d/udev restart" и просто перезагрузиться. Устройство никогда не делает запись в /dev/. Я пробовал все вышеперечисленное без части "SYMLINK" правила udev.
Я могу увидеть устройство с помощью lsusb:
% lsusb
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 006: ID 1781:0c9f Multiple Vendors USBtiny
Я знаю, что ядро тоже это видит по хвосту dmesg:
[ 1859.351137] usb 1-1.1: new low-speed USB device number 6 using ehci-pci
[ 1859.440168] usb 1-1.1: New USB device found, idVendor=1781, idProduct=0c9f, bcdDevice= 1.05
[ 1859.440172] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 1859.440175] usb 1-1.1: Product: USBtiny
[ 1859.440177] usb 1-1.1: Manufacturer: Adafruit
Есть ли у кого-нибудь еще советы по устранению неполадок? Как я уже сказал, мой последовательный USB-конвертер регистрируется как устройство в /dev/, и я прекрасно вижу его в выводе "udevadm monitor". Я чувствую, что упускаю что-то маленькое, и я уже пару дней ломаю над этим голову. Буду признателен за любые указания.
У меня также есть все драйверы последовательного USB, встроенные в мое ядро:
--- USB Serial Converter support
[*] USB Serial Console device support
[*] USB Generic Serial Driver
<*> USB Serial Simple Driver
<*> USB AIRcable Bluetooth Dongle Driver
<*> USB ARK Micro 3116 USB Serial Driver
<*> USB Belkin and Peracom Single Port Serial Driver
<*> USB Winchiphead CH341 Single Port Serial Driver
<*> USB ConnectTech WhiteHEAT Serial Driver
<*> USB Digi International AccelePort USB Serial Driver
<*> USB CP210x family of UART Bridge Controllers
<*> USB Cypress M8 USB Serial Driver
<*> USB Empeg empeg-car Mark I/II Driver
<*> USB FTDI Single Port Serial Driver
<*> USB Handspring Visor / Palm m50x / Sony Clie Driver
<*> USB PocketPC PDA Driver
<*> USB IR Dongle Serial Driver
<*> USB Inside Out Edgeport Serial Driver
<*> USB Inside Out Edgeport Serial Driver (TI device
<*> USB Fintek F81232 Single Port Serial Driver
<*> USB Fintek F81532/534 Multi-Ports Serial Driver
<*> USB Garmin GPS driver
<*> USB IPWireless (3G UMTS TDD) Driver
<*> USB Infinity USB Unlimited Phoenix Driver
<*> USB Keyspan PDA Single Port Serial Driver
<*> USB Keyspan USA-xxx Serial Driver
<*> USB KL5KUSB105 (Palmconnect) Driver
<*> USB KOBIL chipcard reader
<*> USB MCT Single Port Serial Driver
<*> USB Metrologic Instruments USB-POS Barcode Scanner Driver
<*> USB Moschip 7720 Serial Driver
<*> USB Moschip 7840/7820 USB Serial Driver
<*> USB Moxa UPORT Serial Driver
<*> USB Navman GPS device
<*> USB Prolific 2303 Single Port Serial Driver
<*> USB Ours Technology Inc. OTi-6858 USB To RS232 Bridge Controller
<*> USB Qualcomm Auxiliary Serial Port Driver
<*> USB Qualcomm Serial modem
<*> USB SPCP8x5 USB To Serial Driver
<*> USB Safe Serial (Encapsulated) Driver
[ ] USB Secure Encapsulated Driver - Padded
<*> USB Sierra Wireless Driver
<*> USB Symbol Barcode driver (serial mode
<*> USB TI 3410/5052 Serial Driver
<*> USB REINER SCT cyberJack pinpad/e-com chipcard reader
<*> USB Xircom / Entrega Single Port Serial Driver
<*> USB driver for GSM and CDMA modems
<*> USB ZyXEL omni.net LCD Plus Driver
<*> USB Opticon Barcode driver (serial mode)
<*> Xsens motion tracker serial interface driver
<*> USB-Wishbone adapter interface driver
<*> USB Quatech SSU-100 Single Port Serial Driver
<*> USB Quatech Serial Driver for USB 2 devices
<*> USB Renesas uPD78F0730 Single Port Serial Driver
<*> USB Debugging Device
Я просмотрел некоторые другие вопросы здесь и действительно чешу голову, потому что я даже не могу заставить символическую ссылку отображаться в /dev/
.
Основные ресурсы, которые я использовал для этого:
решение1
Не все USB-устройства представлены как устройства, подобные последовательному порту. В частности, USBtinyISP вообще не эмулирует последовательный порт, а получает доступ через libusb
собственную USB-связь.
У меня также есть USBtinyISP от Adafruit, с теми же USB-поставщиками и идентификаторами продукта, что и у вас, 0x1781 и 0x0c9f соответственно. Он не выдает ни устройство, /dev/ttyUSB*
ни /dev/ttyACM*
устройство, но при этом avrdude
прекрасно с ним общается.
Bus 001 Device 006: ID 1781:0c9f Multiple Vendors USBtiny
В вашем случае USBtinyISP был обнаружен на шине 1, устройстве 6, поэтому узел устройства, используемый libusb
для связи с устройством, будет /dev/bus/usb/001/006
. Ваши правила udev, возможно, уже применяются к этому устройству.
Также, по крайней мере на Debian, avrdude
пакет уже включает файл правил udev. Он установится /lib/udev/rules.d/60-avrdude.rules
как любой системный файл правил udev по умолчанию, оставляя /etc/udev/rules.d
только локальные настройки/переопределения. Этот файл уже охватывает USBtinyISP.
Чтобы avrdude
использовать USBtinyISP по умолчанию, вам, возможно, захочется создать ~/.avrduderc
файл, содержащий следующую строку:
default_programmer = "usbtiny";
Это устранит необходимость указывать тип программатора в каждой avrdude
командной строке.
решение2
Вы упомянули ATTR{idVendor}
и подобное. Так должно быть ATTRS{...}
? Я также обнаружил, что минимальные правила лучше.
Например, в моей системе Debian имеется следующее:
% cat /etc/udev/rules.d/ols.rules
#Rules for Openbench Logix Snifferslogic. Creates a nice link to the ols
ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="fc92", MODE="0666", SYMLINK+="OpenLogicSniffer"
Итак, я бы попробовал:
ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c9f", MODE="0660", GROUP="plugdev", SYMLINK+="usbtiny%n"
решение3
Я думаю, вам следует использовать MODE="0666" вместо MODE="0660".