USB device port identification on Linux
Problem description
Sony’s one-board microcomputer, Spresense, and Allystar HD9310 evaluation board, the satellite signal positioning board, both use Silicon Labs. CP210x as a USB UART driver. On Linux such as Raspberry Pi, both are recognized by the device / dev/ttyUSBx
(where x is a number).
When I reboot with both of them connected, two devices, /dev/ttyUSB0
and /dev/ttyUSB1
, appear, but I don’t know which one will be Spresense depending on the timing.
Many people have set up a mechanism called udev
so that it is automatically identified by idVendor
and idProduct
, but both of them are P10c4
and ea60
. It was not possible to distinguish USB ports between Spresense and HD9310. I thought of a way to recognize both of them individually on Linux.
Investigation
What device was recognized by, for example, the Raspberry Pi as /dev/ttyUSB0
, what was the other device recognized as /dev/ttyUSB1
, and then we observe the difference between them. To do this, run a following command:
udevadm info -a -n /dev/ttyUSB0
Redirect this result to a file called ttyUSB0.txt
. The same procedures are repeated with a device /dev/ttyUSB1
, and we use the diff
command to find the difference between them. Alternatively, you can plug and unplug the device from the USB port by running the following command:
udevadm monitor --environment --udev
The rule file I’m using
In the end, I made the udev rule file as follows:
# u-blox ZED-F9P
KERNEL=="ttyACM*",\
ATTRS{idVendor}=="1546", ATTRS{idProduct}=="01a9",\
SYMLINK+="ttyF9P"
# ES920LR
KERNEL=="ttyUSB*",\
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001",\
SYMLINK+="ttyES920LR"
# Allystar HD9310
KERNEL=="ttyUSB*",\
ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60",\
ATTRS{product}=="CP2104*",\
SYMLINK+="ttyHD9310"
# Sony Spresense
KERNEL=="ttyUSB*",\
ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60",\
ATTRS{product}=="CP2102N*",\
SYMLINK+="ttyDCR"
# EOF
I can use /dev/ttyDCR
(DCR stands for disaster and crisis management report of Michibiki) for accessing Spresense, while /dev/ttyHD9310
for accessing HD9310.
Save this rules file to a file such as /etc/udev/rules.d/00-spresense-hd9310.rules
and place it in the /etdc/udev/rules.d/
directory. Then we execute the following command, a link such as /dev/ttyDCR
is automatically created in the device file directory.
udevadm control --reload-rules && udevadm trigger
This rule file also describes my favorite u-blox ZED-F9P and EASEL ES920LR.