vxworks的pci设备驱动调试

简介: vxworks的pci设备驱动调试

开发环境:风河workbench3.2 —vxworks6.8  ,目标板:飞思卡尔powerpc mpc8536

       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设备,因而在使用该函数时可以使用一个索引号来决定显示第几个设备的信息。我的显示可以查找,如图


微信图片_20230116214138.png


这个不需要写关于桥芯片的驱动,因为一般的桥芯片都是透明桥,直接通过这个函数就可查找到

目录
相关文章
|
API 调度
【FreeRTOS】软件定时器的使用
【FreeRTOS】软件定时器的使用
442 0
|
Android开发
【Android App】蓝牙的设备配对、音频传输、点对点通信的讲解及实战(附源码和演示 超详细)
【Android App】蓝牙的设备配对、音频传输、点对点通信的讲解及实战(附源码和演示 超详细)
2943 1
|
Linux 虚拟化 Windows
完美解决:重新安装VMware Tools灰色。以及共享文件夹的创建(centos8)
这篇文章提供了解决VMware Tools无法重新安装(显示为灰色)问题的步骤,并介绍了如何在CentOS 8上创建和配置VMware共享文件夹。
完美解决:重新安装VMware Tools灰色。以及共享文件夹的创建(centos8)
|
消息中间件 网络协议 Shell
VxWorks操作系统shell命令与调试方法总结
<div><p><br></p></div> <p align="center"><strong>VxWorks下的调试手段</strong></p> <p>主要介绍在Tornado集成开发环境下的调试方法,和利用支撑定位问题的步骤、思路。<strong></strong></p> <h1> <a target="_blank" name="_Toc80412618">1         To
19034 0
|
安全 调度 C++
互斥锁 vs 自旋锁:底层机制详细解析
互斥锁 vs 自旋锁:底层机制详细解析
397 1
|
存储 数据库
飞腾uboot命令简单介绍
飞腾uboot命令简单介绍
1442 0
飞腾uboot命令简单介绍
|
开发工具 芯片 Perl
【ZYNQ】裸机 PS + PL 双网口实现之 ZYNQ 配置
【ZYNQ】裸机 PS + PL 双网口实现之 ZYNQ 配置
3050 0
|
Linux 内存技术 Perl
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件
1821 0
|
传感器 开发工具 芯片
【ZYNQ】ZYNQ7000 XADC 及其驱动示例
【ZYNQ】ZYNQ7000 XADC 及其驱动示例
509 0
|
网络协议 Ubuntu Linux
飞腾CPU如何使用PXE方式安装麒麟桌面系统?
飞腾CPU如何使用PXE方式安装麒麟桌面系统?
4261 0
飞腾CPU如何使用PXE方式安装麒麟桌面系统?