这些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 系统类型时,首要任务之一是编写设备树描述,该描述将告诉内核系统具有哪些硬件元素,它们可以在处理器的地址空间中的什么位置找到,以及哪个驱动程序用来控制它们中的每一个。
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。
这可能取决于适用于硬件的确切串行驱动程序:如果它具有某种自动探测能力,它可能会通过内存地址(或对相关自动探测机制有意义的任何东西);否则它可能会按设备树顺序排列。
默认名称将由驱动程序指定:如果硬件基于经典的 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。它说:
16550 是原始 8250 PC UART 的后继产品,并且向后兼容。啊哈!看起来这个 UART 可以用 Linux 的
CONFIG_SERIAL_8250
驱动程序驱动,即类似 PC 的串行端口的驱动程序。结果,这个 UART 将获得一个默认名称ttyS0
,因为这正是 Linuc PC 串行端口驱动程序所做的。在第 135 页开始了对 UART 的另一个描述:
所以已经描述了mini 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 转串口转换器芯片的串行端口端决定。