如何辨識新板上的串口
我正在使用 yocto 移植基於 I.MX233 的定制板,我想知道您最初是如何設置“控制台”核心參數的?
核心是根據設備樹中首先提到的還是通過記憶體地址分配串列設備?
你怎麼知道控制台名稱會叫什麼?例如:ttyACM0、ttyS0,甚至是serial0
核心是根據設備樹中首先提到的還是通過記憶體地址分配串列設備?
這可能取決於適用於硬體的確切串列驅動程序:如果它具有某種自動探測能力,它可能會通過記憶體地址(或對相關自動探測機制有意義的任何東西);否則它可能會按設備樹順序排列。
你怎麼知道控制台名稱會叫什麼?
預設名稱將由驅動程序指定:如果硬體基於經典的 8250 晶片或其後代/複製/兼容晶片,則使用
ttyS<N>
樣式名稱有一個很好的先例。其他驅動程序有自己的命名方案。這些
ttyACM<N>
名稱正確地指代 USB 調製解調器和 ISDN 適配器的 USB 抽象控制模型驅動程序;帶有內置 USB 串列適配器的串列控制台可能會將自己顯示為符合該規範的 USB 設備,以使其無需供應商特定的 USB 串列適配器驅動程序即可使用。但這僅意味著您已將開發板連接到的開發工作站會將 USB 串列控制台視為/dev/ttyACM0
;板本身會將其視為普通串列埠(對於板的硬體架構而言,無論是“普通串列埠”)。(從技術上講,建構一個在“兩端”提供 ACM 介面的 USB 介面設備可能是可行的,但是作為控制台,這將是不利的,因為它需要啟動非常複雜的 USB 子系統才能用作控制台。通常,您希望控制台設備盡可能簡單,以便在啟動過程中儘早使用它,以便更輕鬆地調試初始化其他硬體時出現的任何問題。)
在 ARM 架構上,第一個串列埠可能使用 AMBA PrimeCell UART(也稱為 PL011 UART)實現,這將導致它
ttyAMA0
由核心驅動程序命名。您說“我正在使用 yocto 移植基於 I.MX233 的定制板”。這是否意味著您正在努力讓 Linux 在迄今為止從未在 Linux 上執行過的定制板類型上執行?如果是,那麼您首先需要硬體數據表:您需要編寫自定義硬體的設備樹描述,或調整大致相似的現有設備樹描述。為此,您需要了解(或弄清楚)該板上的每個硬體元素,並為每個硬體元素辨識(或編寫,在最壞的情況下)適當的 Linux 驅動程序。您還需要找到硬體元素的基地址(或驅動程序訪問硬體元素所需的任何內容)。
在 PC 硬體上,系統硬體/韌體可以通過多種方式進行自我描述:PCI/PCIe 匯流排具有一組指定的標準特性,每個 PCI/PCIe 設備都必須具備,旨在允許自動檢測匯流排上的任何設備. ACPI 韌體還將提供有關不在 PCI(e) 匯流排上的任何 PC 硬體元素的大量系統資訊,例如串列埠、中斷控制器等。
在某些情況下(例如,如果執行在具有 ISA 匯流排且沒有 ISAPnP 的非常舊的系統上),可能沒有此類可用的硬體資訊,但有某些行業標準約定,例如在 I 處具有前四個 8250 兼容串列埠/O 基址依次為 0x3f8、0x2f8、0x3e8 和 0x2e8。這樣的約定可以讓串口驅動程序仔細探測一些地址,看看它們是否像 UART 一樣響應,但是如果它以非正常的方式配置,這可能會導致系統崩潰或掛起,所以在現代這樣的“通過盲目地四處尋找進行自動探測”被認為是絕對的最後手段,應盡可能避免。
在 ARM 硬體上,**這些都可能不可用。**由於 ARM 硬體變化很大(從小型 Raspberry Pi Zero 到具有大量 PCIe 插槽的多處理器伺服器系統),具有不同的系統匯流排架構,因此嘗試自動探測將是徒勞的。相反,當將 Linux 移植到新的 ARM 系統類型時,首要任務之一是編寫設備樹描述,該描述將告訴核心系統具有哪些硬體元素,它們可以在處理器的地址空間中的什麼位置找到,以及哪個驅動程序用來控制它們中的每一個。
如果系統在其設計中包含自動探測匯流排,則設備樹描述只需描述任何此類匯流排的匯流排控制器;然後,相應的匯流排控制器驅動程序將能夠自動探測該匯流排的其餘部分。
例如,要辨識 Raspberry Pi 上的串列埠,您將首先查看硬體文件。由於 RasPis 是專門為與 Linux 一起使用而開發的,因此設備樹描述已經存在。但是讓我們假設你是從頭開始的。
將 Linux 移植到新的 ARM 硬體平台時,您將從硬體數據表開始。對於 RasPi,就是這個。
在第 8 頁,您會發現第一次提到“迷你 UART”,以及它的寄存器地址。如果您熟悉 8250 兼容的 UART,那麼寄存器佈局對您來說應該很熟悉;但是,您應該繼續閱讀第 10 頁,其中更詳細地描述了 mini UART。它說:
實現的 UART 不是 16650 兼容的 UART 但是,前 8 個控制和狀態寄存器盡可能像 16550 UART 一樣佈局。
16550 是原始 8250 PC UART 的後繼產品,並且向後兼容。啊哈!看起來這個 UART 可以用 Linux 的
CONFIG_SERIAL_8250
驅動程序驅動,即類似 PC 的串列埠的驅動程序。結果,這個 UART 將獲得一個預設名稱ttyS0
,因為這正是 Linuc PC 串列埠驅動程序所做的。在第 135 頁開始了對 UART 的另一個描述:
BCM2835 器件有兩個 UART。在 mini UART 和 PL011 UART 上。本節介紹 PL011 UART。關於 mini UART 的詳細資訊,請參見 2.2 Mini UART。
PL011 UART 是通用非同步接收器/發送器。這是 ARM UART (PL011) 實現。
所以已經描述了迷你 UART,這個描述是針對另一個 UART,稱為“PL011 UART”或“ARM UART”,即這種類型的 UART 在某種程度上特定於 ARM 設計。
您可以搜尋“PL011 UART Linux”或
drivers/tty/serial/Kconfig
在 Linux 原始碼包中搜尋“PL011”的文件。您會發現Linux 已經有一個驅動程序,作為核心配置項
CONFIG_SERIAL_AMBA_PL011
。下一個配置選項CONFIG_SERIAL_AMBA_PL011_CONSOLE
允許使用 PL011 UART 作為系統控制台,配置選項描述告訴您啟動參數是console=ttyAMA0
,所以現在您也將知道該 UART 的預設 Linux 名稱,而無需閱讀原始碼實際 UART 驅動程序的程式碼。硬體數據表的第 137 頁標識了 PL011 UART 的基地址,如果您從頭開始為 RasPi 編寫設備樹描述,則需要該基地址。
因此,RasPi 本身會將其 UART 視為
ttyS0
和ttyAMA0
. 但是,當您使用 USB 轉串口 (3.3v) 電纜連接另一台電腦以查看 RasPi 的控制台輸出時,將串列端插入 RasPi 上相應的 GPIO 引腳,將 USB 端插入另一台電腦,另一台電腦會如果另一台電腦也在執行 Linux,請將USB 轉串口適配器視為ttyACM0
或ttyUSB0
(取決於確切的 USB 轉串口適配器類型)。如果將 USB 轉串口適配器晶片集成到您的定制板上,以允許使用簡單的 USB 電纜訪問其串列控制台,那麼情況將是相同的:用於查看控制台的另一台電腦可能會看到一個
ttyACM0
設備(因為它看到一個聲稱支持 USB 抽象控制模型的 USB 串列設備)。但是 ARM 設備本身會使用它自己的一個 UART 連接到轉換器晶片的串列端。ARM 設備端的串列設備名稱由 ARM 端使用的 UART 決定,而不是由 USB 轉串口轉換器晶片的串列埠端決定。