Linux 系统下基于PCI 控制器(PLX9054)的DMA 编程.pdf
《Linux 系统下基于PCI 控制器(PLX9054)的DMA 编程.pdf》由会员分享,可在线阅读,更多相关《Linux 系统下基于PCI 控制器(PLX9054)的DMA 编程.pdf(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux 系统下基于 PCI 控制器(PLX9054)的 DMA 编程 DMA programming with PCI controller(PLX9054)in Linux operating system 崔涛、刘庆文、胡玥 Cui,Tao.Liu,Qingwen.Hu,Yue.北京科技大学信息学院计算机系 100083 摘要摘要:DMA 是实现大批量数据快速传输的一种手段。DMA 的实现是高度依赖操作系统和硬件的。本文讨论了 DMA 编程在 Linux 系统下的所遇到的主要问题及解决方法。并通过实例介绍了基于PLX9054芯片的DMA实现方法。关键词关键词:Linux;PCI;DMA
2、;驱动程序;PLX9054;AbstractAbstract:DMA is a way to quickly transport large amount of data.DMA communication highly depends on operating system and certain hardware.This paper discusses the major problem and solution of DMA programming in Linux operating system.At the same time,an example is given to sho
3、w how to design DMA communication with PLX9054-PCI controller.KeywordsKeywords:Linux;PCI;DMA;device driver;PLX9054;1.引言 1.引言 在多媒体应用中,在实现视频数据从设备到主存的传输时,直接内存访问(DMA,Direct Memory Access)方式一直是实现大批量数据快速传输的首选方式。DMA 方式是依靠硬件在主存和I/O设备之间进行直接的数据传送的方式,其传送过程无须 CPU 执行程序来控制干预,能够满足大数据传输的对速度的要求。DMA 通信高度依赖操作系统和硬件特性,尤
4、其是在嵌入式环境下,操作系统、硬件特性和有限的环境资源对 DMA 通信的实现方式和实现手段有很大的影响。在DMA 通信的具体实现中所遇到的问题则因此而有所不同。本文以一个嵌入式视频处理项目为例,来分析在Linux系统下实现DMA编程的主要问题。在此项目中,视频采集卡采用 PLX9054芯片做 PCI 总线接口。视频数据由采集卡生成,缓存于卡上 RAM 存储器中,并通过设备驱动程序传输到主机内存中。要求编写Linux 设备驱动程序,利用 PLX9054 芯片的DMA 功能实现将卡上 RAM 中的数据快速的传输到系统的内核内存中。在这里,DMA 编程主要涉及到PCI接口、PLX9054芯片和Lin
5、ux系统。Linux 内核的发展很快。内核版本不同,设备驱动程序的结构、所使用的硬件接口和相关的内核支持函数可能会有很大的区别。因此在 Linux 系统下做驱动程序,必须确定内核的版本。本项目所用的 Linux 内核版本是在 2.4.20。下面所介绍的内容全部以该版本为基础。2.PCI 及 PLX9054 2.PCI 及 PLX9054 PCI 是外围设备互连(Peripheral Component Interconnect)的简称,它是一种通用总线接口标准。PCI 提供了一组完整的总线接口规范、电气特性和行为规约,通过该规范,计算机系统中的外围设备能够实现结构化、可控化的连接以及正确地进行
6、交互。PCI 设备上有三种地址空间:I/O 空间、存储空间和配置空间。配置空间的信息主要包括:设备识别号、供应商代码号、Local总线三个空间的大小以及三个空间的基址等。在计算机启动时,系统将根据配置信息分配系统资源。CPU 可以访问 PCI 设备上的所有地址空间,其中 I/O 空间和存储空间提供给设备驱动程序使用,而配置空间则由Linux 内核中的 PCI 初始化代码使用。PCI总线接口因其传输速度快、即插即用、自动配置的优点而成为实现数据采集设备到主机之间的接口的首选。PLX9054 是 PLX 公司生产的 PCI 总线接口控制器芯片。PLX9054 符合 PCIV2.2 规范,32 位,
7、工作频率为 33MHz,拥有两个独立的DMA 通道,传输速度达 132MB/s。PLX9054提供了 PCI 总线、EEPROM、LOCAL 总线三个接口,其中 LOCAL 总线有三种工作模式:M模式、C 模式和 J 模式。在实际的数据采集时,LOCAL 总线接口一般设置为 C 模式。PLX9054 芯片在 PCI 总线和 LOCAL 总线之间有三种直接的数据传输模式:PCI Initiator模式-LOCAL 总线主设备通过 PLX9054 访问PCI 总线存储空间和 I/O 空间;PCI Target模式-PCI 总线主设备通过 PLX9054 访问LOCAL 总线存储空间和 I/O 空间
8、;DMA 方式-PLX9054 作为两总线的主设备,实现 PCI总线存储空间与LOCAL总线存储空间之间的数据传输。PLX9054 的 DMA 模式有两种:block 模式-单块连续数据传输。这种模式适合于源、目的存储空间连续,数据连续存放的传输,最大传输长度为 4MB;scatter/gather模式-多块分散数据传输。该模式允许源、目的存储空间不止一个,块地址不连续。我们的视频采集卡LOCAL总线接口设置为 C 模式,数据传输模式使用 PCI Target和 DMA 两种:PCI Target 用于对控制模块中的寄存器进行读写,用于采集方式的设定;DMA 用于视频数据的传输。DMA 模式采
9、用block 模式。设计选用 PLX9054 的 DMA0 通道实现数据由本地 RAM 到主存的传输。PLX9054 DMA0通道的操作涉及到如下的控制寄存器(详见9054db-21.pdf文档的P11-34,P11-35,P11-38):寄存器 偏移地址功能 DMAMODE0(PCI:80H)设置局部总线工作模式,中断使能等 DMAPADR0(PCI:84H)PCI总线上的地址,主存地址,必须是物理地址 DMALADR0(PCI:88H)局部总线的地址,存储空间在局部总线的地址 DMASIZE0(PCI:8CH)需传送数据的长度,以字节为单位,最大4MBDMADPR0(PCI:90H)设置传
10、输方向,scatter/gather模式的描述块地址等 DMACSR0(PCI:A8H)DMA0的使能和启动,中断的清除 INTCSR(PCI:68H)设置PCI中断使能等 3.Linux 系统下的 DMA 编程 3.Linux 系统下的 DMA 编程 从上面的介绍看,要实现对 PLX9054 的DMA 操作,设置 DMA 控制寄存器,设备驱动程序需要做两件事:一是收集设备信息;二是建立 DMA 操作环境。PCI 设备信息包括两类:一类是 PCI 卡的设计约定信息:PLX9054 的工作模式、控制寄存器的偏移地址说明、局部总线存储器地址、卡上 RAM 容量、局部总线上的设备操命令及时序。约定信
11、息是设备设计时产生的,在 DMA 操作时直接引用就可以了。另一类是 PCI 配置信息:PLX9054 控制寄存器的I/O 基地址、局部总线控制寄存器 I/O 基地址、设备中断号。配置信息是计算机启动时自动配置的,需要通过设备驱动程序读取。在早期的 Linux 系统中,编程者需要通过系统调用自行编写代码实现读取PCI设备配置空间信息。在 x86 平台下,Linux 2.4 内核将 BIOS检测到的所有 PCI 设备的相关信息-包括PCI 配置信息-都存储在 pci_dev 结构中,并链接到 pci_devices 链表中了。因此配置信息是在 PCI 设备初始化阶段直接获取的。建立 DMA 操作环
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 系统下基于PCI 控制器PLX9054的DMA 编程 系统 基于 PCI 控制器 PLX9054 DMA
限制150内