Raspberry-Pi

修復了 Linux/Raspberry Pi OS 中 SPI-UART 適配器的 tty 設備分配

  • December 7, 2021

我需要使用從 SC16IS752 適配器獲得的串列埠。我已經從 /boot/config.txt 設置了它們,它們在 /dev 中顯示為 ttySC0、ttySC1、ttySC2 和 ttySC3,它們可以工作。

問題是,每當我啟動 Raspberry 時,埠的命名缺乏一致性:有時設備連接到 ttySC0,有時連接到 ttySC2。

我試圖四處尋找幫助,但我找到了僅適用於 USB-UART 適配器的解決方案:它是為每個物理設備創建符號連結。我試圖遵循的解決方案是這個:

如何以靜態名稱綁定 USB 設備?

我試圖應用相同的點,但我注意到參數有幾個不同,所以我被卡住了。

那麼…如何為從 SPI-UART 適配器提供的串列埠創建符號連結?

先感謝您。

所以……我自己找到了解決方案。

太糟糕了,解決方案不能被概括,因為它是“學習 udev 和 rules.d 的工作方式”。

要點是使用命令了解有關設備的所有可能細節(正如我在我的問題中提到的文章中所建議的那樣):

udevadm info -a -p  $(udevadm info -q path -n /dev/ttySC0)

然後查找可以使用哪些參數來唯一地查找該設備的硬體描述,並在**/etc/udev/rules.d**中的一個文件中創建有關它的規則。

我個人使用本指南來學習我所知道的關於 udev 和 rules.d 的一切:

編寫 udev 規則

總而言之,您必須使用參數來查找硬體,然後使用 NAME 或 SYMLINK 給它一個新名稱或只是一個化名。

查找正確硬體的最常用關鍵字是:

ACTION=="<add/remove>" - “此規則適用於此設備已插入/已拔出”

KERNEL=="<value>" - “在 KERNEL 欄位中查找具有 <value> 的設備”

SUBSYSTEM=="<value>" - “在 SUBSYSTEM 欄位中查找具有 <value> 的設備”

DRIVER=="<value>" - “在 DRIVER 欄位中查找具有 <value> 的設備”

ATTR{<attribute>}=="<value>" - “查找具有屬性 <attribute> 和值 <value> 的設備”

如果您想檢查與設備或其所有父設備的匹配,您還可以對除 ACTION (KERNELS, SUBSYSTEMS, DRIVERS, ATTRS) 之外的所有這些關鍵字使用複數。

顯然,每個規則可以使用多個參數,只需將它們用逗號和空格分隔即可。

正確找到您的設備後,規則的最後一部分應該是命名/符號連結:

NAME="<value>" - “給找到的設備起這個新名稱(破壞之前的設備)”

SYMLINK+="<value>" - “給找到的設備一個替代名稱(保留前一個)

例如,我將使用我必須創建的規則:

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/<your_device_name>**中找到。

引用自:https://unix.stackexchange.com/questions/677745