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


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

目录
相关文章
|
4月前
|
供应链 芯片
一种LED驱动专用控制电路
一、基本概述 TM1620是一种LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU数字接口、数据锁存 器、LED驱动等电路。本产品质量可靠、稳定性好、抗干扰能力强。主要适用于家电设备(智能热 水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、智能电表等数码管或LED显示设备。 二、基本的特性说明 采用CMOS工艺 显示模式(8 段×6 位~10段×4位) 辉度调节电路(8 级占空比可调) 串行接口(CLK,STB,DIN) 振荡方式:内置RC振荡 内置上电复位电路 内置数据锁存电路 内置针对LED反偏漏电导致暗亮问题优化电路 抗干扰能力强 封装形式:S
48 5
Win系统 - USB3.1还没分清,USB3.2和USB4就来了?
Win系统 - USB3.1还没分清,USB3.2和USB4就来了?
227 0
Win系统 - USB3.1还没分清,USB3.2和USB4就来了?
|
Linux 芯片
iMX6 SoloX千兆以太网Linux PHY驱动调试
最近在iMX6 SoloX平台上调试千兆以太网Linux PHY驱动调试,使用的是RGMII接口类型。RGMII即Reduced GMII,是RGMII的简化版本,将接口信号线数量从24根减少到14根(COL/CRS端口状态指示信号,这里没有画出),时钟频率仍旧为125MHz,TX/RX数据宽度从8为变为4位,为了保持1000Mbps的传输速率不变,RGMII接口在时钟的上升沿和下降沿都采样数据。
|
Linux Go Windows
linux中pci设备知识
linux中pci设备知识   Linux PCI设备驱动实际包括Linux PCI设备驱动和设备本身驱动两部分。PCI(Periheral Component Interconnect)有三种地址空间:PCI I/O空间、PCI内存地址空间和PCI配置空间。
5280 0