私は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"
これは私がインターネット上の他の場所で見たのと同じです。 1つの違いは、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 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通信を使用してアクセスします。
また、あなたとまったく同じUSBベンダーと製品ID(それぞれ0x1781と0x0c9f)を持つAdafruitのUSBtinyISPもあります。デバイスを作成/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について説明しています。
USBtinyISPをデフォルトで有効にするには、次の行を使用して直接ファイルを作成avrdude
できます。~/.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="0660"の代わりにMODE="0666"を使うべきだと思います。