修復了 Linux/Raspberry Pi OS 中 SPI-UART 適配器的 tty 設備分配
我需要使用從 SC16IS752 適配器獲得的串列埠。我已經從 /boot/config.txt 設置了它們,它們在 /dev 中顯示為 ttySC0、ttySC1、ttySC2 和 ttySC3,它們可以工作。
問題是,每當我啟動 Raspberry 時,埠的命名缺乏一致性:有時設備連接到 ttySC0,有時連接到 ttySC2。
我試圖四處尋找幫助,但我找到了僅適用於 USB-UART 適配器的解決方案:它是為每個物理設備創建符號連結。我試圖遵循的解決方案是這個:
我試圖應用相同的點,但我注意到參數有幾個不同,所以我被卡住了。
那麼…如何為從 SPI-UART 適配器提供的串列埠創建符號連結?
先感謝您。
所以……我自己找到了解決方案。
太糟糕了,解決方案不能被概括,因為它是“學習 udev 和 rules.d 的工作方式”。
要點是使用命令了解有關設備的所有可能細節(正如我在我的問題中提到的文章中所建議的那樣):
udevadm info -a -p $(udevadm info -q path -n /dev/ttySC0)
然後查找可以使用哪些參數來唯一地查找該設備的硬體描述,並在**/etc/udev/rules.d**中的一個文件中創建有關它的規則。
我個人使用本指南來學習我所知道的關於 udev 和 rules.d 的一切:
總而言之,您必須使用參數來查找硬體,然後使用 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>**中找到。