Linux

如何辨識新板上的串口

  • January 21, 2022

我正在使用 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 視為ttyS0ttyAMA0. 但是,當您使用 USB 轉串口 (3.3v) 電纜連接另一台電腦以查看 RasPi 的控制台輸出時,將串列端插入 RasPi 上相應的 GPIO 引腳,將 USB 端插入另一台電腦,另一台電腦會如果另一台電腦也在執行 Linux,請將USB 轉串口適配器視為ttyACM0ttyUSB0(取決於確切的 USB 轉串口適配器類型)。

如果將 USB 轉串口適配器晶片集成到您的定制板上,以允許使用簡單的 USB 電纜訪問其串列控制台,那麼情況將是相同的:用於查看控制台的另一台電腦可能會看到一個ttyACM0設備(因為它看到一個聲稱支持 USB 抽象控制模型的 USB 串列設備)。

但是 ARM 設備本身會使用它自己的一個 UART 連接到轉換器晶片的串列端。ARM 設備端的串列設備名稱由 ARM 端使用的 UART 決定,而不是由 USB 轉串口轉換器晶片的串列埠端決定。

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