在 Linux 下使用 udev 规则 绑定 EVB-LAN8670-USB 设备,并确保多个设备不会发生识别冲突,可以按照以下步骤进行:
1. 识别设备信息
首先,插入 EVB-LAN8670-USB 设备,并使用以下命令查找设备的详细信息:
bash
复制
编辑
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
或者查看 dmesg 输出:
bash
复制
编辑
dmesg | grep -i usb
或者:
bash
复制
编辑
lsusb -v | grep -i "EVB-LAN8670"
查找以下关键属性:
idVendor(厂商 ID)
idProduct(产品 ID)
serial(设备序列号,保证唯一性)
devpath 或 busnum(用于定位设备)
例如:
pgsql
复制
编辑
ATTRS{idVendor}=="0424"
ATTRS{idProduct}=="274e"
ATTRS{serial}=="000123456789"
2. 创建 udev 规则
在 /etc/udev/rules.d/ 目录下创建一个新规则文件,例如 99-lan8670.rules:
bash
复制
编辑
sudo nano /etc/udev/rules.d/99-lan8670.rules
添加如下内容:
bash
复制
编辑
SUBSYSTEM=="usb", ATTRS{idVendor}=="0424", ATTRS{idProduct}=="274e", ATTRS{serial}=="000123456789", SYMLINK+="evb-lan8670-1"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0424", ATTRS{idProduct}=="274e", ATTRS{serial}=="000987654321", SYMLINK+="evb-lan8670-2"
解释:
SUBSYSTEM=="usb" → 仅匹配 USB 设备
ATTRS{idVendor}=="0424" → 设备厂商 ID
ATTRS{idProduct}=="274e" → 设备产品 ID
ATTRS{serial}=="000123456789" → 通过唯一序列号区分设备
SYMLINK+="evb-lan8670-1" → 设备将映射到 /dev/evb-lan8670-1
如果是 USB 串口设备(如 /dev/ttyUSBx),则可以使用:
bash
复制
编辑
SUBSYSTEM=="tty", ATTRS{idVendor}=="0424", ATTRS{idProduct}=="274e", ATTRS{serial}=="000123456789", SYMLINK+="ttyLAN8670_1"
3. 重新加载 udev 规则
执行以下命令,使新规则生效:
bash
复制
编辑
sudo udevadm control --reload-rules
sudo udevadm trigger
然后拔掉 USB 设备,再次插入,检查 /dev/ 目录:
bash
复制
编辑
ls -l /dev/evb-lan8670-*
如果一切正常,应该看到:
bash
复制
编辑
lrwxrwxrwx 1 root root 10 Mar 24 12:00 /dev/evb-lan8670-1 -> /dev/ttyUSB0
lrwxrwxrwx 1 root root 10 Mar 24 12:00 /dev/evb-lan8670-2 -> /dev/ttyUSB1
4. 确保规则在启动时生效
有时设备会在系统启动时被动态分配不同的 /dev/ttyUSBx,可以通过 systemd 确保规则加载:
bash
复制
编辑
sudo systemctl restart udev
5. 额外建议
如果设备没有唯一序列号,可以用 KERNELS 或 DEVPATH 进行匹配:
bash
复制
编辑
KERNELS=="1-1.3", SUBSYSTEM=="usb", SYMLINK+="evb-lan8670-1"
可以在 /var/log/syslog 或 journalctl -xe 查看 udev 规则是否生效。
结论
通过 udev 规则,我们可以确保 EVB-LAN8670-USB 设备不会因多个设备插入而发生名称混乱。现在,即使多次插拔,它们都会保持固定的 /dev/evb-lan8670-* 设备节点名称。
可以试试看,如果有问题可以提供 udevadm info 的输出
|