AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 687137
Accepted
Nathan Johnson
Nathan Johnson
Asked: 2022-01-20 19:24:43 +0800 CST2022-01-20 19:24:43 +0800 CST 2022-01-20 19:24:43 +0800 CST

如何识别新板上的串口

  • 772

我正在使用 yocto 移植基于 I.MX233 的定制板,我想知道您最初是如何设置“控制台”内核参数的?

内核是根据设备树中首先提到的还是通过内存地址分配串行设备?

你怎么知道控制台名称会叫什么?例如:ttyACM0、ttyS0,甚至是serial0

linux console
  • 1 1 个回答
  • 499 Views

1 个回答

  • Voted
  1. Best Answer
    telcoM
    2022-01-21T02:33:42+08:002022-01-21T02:33:42+08:00

    内核是根据设备树中首先提到的还是通过内存地址分配串行设备?

    这可能取决于适用于硬件的确切串行驱动程序:如果它具有某种自动探测能力,它可能会通过内存地址(或对相关自动探测机制有意义的任何东西);否则它可能会按设备树顺序排列。

    你怎么知道控制台名称会叫什么?

    默认名称将由驱动程序指定:如果硬件基于经典的 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) 实现。

    所以已经描述了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 转串口转换器芯片的串行端口端决定。

    • 2

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve