vxworks pci驱动解析

news/2024/11/15 6:50:55/

PCI驱动分为两种类别:

1.CPU通过io方式访问的PCI设备驱动

2.dma方式的PCI设备驱动

其实就是两种方式

在io方式下访问PCI/SRIO设备

通过outbound寄存器将本地存储器映射到remote端pci设备 --------------------------------IOMMU过程

同时一般需要将CPU物理地址转换成本地存储器地址----------------------MMU过程

MMU和IOMMU实现一般是在PCI controller下实现的

比如mot85xxpci.c中mot85xxBridgeInit函数中就是设置了PCI port和outbound寄存器

Linux平台PCI设备的总线地址(物理地址)为0x80000000,CPU物理地址(虚拟地址)为0xc0000000,对应的内存存储器是0

它的映射过程如下:

0xc0000000------> 0 ------------------------>0x80000000 

注意:我们写PCI驱动时必须要MMU映射,比如在linux下需要ioremap,而在vxworks下一般不需要,因为sysLib.c中的sysPhysMemDesc数组已经定义了。当然我们也可以通过调用pciConfigInLong,pciConfigInByte获得设备映射的内存基地址memBase和I/O基地址ioBase以及中断号irq,然后sysMmuMapAdd((void*)memBase,MEM_SIZE)来动态的映射内存空间。(第二种比较灵活)

dma方式PCI/SRIO设备驱动

在这个方式下,本地存储器通过inbound寄存器建立与remote端PCI设备的映射关系(不经过CPU)

此时我们不需要添加MMU映射,因为是inbound方式访问,CPU不会访问PCI设备。

但是dma控制器可能使用板卡的,也可能使用remote端的PCI设备,比如张松岭的SRIO转万兆网关。

SRIO转万兆的情况是我们也需要一个mot85xxsrio.c文件即SRIO controller驱动,这里我们设置srio port和inbound寄存器(因为是dma方式,所以用inbound)

同时我们需要SRIO 设备驱动

在SRIO设备驱动中我们要实现SRIO设备的逻辑功能,不用MMU映射,因为没有CPU访问SRIO设备。


其实归纳起来我们完全可以讲PCI controller驱动和PCI设备驱动合并起来,但是那样的话,就是不方便移植新的驱动。

比如PCI插槽,由PCI网卡完成PCI声卡,我们在驱动中还要重新对PCI插槽设置PCI port和inbound/outbound寄存器。

而我们将PCI网卡和PCI声卡的共性提取出来(PCI port和inbound/outbound寄存器的设置),即将PCI插槽的引脚属性和访问方式放到PCI controller驱动中。

这样我们每次就只需要实现具体的PCI网卡驱动的逻辑功能。


在我的资源里有一个

vxworks PCI设备初始化编程的过程,可以学习一下

http://download.csdn.net/detail/qingfengtsing/7198309


另外有一个链接:一种PCI设备高效率DMA传输方法

http://www.docin.com/p-200241159.html


http://www.ppmy.cn/news/274645.html

相关文章

PCI驱动使用函数

PCI总线驱动 1.pci驱动注册 pci_register_driver(struct pci_driver *drv) static struct pci_driver hamachi_driver { .name DRV_NAME, .id_table hamachi_pci_tbl, .probe hamachi_init_one, .remove …

linux 查看 pci 设备驱动,如何写linux pci设备驱动程序

PCI总线应用领域及其广泛并且令人惊奇。不同的pci设备有不同的需求以及不同的问题。因此,在linux内核中pci层支持就非常重要啦。本文档就是想为驱动程序设计开发人员解决pci处理中的各种问题。 0.Pci设备驱动程序的结构 现在有两种风格的的pci驱动程序结构:新风格的驱动(即让…

linux 内核PCI驱动总结记录

1. 介绍 Peripheral ComponentInterconnect (PCI,外围设备互联)。总线由电气接口、编程接口组成。主要讨论编程接口。最常用的总线,内核支持最好的总线。ISA裸金属总线,电子爱好者偏爱。 2. PCI的特点 是一种完整的规范,定义…

linux驱动程序之PCI驱动程序设计

文章目录 PCI驱动描述PCI驱动注册使能PCI设备获取PCI配置寄存器基地址中断部分代码 PCI驱动描述 在linux内核中,PCI驱动使用 struct pic_driver 结构来描述: struct pci_driver {/*以上还有很多成员*///id_table 中包含了PCI设备的相关信息const struc…

PCI驱动编程

一、字符设备和块设备 Linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。Li…

Linux设备驱动程序学习(十)——PCI驱动程序

前面介绍的是最底层的硬件控制,这部分将介绍高级总线架构的一些综述,总线由电气接口和编程接口够成。下面将重点介绍PCI总线的编程接口以及对应的内核函数。 PCI(外围设备互联)接口 PCI总线是当今普遍使用在桌面以及更大型计算机…

dpdk pci驱动探测

上一篇文章已经介绍了pci设备的背景知识, 现在我们来分析下pci设备是如何探测到支持的驱动,进而与驱动进行关联;pci与驱动的解除绑定;pci设备与uio设备的关联。 一、pci驱动注册 网卡驱动的注册使用了一种奇技淫巧的方法&#xf…

virtio_net 与 virtio-pci 驱动关联浅析

virtio-pci 驱动映射 virtio common_cfg resource 空间 virtio-pci 获取 comon_cfg 物理空间的函数调用如下: mdev->common vp_modern_map_capability(mdev, common,sizeof(struct virtio_pci_common_cfg), 4,0, sizeof(struct virtio_pci_common_cfg),NULL, …