我们有一个基于Atom Z510/Intel SCH US15W Q7卡(运行Debian Linux)的系统。我们需要从低引脚数总线上的设备传输数据块。据我所知,该芯片组不提供DMA功能,这意味着处理器必须在软件循环中一次读取一个字节的数据。 (设备驱动程序实际上是使用“rep insb” x86指令来实现的,因此,如果我理解正确,则实际上是由CPU实现了循环。)
这远非最佳,但应该可以达到14Mb/s的传输速率。相反,我们几乎无法管理4Mb/s的事务,即使在总线上的事务间隔不超过2us,即使对从设备的每次读取都在560ns内完成。我不认为应该怪巴士上的其他交通,但仍在调查中。
我的问题是:
我不是x86专家,因此可能会影响到该设备的任何其他因素或任何其他“ war 故事”也是很好的了解。
编辑:我已经找到了datasheet。我没有看到任何能解释这种现象的信息,但是我正在研究将我们的设备映射为固件设备的可能性,因为固件总线周期似乎并没有受到相同的延迟。
最佳答案
为了记录,解决方案是修改FPGA固件,以便将芯片的数据输入/输出寄存器映射到四个相邻地址,并修改驱动程序以执行32位inb/outb指令。尽管SCH并未实现32位LPC读/写操作,但结果是4个背对背8位操作,后跟与我以前使用单个字节获得的死区时间相同,这意味着平均每个字节约1us。并不理想,但吞吐量仍然是原来的两倍。
它可以更快地显示固件周期,因为SCH一次从固件闪存中传输了64个字节-64个字节之后存在相同的1.4us间隙,这表明这是设备的每次事务处理延迟。利用它的速度可能比上述解决方案快一点,但是要权衡的是,它限制为64个字节的块,并且由于执行固件读取需要额外的周期,因此每个字节花费的时间更长(680 IRC IIRC)。
关于embedded - Poulsbo系统 Controller 中枢(US15W)中LPC总线的配置寄存器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19071793/