我正在使用 yocto 移植基于 I.MX233 的自定义板,我想知道您最初如何设置“控制台”内核参数?
内核是根据设备树中首次提到的还是根据内存地址来分配串行设备的?
您如何知道控制台名称将被称为什么?例如:ttyACM0、ttyS0,甚至serial0
答案1
内核是根据设备树中首次提到的还是根据内存地址来分配串行设备的?
这可能取决于适用于硬件的确切串行驱动程序:如果它具有某种自动探测能力,它可能会通过内存地址(或任何对相关自动探测机制有意义的东西);否则它可能按设备树顺序排列。
您如何知道控制台名称将被称为什么?
默认名称将由驱动程序决定:如果硬件基于经典 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 硬件元素的大量系统信息,例如串行端口、中断控制器等。
在某些情况下(例如,如果在没有ISAPnP的ISA总线的非常旧的系统上运行),可能没有可用的此类硬件信息,但有某些行业标准约定,例如在I处具有前四个8250兼容串行端口。 /O 基地址按此顺序为 0x3f8、0x2f8、0x3e8 和 0x2e8。此类约定可以允许串行端口驱动程序仔细探测某些地址并查看它们是否像 UART 一样响应,但是如果以非常规方式配置,这可能会导致系统崩溃或挂起,因此在现代,这样的“通过盲目地探索进行自动探测”被认为是绝对的最后手段,如果可能的话应该避免。
在 ARM 硬件上,这些都可能不可用。由于 ARM 硬件差异很大(从微型 Raspberry Pi Zero 到具有大量 PCIe 插槽的多处理器服务器系统),并且具有不同的系统总线架构,因此尝试自动探测将是徒劳的。相反,当将 Linux 移植到新的 ARM 系统类型时,首要任务之一是编写设备树描述,该描述将告诉内核系统有哪些硬件元素、它们在处理器地址空间中的位置以及哪个驱动程序用于控制它们中的每一个。
如果该系统在其设计中包括自动探测总线,设备树描述只需描述任何此类总线的总线控制器;然后,相应的总线控制器驱动程序将能够自动探测该总线的其余部分。
例如,要识别 Raspberry Pi 上的串行端口,您首先要查看硬件文档。由于 RasPi 是专门为 Linux 使用而开发的,因此设备树描述已经存在。但我们假设您是从头开始。
将 Linux 移植到新的 ARM 硬件平台时,您将从硬件数据表开始。对于 RasPi 来说,就是这个。
在第 8 页,您将找到第一次提到“迷你 UART”及其寄存器地址。如果您熟悉 8250 兼容 UART,那么寄存器布局应该对您来说很熟悉;不过,您应该继续阅读第 10 页,其中更详细地描述了迷你 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。在迷你 UART 和 PL011 UART 上。本节介绍 PL011 UART。关于Mini UART 的详细介绍请参见2.2 Mini UART。
PL011 UART 是通用异步接收器/发送器。这是 ARM UART (PL011) 实现。
因此,迷你 UART 已经进行了描述,此描述适用于其他 UART,即“PL011 UART”或“ARM UART”,即这种类型的 UART 在某种程度上特定于 ARM 设计。
您可以在 google 上搜索“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 编写设备树描述,则需要该地址。
所以拉斯皮本身会将其 UART 视为ttyS0
和ttyAMA0
。但是,当您使用 USB 转串口 (3.3v) 电缆连接另一台计算机以查看 RasPi 的控制台输出时,将串行端插入 RasPi 上相应的 GPIO 引脚,将 USB 端插入另一台计算机时,其他电脑会看到USB转串口适配器asttyACM0
或ttyUSB0
(取决于具体的 USB 转串口适配器类型)(如果另一台计算机也运行 Linux)。
如果 USB 转串口适配器芯片集成到您的定制板中,以允许使用简单的 USB 电缆访问其串行控制台,那么情况将是相同的:用于查看控制台的另一台计算机可能会看到一个ttyACM0
设备(因为它看到一个声称支持 USB 抽象控制模型的 USB 串行设备)。
但 ARM 设备本身会使用自己的 UART 之一来连接到转换器芯片的串行侧。 ARM设备端的串行设备名称由ARM端使用的UART决定,不是通过USB转串口转换芯片的串口端。