FYI: persistent naming of USB serial devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

It took me half a morning to figure out how to get persistent naming of
several USB-serial devices. Google finds lots of information but
unfortunately a lot of it is outdated. Here's my way, let's hope Google
indexes it.

Problem: I got a new computer without legacy serial ports. In order to
connect my UPS and Wacom Intuos I got two USB-serial converters. When
the computer boots, the UPS is connected to ttyUSB0 and the Intuos to
ttyUSB1. However, when the computer boots while my phone is connected,
all USB serial devices shift name. In order to get persistent names, I
need symlinks to the serial devices.

It would have been nice if the serial devices got a serial number so we
could use the ATTRS{serial} in a udev rule, but apparently it was
cheaper to print a serial number on a label than to put the number in
an e2prom in the device itself. Therefore the only way to distinguish
them is the place in the USB device tree. Several webpages suggest to
use PLACE in a udev rule for that, but that doesn't work anymore.
Fortunately the place can be encoded in a KERNELS statement. If you
query the udev information for the device you get:

erik@zaphod:~ > udevinfo -a -n /dev/ttyUSB0 

  looking at device '/class/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""
    ATTR{dev}=="188:0"

  looking at parent device '/devices/pci0000:00/0000:00:1a.1/usb4/4-1/4-1:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="pl2303"
    ATTRS{port_number}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:1a.1/usb4/4-1/4-1:1.0':
    KERNELS=="4-1:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="pl2303"
    ATTRS{bInterfaceNumber}=="00"
    [...]

So the USB-serial devices lives on USB host 4 port 1 on something
called 1.0 (I guess that is the first serial port in the usb-serial
converter, there are usb-serial converters with multiple ports). The
two udev rules now become:

SUBSYSTEMS=="usb", KERNELS=="4-1:1.0", KERNEL=="ttyUSB*", SYMLINK+="ups"
SUBSYSTEMS=="usb", KERNELS=="4-2:1.0", KERNEL=="ttyUSB*", SYMLINK+="wacom"

And now I can tell nut to use /dev/ups and Xorg to use /dev/wacom.


HTH,
Erik

-- 
Erik Mouw -- mouw@xxxxxxxxxxxx

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux