Kernel

ttyS1/uart1 已初始化,但無法通過 /dev/ttyS1 訪問

  • October 16, 2013

我不確定我在哪個級別遇到問題。

系統是LeopardBoard DM368,執行TI自家的SDK/LSP/BusyBox核心,核心Linux核心為2.6.x所以採用serial_core.c驅動模型。

預設情況下,系統啟用了一個 UART,即 UART0,/dev/ttyS0它也通過 bootargs 使用/呼叫console=ttyS0,115200n8 earlyprintk

我們想要啟用 UART1 /dev/ttyS1,因此已經完成了設置 pinmux、時鐘等的低級板初始化程式碼。

在啟動時,低級 init 報告(通過我添加的 printk)它啟用了 UART1,並且驅動程式碼也報告了快樂:

[    0.547812] serial8250.0: ttyS0 at MMIO 0x1c20000 (irq = 40) is a 16550A
[    0.569849] serial8250.0: ttyS1 at MMIO 0x1d06000 (irq = 41) is a 16550A

但是,埠沒有出現在/dev/(as /dev/ttyS1) 中,並且它的狀態(流控制位)存在差異,我懷疑這可能導致它掛起/從不傳輸:

cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A mmio:0x01C20000 irq:40 tx:97998 rx:0 CTS|DSR
1: uart:16550A mmio:0x01D06000 irq:41 tx:0 rx:0 DSR

如果我嘗試從命令行配置或修改它,我會收到錯誤消息:

>: stty -F /dev/ttyS1
stty: can't open '/dev/ttyS1': No such file or directory

奇怪的是,如果我將 bootargs 更改為console=ttyS1,115200n8 earlyprintk埠可以正常工作,並且 ttyS0 仍然可以正確初始化並且也可以正常工作:

cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A mmio:0x01C20000 irq:40 tx:0 rx:0 CTS|DSR
1: uart:16550A mmio:0x01D06000 irq:41 tx:11563 rx:0 RTS|DTR|DSR

現在,這很好,但我們的引導載入程序必須使用 UART0,因此最好將所有控制台內容保留在 ttyS0 上,並為我們的輔助通信使用 ttyS1。

我在serial_core.c 中插入了幾個printk,似乎從未為ttyS1 呼叫uart_open(),我假設它是Linux 初始化/啟動序列中需要修改的東西?

已編輯:因為我通過echo >/dev/ttyS1創建一個名為的文件/dev/ttyS1來欺騙自己,這使事情變得有些模糊。我現在有 99% 的把握永遠不會/dev/ttyS1被創造出來。

mknod /dev/ttyS1 c 4 65

(如果/dev是只讀的,則使用任何不帶選項安裝的可寫目錄nodev

如果節點創建時沒有錯誤,您可以檢查您的更新檔是否正在讀取/寫入節點或使用任何終端仿真器。

問題是沒有創建節點?

如果您正在使用一些自動魔術動態開發 fs 之類的devfs或者中間udev可能存在一些註冊問題(但我認為不是因為大多數程式碼都與調出 ttyS0 相同,我猜添加串列埠就像添加某個平台文件中數組中的配置行)。

如果您沒有像這樣使用 dev fs,則可能您MAKEDEV在建構樹的某個位置有一個文件,可以在其中手動添加一行以靜態創建新設備。我還看到了一個系統,其中開發節點是由初始化腳本創建的。

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