我需要使用从 SC16IS752 适配器获得的串行端口。我已经从 /boot/config.txt 设置了它们,它们在 /dev 中显示为 ttySC0、ttySC1、ttySC2 和 ttySC3 并且它们可以工作。
问题是,每当我启动 Raspberry 时,端口的命名缺乏一致性:有时设备连接到 ttySC0,有时连接到 ttySC2。
我试图四处寻找帮助,但我找到了仅适用于 USB-UART 适配器的解决方案:它是为每个物理设备创建符号链接。我尝试遵循的解决方案是:
我尝试应用相同的点,但我注意到参数存在一些差异,所以我陷入了困境。
那么...我如何为 SPI-UART 适配器给出的串行端口创建符号链接?
先感谢您。
答案1
所以...我自己找到了解决方案。
遗憾的是,该解决方案无法推广,因为它是“了解 udev 和rules.d 的工作原理”。
要点是使用以下命令了解有关设备的所有可能的细节(正如我在问题中提到的文章中所建议的那样):
udevadm info -a -p $(udevadm info -q path -n /dev/ttySC0)
然后找到可以使用哪些参数来唯一地查找该设备的硬件描述,并在以下文件之一中创建有关它的规则/etc/udev/rules.d。
我个人使用本指南来学习我所知道的有关 udev 和 Rules.d 的一切:
总而言之,您必须使用参数来查找硬件,然后使用 NAME 或 SYMLINK 为其指定一个新名称或只是一个假名。
查找正确硬件最常用的关键字是:
ACTION==“<添加/删除>”- “如果该设备插入/拔出,则适用此规则”
内核==“<值>”- “在 KERNEL 字段中查找具有 <值> 的设备”
子系统==“<值>”- “在子系统字段中查找具有<值>的设备”
驱动程序==“<值>”- “在 DRIVER 字段中查找具有 <值> 的设备”
ATTR{<属性>}=="<值>"- “查找具有属性 <attribute> 和值 <value> 的设备”
如果您想检查某个设备或其所有父设备的匹配情况,您还可以对除 ACTION(KERNELS、SUBSYSTEMS、DRIVERS、ATTRS)之外的所有这些关键字使用复数形式。
显然,每个规则可以使用多个参数,只需用逗号和空格分隔它们即可。
正确找到您的设备后,规则的最后一部分应该是命名/符号链接:
名称=“<值>”- “为找到的设备指定一个新名称(销毁之前的名称)”
SYMLINK+="<值>"- “为找到的设备指定一个替代名称(保留之前的名称)
作为示例,我将使用我必须创建的规则:
KERNELS=="spi0.0", SUBSYSTEM=="tty", ATTR{line}=="0", DRIVERS=="sc16is7xx", ACTION=="add", SYMLINK+="plSerial"
KERNELS=="spi0.0", SUBSYSTEM=="tty", ATTR{line}=="2", DRIVERS=="sc16is7xx", ACTION=="add", SYMLINK+="plSerial"
KERNELS=="spi0.0", SUBSYSTEM=="tty", ATTR{line}=="1", DRIVERS=="sc16is7xx", ACTION=="add", SYMLINK+="mdSerial"
KERNELS=="spi0.0", SUBSYSTEM=="tty", ATTR{line}=="3", DRIVERS=="sc16is7xx", ACTION=="add", SYMLINK+="mdSerial"
他们用人类的话来说:
“如果 tty 设备使用 spi0.0 端口并且其名称为 0 或 2(这意味着它是 ttySC0 或 ttySC2),那么它现在也称为 plSerial”
“如果 tty 设备使用 spi0.0 端口并且其名称为 1 或 3(这意味着它是 ttySC1 或 ttySC3),那么它现在也称为 mdSerial”
这意味着 ttySC0/ttySC2 将始终称为 plSerial,而 ttySC1/ttySC3 将始终称为 mdSerial。
编写规则后,使用udevadm trigger
或重新启动系统,您的规则将被应用。新设备将位于/dev/<您的设备名称>。