FreeBSD:USB 设备的永久节点

FreeBSD:USB 设备的永久节点

在 FreeBSD 中,USB 设备出现为/dev(例如)/dev/ugen2.5/dev/ugen2.6等...

但是,我注意到重新启动后有时这些指向不同的设备。有没有办法锁定它们,或者让这样的节点/dev/my-usb-device在重新启动后不会改变?

答案1

我不认为你可以锁定,但有一个相当简单的方法可以做到这一点。您需要添加一些内容来在etc/devd.conf特定设备出现时对其进行处理。您需要使用设备的唯一信息(例如其序列号)。以下是处理门铃的 USB 串行端口的示例:

# Set up symlink to doorbell serial port
attach 200 {
        device-name     "uftdi[0-9]";
        match           "vendor"        "0x0403";
        match           "product"       "0x6001";
        match           "sernum"        "A10167K1";
        action          "/root/bin/cuaconfig $device-name doorbell $sernum";
};  

请注意,该操作是运行脚本。这通过不正当的手段计算出真正的串行端口号,然后在/dev.您的程序使用它来访问设备。这是我的脚本,可能比您需要的更多。这个将 USB 设备名称转换为串行端口名称,因为我使用的是 FTDI USB 端口串行芯片。您可能会得到更简单的东西,并且可能不需要翻译。

#!/bin/sh

# configure cuaU? ports - called from devd.conf
# arg 1 - device name, of the form uftdi?
# arg 2 - symlink to create/delete in /dev (any existing one deleted)
# arg 3 - serial number

dev=$1
link=$2
sernum=$3

# get FTDI unit number
ftunit=${dev#uftdi}

# generate full tty name
ttyname="/dev/cua$(sysctl -n dev.uftdi.$ftunit.ttyname)"

# generate full symlink name
symlink="/dev/${link}"

# delete any existing symlink to the port, then create the new one
echo "creating symlink ${symlink} to ${ttyname} on serial ${sernum}" > /dev/console
rm -f ${symlink}
ln -s ${ttyname} ${symlink}`

获取设备的序列号

在这些东西中使用制造商 ID 可能就足够了devd.conf。但是,您可能有两个相同的(我有,它们是 FT232 USB 串行端口)。在这种情况下,您可以通过序列号来区分它们(请注意,一些 FT232 克隆都具有相同的序列号!)

有多种方法可以获取序列号。一是安装端口sysutils/usbutils。其中包含lsusb命令,该命令将列出所有设备。您可以使用:

lsusb -v -s 0403:6001 | grep serial  

获取序列号。

相关内容