是否可以通过直接 USB 将 Linux 设备用作串行设备?

是否可以通过直接 USB 将 Linux 设备用作串行设备?

我一直在读关于串行控制台。假设我有一部 Android 手机,想要从计算机读取其串行输出。我可以为手机编译内核,没有问题。

我在文章中看到类似 /dev/ttyUSB0 的内容。我是否需要为设备编写自己的驱动程序才能在计算机上看到控制台?

答案1

假设我有一部 Android 手机,想要从计算机读取其串行输出。

如果你想这样做,你需要手机上的内核驱动程序支持的串行硬件(你不太可能找到它,或者如果有的话,你需要打开你的手机和焊线以主板),或

我在文章中看到类似 /dev/ttyUSB0 的内容

您的内核需要将 USB 端口置于主机模式,并且您必须将 USB 串行设备作为客户端连接到它。 (然后您必须将该设备的串行端口连接到其他串行端口)。

会使控制台在计算机上可见吗?

有更简单的方法可以做到这一点,例如使用 netconsole(然后需要为网络配置 USB)。

答案2

我看到通过 USB 访问 Android 设备上的控制台的三个选项。 USB-OTG、USB-C 双角色端口和 USB 3.x 主机到主机通信。

USB-OTG 是一项因 USB-C 和 USB 3.x 的使用而在很大程度上变得多余和过时的规范。尽管在某些 Android 系统上,这似乎仍然很流行。从技术上讲,USB-OTG 需要使用 USB micro-AB 端口,但似乎许多 Android 设备制造商违反了规范的这一部分,并在 micro-B 端口上支持 USB-OTG。这种方式很受欢迎,因为它允许使用“配件充电适配器”,为 Android 手机/平板电脑/任何设备供电,并提供标准 USB-A 端口来插入标准 USB 外围设备。标准 USB 外设(例如 USB 转串口适配器)可提供控制台调试端口。设备手册应指定 Android 设备是否支持 USB-OTG。

USB-C 双重角色端口意味着该端口可以在主机或外设模式下运行。我相信所有配备 USB-C 的 Android 手机都将具有双重角色端口。与计算机的物理连接非常简单,任何 USB-C 到 USB-C 电缆或 USB-A 到 USB-C 电缆都可以工作。要使 Android 设备作为串行设备呈现给计算机,需要正确的驱动程序和配置。我自己没有尝试过,但在互联网上的快速搜索引起了我的注意:https://android.googlesource.com/kernel/msm/+/android-7.1.0_r0.2/drivers/usb/gadget/function/u_serial.c 我将把如何让它工作的细节发现作为读者的练习。

USB 3.x 允许主机到主机通信。 Linux 中支持此功能已有一段时间了。我自己没有这样做过,但我知道它是可用的。我将再次提供一个链接,给出一些有关其工作原理的提示,并将详细信息留给读者:https://docs.kernel.org/driver-api/usb/usb3-debug-port.html

注意:如果采用 USB 主机到主机选项,请务必小心所使用的电缆类型。有许多 USB-A 转 USB-A 电缆不符合 USB 3.x 规范。符合规范的电缆不会连接 Vbus,并且也会使 USB 2.0 D+/D- 线保持未连接状态。同样令人困惑的是 USB-A 到 USB-A 电缆,其中含有电子器件,使电缆看起来像两个背对背连接的串行或网络适配器。从技术上讲,这些不是 USB 电缆,而是 USB 设备。它们有助于将 Android 串行控制台连接到另一台计算机,但它们需要与主机到主机 USB 3.x 调试电缆不同的设置。人们如何知道他们正在使用正确类型的电缆?这很复杂,需要花费很多时间来解释,超出了这个问题的范围,值得单独讨论。

这涵盖了 USB 串行控制台的使用,但还有其他选项。可以选择蓝牙虚拟串行端口(使用内置蓝牙或通过 USB 添加)、网络控制台(通过内置 Wi-Fi、USB 到 Wi-Fi 适配器或 USB 到以太网适配器) )、使用带有 DisplayPort 和 USB-A 端口的 USB-C 扩展坞的控制台,以及可能的更多。

我意识到我留下的问题很可能多于答案。这里的篇幅有限,无法描述每种方法的工作原理,而最初的问题是这是否可能。是的,这是可能的,我就如何可能实现提供了几种选择。如何让它们发挥作用是另一个问题。

相关内容