我正在嘗試為基於 USBtiny 的 AVR 程式設計師編寫 udev 規則。在其他非 Gentoo 系統上,USB 設備將顯示在/dev/ttyUSB0
。我希望它在我的系統上顯示為類似的東西,可能/dev/ttyACM0
或其他東西。
我相信我的內核配置正確,因為我可以插入 USB 轉串口轉換器,並且它顯示為/dev/ttyUSB0
.
這是一個安裝了 eudev 的最新 Gentoo openrc 系統。
運行“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/ 下建立條目。我已經嘗試了上述所有方法,但沒有使用 udev 規則的「SYMLINK」部分。
我可以使用 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 監視器”輸出中很好地看到它。我覺得我錯過了一些小東西,這幾天我一直在為此煩惱。任何指示將不勝感激。
我的核心中還內建了所有串行 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 通訊進行存取。
我還有 Adafruit 的 USBtinyISP,其 USB 供應商和產品 ID 與您的完全相同,分別為 0x1781 和 0x0c9f。它既不會產生/dev/ttyUSB*
也不會產生/dev/ttyACM*
任何設備,但avrdude
可以很好地與其通訊。
Bus 001 Device 006: ID 1781:0c9f Multiple Vendors USBtiny
在您的情況下,已在匯流排 1、裝置 6 處偵測到 USBtinyISP,因此用於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"。