PLX9056 PCI卡驱动:PCI 总线

涉及规范:PCI规范(不含PCIe)

硬件:PLX9056

OS:RHEL6.2

由于PLX的驱动版权为PLX所有(已经被收购),所以红帽中默认不会带其驱动。

一些典型情况例如博通的网卡驱动也是这样。


PCI总线规定了0x40字节(64字节)的数据结构方式。

这64字节包括内容:

1 设备信息:来自设备商(vendor). 以PLX9056为例子,包括设备厂商名称,设备ID(9056)

2 BAR信息(从BAR0到BAR5,共6个寄存器),每个BAR的信息,需要和PLX9056的产品手册(data book)合作,由厂商定义BAR的使用方法。9056中,BAR0, BAR2, BAR3分别对应IO寄存器,space0, space1的信息。在PLX提供的API中,由于deviceObject这个抽象属性(PLX_API的第一个参数,即设备对象),需要这些BAR信息来为API中写入寄存器提供写入地址,所以需要初始化,获得这些BAR信息。在初始化时,并不需要写入BAR。写入工作由PLX API协助完成了。

3 中断信息。

中断线是驱动用来向其中写入中端号用的。中断线的值是被动产生的,由驱动写入。在9056手册中,默认重启后此处值为0.

另一中端信息用于表示中端针脚。包含4位,对应INTA到INTD. 在9056手册中,此部分默认值为INTA=1, 其他为0.所以这4位结果就是1.


驱动操作的方式:

0 无驱动时。RHEL启动时,能自动识别出9056。驱动来源不清楚。估计来自默认PCI卡处理。RHEL不会把PLX的驱动自动集成进去。

此时默认PCI处理如下:

0.1 pci_probe出所有pci设备,9056的设备ID会被识别出来。

0.2 根据PCI中端信息(最后4位,即INTA到INTD)确认出IRQ值。9056单卡时IRQ为10.在PCI槽插入两张卡,每张的IRQ都是10.这种情况是不被允许的。因为中端号冲突,导致两张卡无法处理一个中断。(为什么kernel不加以区分呢?FIXME)

0.3 如果IRQ非空,将中断线的结果赋给IRQ值 。(为什么IRQ=10?FIXME)

以上在kernel中可查到代码。(pci.c, probe.c)

1 有驱动时。驱动是ko文件,做的工作包括

1.1 初始化

枚举获得所有9056设备

设置设备打开,关闭处理函数。

1.2 open

设置中断号,

注册中端号对应的处理函数。

1.3 close/clean

此处可参考PLX9056驱动源码,官网注册后可得。


PLX API又是什么?

PLX API是驱动的补充,是应用程序访问kernel的操作的接口函数。

API的通讯采用ioctl,和kernel通讯。




参考:

http://blog.csdn.net/lg2lh/article/details/8042008

原作者:七水


PLX 的9054(9052)芯片为基础的



你可能感兴趣的:(PLX9056 PCI卡驱动:PCI 总线)