0

I am trying to write a udev rule for my USBtiny based AVR programmer. On other non-Gentoo systems usb device will show up at /dev/ttyUSB0. I expect it to show up on my system as something similar, possibly /dev/ttyACM0 or something.

I believe my kernel is configured properly because I can plug in a USB-to-Serial converter and it shows up as /dev/ttyUSB0.

This is a pretty up to date Gentoo openrc system with eudev installed.

When running "udevadm monitor" I can see the following happen when I plug in the device:

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)

I grabbed the "/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1" and checked the info:

% 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==""

It seems, then that the following udev rule would work:

# /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"

It is the same as others that I have seen elsewhere on the internet. One difference is that the idVendor seems to be an ATTRS but it is not a parent node attribute from the "udevadm info" output.

My process for reloading the rules has been to run "udevadm control -R". I have also tried restarting udev "/etc/init.d/udev restart" and just rebooting. The device never makes an entry under /dev/. I have tried all of the above without the "SYMLINK" part of the udev rule as well.

I can see the device with 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

I know the kernel sees it as well with the tail of 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

Does anyone have any other troubleshooting tips? Like I said, the usb serial converter I have registers as a device under /dev/ and I can see it just fine in the "udevadm monitor" output. I feel like I'm missing something small and I have been banging my head on this for a couple days. Any pointers would be appreciated.

I also have all of the serial usb drivers built into my kernel:

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

I've looked through some other questions here and I'm really scratching my head because I can't even get the symlink to show up in /dev/.

The main resources that I've been through for this are:

0

You mention ATTR{idVendor} and similar. Should that be ATTRS{...} ? I've also found minimal rules are better.

For example, I have the following on my Debian system:

% 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"

So I would try:

ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c9f", MODE="0660", GROUP="plugdev", SYMLINK+="usbtiny%n"
  • Thanks, I tried that and it is the same outcome. – Jesse Mar 13 '20 at 15:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.