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

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 init/startup序列中需要修改的東西?

已編輯:因為我欺騙了自己,做了一個echo >/dev/ttyS1創造了一個文件稱為/dev/ttyS1,這在一定程度上使問題變得模糊。我現在 99% 確定/dev/ttyS1絕不創建的。

答案1

mknod /dev/ttyS1 c 4 65

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

如果建立的節點沒有錯誤,您可以檢查您的補丁是否正在讀取/寫入該節點或使用任何終端模擬器。

問題是節點沒有創建?

如果您正在使用一些自動魔法動態開發檔案系統devfs,或者udev可能有一些登記中間的問題(但我認為不是,因為大多數程式碼與調出 ttyS0 是相同的,我猜添加串行端口就像在某些平台文件的數組中添加配置行)。

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

相關內容