USB-OTG 可以用于 U-Boot 和 Linux 控制台吗?

Can USB-OTG be used for U-Boot and Linux consoles?

我有一个自定义的基于 i.MX6Q 的开发板,带有工作的 U-Boot 和 Linux (Ubuntu) 设置。 micro和板子都支持USB-OTG和一个串口;目前,串口服务于 U-Boot 和 Linux 的控制台。然而,我们可能需要将串口用于其他目的,但我们不想为 U-Boot 和 Linux 而失去控制台。是否可以将 USB-OTG 端口用于 U-Boot 和 Linux 的系统控制台?

我做了一些研究,发现了几篇很有前途的文章 here and here,尽管第二篇文章说了这个花絮:

Unfortunately it won't work as system console as the gadget driver is loaded as a module, but we can use it for serial console.

我不确定我是否理解这一点,但听起来该方法不能满足我的需求,即为 U-Boot 和 Linux 系统控制台使用 USB-OTG。我确实尝试了这些方法,但没有成功,这可能意味着 U-Boot 和 Linux 没有正确构建所需的功能。

所以这是我的问题:

  1. 这可以用于 U-Boot 吗?
  2. 这对 Linux 有效吗?
  3. 我是不是疯了才考虑这条路?

如果能提供任何指导(例如教程、示例等),我们将不胜感激。

谢谢!

  1. Can this work for U-Boot?

是的,至少自 U-Boot 版本 2008.10 起,README 文件已说明:

    Define the below if you wish to use the USB console.
        CONFIG_USB_DEVICE
        Define this to build a UDC device

        CONFIG_USB_TTY
        Define this to have a tty type of device available to
        talk to the UDC device

        CFG_CONSOLE_IS_IN_ENV
        Define this if you want stdin, stdout &/or stderr to
        be set to usbtty.

请注意,这些配置符号无法使用 menuconfig 访问,必须在配置文件中启用。
目前至少有五块板使用此 U-Boot 功能,基于 include/configs/ 中文件中 CONFIG_USB_TTY 的出现,例如 include/configs/ti_omap4_common.h

此 USB 配置需要 stdinstdout 环境变量的非默认定义。有关详细信息,请参阅 README 文档。


  1. Can this work for Linux?

是的,Linux(至少从 4.5 版开始)可以在 USB 连接上有一个串行控制台,可以是主机端口上的 USB 转串行适配器,也可以是设备端口上的 USB 串行小工具(使用 CDC/ACM)。

例如,在drivers/usb/gadget/Kconfig中有选择:

config U_SERIAL_CONSOLE
    bool "Serial gadget console support"
    depends on USB_G_SERIAL
    help
       It supports the serial gadget can be used as a console.

在 Linux 5.7.8 内核中,只有两块板具有使用此功能的默认配置,例如参见 [​​=23=]。

除了构建必要驱动程序的正确配置外,串行小工具控制台还需要 (1) 内核参数规范(例如 console=ttyGS0,...),以及 (2) 由 getty 命令(例如在 inittab 文件中)。


  1. Am I insane for contemplating this path?

无评论。

请注意,如果您遇到内核启动问题,Linux serial-gadget 控制台不支持 earlycon 也不支持 earlyprintk能力。

就我个人而言,我更喜欢使用一个连续的 link,无论目标板的状态如何,它都是持久的。这确保了终端仿真器程序不会抱怨丢失的连接。


附录

不幸的是,USB 串行小工具上的这个 Linux 控制台不显示内核生成的引导消息(在登录提示之前),即使所有驱动程序都静态地 linked 到内核中图片。
尽管系统日志中有类似

的消息
console [ttyGS0] enabled
g_serial gadget: g_serial ready
... 
gs_open: ttyGS0 ((ptrval),(ptrval))

在显着 Freeing unused kernel memory 消息之前,主机端不会收到任何控制台消息,直到用户空间处于活动状态。

本指南中也报告了此缺点:https://linux-sunxi.org/USB_Gadget/Serial