我在尝试使用主板上六个串行端口中的四个时遇到问题。
情况是:
我有 6 个可用的串行端口 - ttyS0 到 ttyS5 - 其中 0 个是位于主板边缘的 RS232 端口,其他 5 个是直接位于主板上的串行接头。在标准 BIOS 配置中,这些映射如下:
- ttyS0:IRQ 4
- ttyS1:IRQ 3
- ttyS2:IRQ 10
- ttyS3:IRQ 10
- ttyS4:IRQ 10
- ttyS5:IRQ 10
Linux 使用 dmesg 正确报告这一点,以检查它们的初始设置方式,并且可以使用 setserial 命令来更改这些值。我已将这些写入启动时运行的脚本中,这样我就可以在启动期间自动配置 IRQ、速度和其他一些设置。我无法在 BIOS 中更改其中的大部分,因为对于 2-5,我只能选择使用 IRQ 10。
然而,在该配置中,使用 Python 脚本将 100,000 个字符从一个端口传输到另一个端口(或从外部 PC)时,共享 IRQ 10 的四个端口不起作用。尽管内核中启用了 IRQ 共享并且存在支持此功能的 GPIO 芯片 (Fintek F81866A)。通常,Python 程序会被锁定在端口打开线路上(无论读/写)。 ttyS0 和 ttyS1 使用相同的脚本正确运行,实际上我下面提到的任何测试都使用相同的代码。一个脚本打开一个端口并等待信息,而另一个脚本生成 100,000 个随机字符并发送该信息。有一个基本检查,确保两端的信息是否相同。
当将它们切换到 IRQ 0(轮询模式)时,我可以让它们发挥作用,但速度和稳定性不适合应用程序。如果我将 2-5 中的任何一个更改为 IRQ 并将它们连接到 ttyS0,则在共享 IRQ (4) 时我会获得正常功能,但是当 ttyS0 不活动时(即我要从外部计算机转到 ttyS2-5),它们表现出与设置为 IRQ 10 时相同的行为。
我运行的唯一值得注意的其他测试是禁用 BIOS 中的最后三个端口,因此 ttyS2 是 IRQ 10 上的唯一端口,此时它以与 ttyS0 和 1 相同的速度正常运行。对我来说,这是意味着问题特别出在共享中断上,但是当我尝试将端口移动到其他未占用的 IRQ(如果我没记错的话,为 11 和 12)时,没有任何改进。
特别是当 python 脚本运行 IRQ 3 和 IRQ 4 时,观察中断,其行为正如我所期望的那样,根据需要发生中断,但是,如果我尝试调用设置为 IRQ 10 的其他端口之一,除了当我尝试打开端口时的第一个。当只有一个端口使用 IRQ 10 时,中断的行为与 3 和 4 上的中断相同。
我已经走了几条路来调查为什么会出现这种情况,并且我越来越确信 Fintek 芯片是造成问题的原因。在我的内核 (3.19) 设置和驱动程序中,我可以找到旧 Fintek 产品的参考,但不是这个。我认为芯片有问题的另一个原因是我的主板上有一个 GPIO 接头,它也处于这种奇怪的半功能状态。我可以看到它在那里并正确获取它的 ID,但实际上并没有访问它或超出此范围使用它。
我有哪些选项可以纠正此问题?Fintek IO 控制器是否可能存在某些兼容性问题?我目前正在安装一个较新的内核版本,看看它是否具有对 F81866A 的内置支持,如果需要的话,我没有尝试自己编写一些东西来驱动它的经验。