ttyS1/uart1 已初始化,但無法通過 /dev/ttyS1 訪問
我不確定我在哪個級別遇到問題。
系統是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
在建構樹的某個位置有一個文件,可以在其中手動添加一行以靜態創建新設備。我還看到了一個系統,其中開發節點是由初始化腳本創建的。