11

我们有一个基于 Atom Z510/Intel SCH US15W Q7 卡(运行 Debian Linux)的系统。我们需要从低引脚数总线上的设备传输数据块。据我所知,该芯片组不提供 DMA 功能,这意味着处理器必须在软件循环中一次读取一个字节的数据。(设备驱动程序实际上是使用“rep insb”x86 指令来实现的,所以如果我理解正确的话,循环实际上是由 CPU 实现的。)

这远非最佳,但应该可以达到 14Mb/​​s 的传输速率。相反,我们几乎无法管理 4Mb/s,总线上的事务间隔不小于 2us,即使对从设备的每次读取都是在 560ns 内完成的。我不认为公共汽车上的其他交通是罪魁祸首,但仍在调查。

我的问题是:

有谁知道SCH上是否有任何可能影响LPC总线时序的配置寄存器?

我在英特尔网站上找不到有关该设备的任何有用信息,也没有在 Linux 内核代码中发现任何似乎在摆弄任何此类寄存器的东西(但在涉及 Linux 内核的东西时,我是个菜鸟。)

我不是 x86 专家,因此任何其他可能起作用的因素或与此设备相关的任何其他“战争故事”也很高兴知道。

编辑:我找到了数据表。我没有看到任何解释这种行为的东西,但我正在研究将我们的设备映射为固件设备的可能性,因为固件总线周期似乎没有遭受同样的延迟。

4

1 回答 1

1

作为记录,解决方案是修改 FPGA 固件,使芯片的数据输入/输出寄存器映射到四个相邻地址,并将驱动程序修改为执行 32 位 inb/outb 指令。尽管 SCH 没有实现 32 位 LPC 读/写操作,但结果是 4 次背靠背 8 位操作,其后的死区时间与我之前使用单个字节得到的相同,这意味着它平均每个字节大约 1us。不理想,但吞吐量仍然翻了一番。

事实证明,固件周期更快,因为 SCH 一次从固件闪存传输 64 个字节 - 在 64 个字节之后有相同的 1.4us 间隙,表明这是设备的每次事务延迟。利用它可能比上述解决方案稍微快一些,但权衡是它被限制为 64 字节块,并且每个字节需要更长的时间(680ns IIRC),因为执行固件读取需要额外的周期。

于 2015-04-26T00:23:29.770 回答