NI PXIe机箱。
问题描述:目标板由NI公司的PXIE机箱供电,并插入零槽作为主控制器,现在实验室有自己研发的AD数据采集模块,也想插入机箱其他槽其作为目标板mpc8536的外设模块,二者通过机箱进行通信。
现在vxWorks系统起来了,串口\网口等驱动也做好了,接下来就想通过目标板控制AD模块,将其采集到的波形传输到目标板,并显示出来。
我现在的问题是一点思路都没有,一些资料上说pcie驱动包括两部分,一部分是pcie总线驱动,另一部分是具体的pcie外设驱动,前者vxWorks bsp包里已经提供了,后者完全得自己编写。有一些问题咨询各位:
1.已有总线驱动m85xxPci.c,但这个驱动好像针对那些pci和pcie插槽直接做在板子上的,我现在是将目标板插在NI的PXIE机箱的零槽上,机箱其他槽再插外设AD模块。那我现在做总线驱动是不是还得做针对NI机箱的驱动啊?还有就是怎么确定pcie总线驱动是否好使?
2.目标板怎么控制pcie外设?控制外设的什么寄存器?
3.编写具体的pcie外设驱动基本思路是什么?
pcie插槽其实对应pcie控制器,所做的pcie驱动实际是控制器的驱动。
判断pcie驱动是否好,就看加载过程就行了,能识别就行。
pcie设备就是通过pcie接口通讯。
pcie其实,跟串口、usb、网口这些都一样,是一种接口,所以设计方法都一样:先做接口驱动,再做设备驱动。
通过pci的接口,找到AD卡,然后获得AD卡的地址,中断等资源,以后就没PCI什么事了。
当然,前提是你的PCI驱动已经是正常的
我现在通过vxBusShow可以看到一些一些pcie设备,相关部分显示如下:
PCI_Bus @ 0x00338880 with bridge @ 0x00339dc0
Device Instances:
Orphan Devices:
(null) unit 0 on PCI_Bus @ 0x0033e4c0 with busInfo 0x00000000
(null) unit 0 on PCI_Bus @ 0x0033e5c0 with busInfo 0x00000000
(null) unit 0 on PCI_Bus @ 0x0033e6c0 with busInfo 0x00000000
(null) unit 0 on PCI_Bus @ 0x0033e7c0 with busInfo 0x00000000
(null) unit 0 on PCI_Bus @ 0x0033e8c0 with busInfo 0x00000000
(null) unit 0 on PCI_Bus @ 0x0033e9c0 with busInfo 0x00000000
(null) unit 0 on PCI_Bus @ 0x0033eac0 with busInfo 0x00000000
(null) unit 0 on PCI_Bus @ 0x0033ebc0 with busInfo 0x00000000
(null) unit 0 on PCI_Bus @ 0x0033ecc0 with busInfo 0x00000000
(null) unit 0 on PCI_Bus @ 0x0033edc0 with busInfo 0x00000000
===============================================================
其中,我使用函数pciDevShow查看以上设备的厂商ID和设备ID知:
第1个设备Vendor ID为0x1957代表厂商Freescale,dev ID为0x0051代表MPC8536,为host主桥(也就是你所说的PCIE控制器)。
第2、3、4、6、7、8个设备Vendor ID均为0x10b5代表厂商PLX,dev ID为0x8624代表PEX 8624,为交换芯片(switch)PEX 8624。
第5个设备Vendor ID均为0x104c代表厂商Texas Instruments ,dev ID为0x8231代表XIO2000A,为Texas Instruments的一款PCI-Express to PCI/PCI-X bridge芯片。
补充一点:我的mpc8536目标板在PCIE控制器和NI机箱之间还存在一个交换芯片——上述的PEX 8624芯片,因为PCIE控制器出来最多1x8,而NI背板要求提供4x4或者2x8的PCI Express链路模式,通过交换芯片可以实现4x4模式。
我现在请问一下:
1.我现在这种情况算你说的识别了吗?算的话,但显示的是 Orphan Devices啊,也就是说没有匹配驱动的设备,能使用它们的功能吗?pcie控制器现在能使用吗?
2.如你所见,我现在插入机箱后,能识别的设备只是pcie控制器和交换芯片,对于下一级的插在NI机箱上的pcie设备还不能识别。我现在做驱动,是不是得从上述的交换芯片做起啊?
识别是指pciDeviceShow 1/2/3/4/5... 能显示出你的厂商ID和设备ID。
Orphan Device是因为没有匹配的驱动,所以不能使用它们的功能。pcie控制器现在能用了,你需要的是写设备驱动,交换芯片的驱动一般不用写。你可以看看pcie转网卡的gei驱动(target/src/hwif/end/gei825xxVxbEnd.c) 或者 pcie转sata的SI31XX驱动(target/src/hwif/storage/vxbSI31xxStorage.c)
我想接着问问一些细节。
(1) pciDevShow是手工在shell里调用查看的吗?该函数声明
void pciDevShow
(
struct vxbDev * pDev /* Device information */
)
如何填的指针呢?
(2)如果你直接用 pciFindDeviceShow(0x10b5, 0x8624, 0), 是否能显示出正确找到的信息呢?看了一下pciFindDeviceShow这个函数,内部会调用获取函数指针的接口:
method = vxbDevMethodGet(busCtrlID,PCI_CONTROLLER_METHOD_CFG_INFO);
这个method应该是m85xxPci.c文件中的
m85xxPci_methods[] =
{ ...
{ PCI_CONTROLLER_METHOD_CFG_INFO, (FUNCPTR)m85xxPciConfigInfo},
...
}
也就是m85xxPciConfigInfo()函数,我的疑问是只需要这个m85xxPci.c文件中的函数就能获取PEX8624的switch信息,还是要再写一个类似pex8624Pci.c的文件,重新实现一个pex8624Pci_methods[]呢?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(1)pciDevShow是在shell里输入的。其输入参数即为你要查看的设备在VxBus下注册的设备ID,这个可通过使用函数vxBusShow来查看,一般为@后的数据,比如我上段代码中第一个设备的设备ID就是0x0033e4c0。
当然想用这些函数需要包含相应的宏定义,才能在编译系统时添加进去,不然找不到。
(2)我使用的是vxWorks6.8版本,里面的查找函数升级成了vxbPciFindDeviceShow,函数原型如下:
STATUS vxbPciFindDeviceShow
(
VXB_DEVICE_ID busCtrlID,
int vendorId, /* vendor ID */
int deviceId, /* device ID */
int index /* desired instance of device */
)
该函数扫描busCtrlID指定的PCI总线,搜索属于指定的厂商ID和设备ID的PCI设备。由于在一个PCI总线上可以挂接多个属于同一厂商和设备ID的PCI设备,因而在使用该函数时可以使用一个索引号来决定显示第几个设备的信息。我的显示可以查找,如图
这个不需要写关于桥芯片的驱动,因为一般的桥芯片都是透明桥,直接通过这个函数就可查找到
转载地址:http://bbs.csdn.net/topics/390390424?page=1