这个问题很难完全解释,我提前道歉,但是请阅读整个描述?谢谢。
注意:我发布这篇文章主要是为了记录它,只是询问有关如何识别需要更新的 Linux 映像部分以解决此问题的建议,也许有人会看到它并找到解决方法。在 30 多年的串行 TTL 通信工作中,我从未遇到过这样的问题。
我有一个嵌入式板,出于安全/带宽原因,无法轻松更新。小的更新是可能的,但不是目标。除了修复它之外,我还想了解系统的哪个部分包含这些驱动程序以供我自己的教育使用。我不仅想解决问题,我还想了解问题。
该板有一个 USB 连接器,我可以插入不同的设备,它们通常都能工作。例如键盘、wifi 适配器等。
当我想与外部串行设备(例如 Arduino 或其他设备)通信时,我常用的一种设备是串行 TTL 适配器。
当我将这些适配器直接插入 USB 端口时,它们可以完美工作。我通常使用 CP210x,最常见的是 CP2102 / 2104,但也使用过 CH340s、FTDI 等...没有问题。
最近,我有一个应用程序,我需要同时连接两个 USB 设备,所以我添加了一个小型 USB 集线器。通过 HUB 插入串行 TTL 适配器后,我发现大约 678uS 后发送的任何数据都会被切断。 (!?)
例如,一组示波器跟踪的屏幕截图以灰色显示了直接插入串行 TTL 适配器时的跟踪,蓝色跟踪显示了通过集线器插入时的跟踪。
显示问题的范围跟踪屏幕截图
正如您所看到的,数据截断了中间字节。后来的测量表明,无论数据长度或波特率如何,时间都是一致的+/-大约20uS。
这发生在 x3 集线器和 x3 适配器上。
我尝试为集线器供电。一个带有自己的适配器,另一个有标准电源连接,第三个有电源引脚,我将其连接到工作台电源。这没有什么区别。
这不是 RS232,因此不存在电荷泵故障。我监控了芯片的供电情况,没有断电的情况。
当插入 PC x2 操作系统(Ubuntu 20.04、Windows 11)时,相同的集线器和适配器可以完美工作。
我的假设是嵌入式映像中的 USB 驱动程序存在问题。再说一次,我无法更新它,除非是小范围的更新,而我的真正目标是无论如何都要理解这个问题。
- 实际问题是:Linux 堆栈的哪一部分控制着这个?
- 额外加分:您将如何仅更新该部分?
- 额外额外的学分:你以前见过吗?
答案1
找出 Linux 内核中的问题所在所需的工作量将非常大。如果找到它,修复它需要您重新编译内核。您需要拥有嵌入式设备中当前源的确切版本及其构建环境(编译器等)。 [这就是 Yocto 在此类硬件中如此受欢迎的原因之一,因为它可以让您保留重建某些内容所需的所有内容的快照]。
理想的继续方法是在主板或 PC 上重现问题,您可以在其中轻松下载并尝试不同的内核版本,直到找到有问题和没有问题的两个最接近的版本。然后,您可以查看内核源代码中的差异,以获取有关修复内容的线索。
要浏览源并尝试找出问题,您可以在以下位置找到主机集线器驱动程序 ehci-hcd.c 对于USB2,以及 xhci-hub.c 对于USB3。通用外部集线器驱动程序位于 集线器c。 USB 串行适配器例如 ch341.c。上述网址允许您更改为不同版本的内核。如果您返回到早期版本的内核,您可能会发现文件名已更改。有一些关于usb代码的文档这里。
例如,您可以在 github 上找到相同的文件
ch341.c,如果您单击责备按钮,您可以获得带注释的列表,其中给出了每行当前内容的原因。这历史按钮提供更改列表。您可以使用git
在本地下载此内核树,并使用 git 工具来搜索提交更改并提取给定版本的源代码。