第1期 2012年03月 电光 系统 No.1 Electronic and Electro—optical Systems Mar.20l2 基于PCI9656控制芯片的DMA传输设计 张际生,谭钦红,黄俊,徐沛 重庆邮电大学信号与信息处理重点实验室,重庆400065 摘 要:PCI总线现已成为工业控制计算机应用的主流总线结构,本文在分析PCI9656控制 芯片特性和DMA传输机制的基础上给出了PCI总线上实现DMA数据高速传输的方法,该 传输方法是PCI设备驱动程序的重要组成部分。设计采用Linux嵌入式系统作为开发平 台,并借助系统提供的操作函数,降低了设备驱动程序的开发难度,缩短了开发和调试周期。 关键词:PCI9656;Linux;PCI总线;DMA;驱动 中图分类号:TN215 文献标识码:A DMA Transmission Design Based on PCI9656 Controller Chip ZHANG Ji-sheng。TAN Qin-hong.HUANG Jun,XU Pei (Key Laboratory of Signal and Information Processing,Chongqing University f oPosts and Telecommunications.Chongqing 400065,China) Abstract:PCI bus has become the mainstream of industrial control computer bus.This paper proposes a high speed DMA data transmission method on PCI bus based on the analysis of PCI9656 control chip and DMA trans・ mission mechanism.The transmission method is also an important part of PCI device driver.Linux—embedded system is used as the development platform,and with the aid of system operation function,the development dif- icuhy is reduced and the cycle of developmentf and debugging is shortened. Key words:PCI9656;Linux;PCI Bus;DMA:Driver 用32位66 MHz PCI总线设计,它提供了两个 1 前言 PCI总线是一种为满足高速数据传输而设计 的一种于CPU的局部总线,具有32位和64 位两种复用的地址数据通道,可同时为处理器和 的DMA通道,每个通道拥有的双向256字节 FIFO,并具备DMA控制器、可编程直接主控、直接 从属数据传输模式以及PCI信息传输功能,突发 传输速率可达528 Mb/s,软件部分采用Linux 2.6 内核作为开发平台,并借助内核提供的相关接口 存储器提供总线接口,并为外设提供高速数据通 道。可以想象,如果PCI总线上的外设与存储器 之间的高速数据传输都需要CPU参与其中,势必 函数以减轻开发难度。 2 PCI9656概述 PCI9656是一款PCI总线模式的接口电路芯 占用相当可观的系统资源。DMA传输方式的出 现,正好解决了这一问题。DMA是一种高速的数 据传输机制,它允许外设与存储器直接进行数据 的存取操作,而无需要通过CPU,也无需CPU的T 预,整个过程只在DMA控制器的操作下进行。 片,可提供高性能64位PCI总线目标接口,其内 部结构框图如图1所示。 PCI9656具有以下一些特点: (1)符合PCI V 2.2协议,支持66 MHz时钟 DMA传输方式可节约宝贵的系统资源并将其应用 于其他进程,提高了整个系统的工作效率。 为满足PCI总线接口规范,本文采用PCI 9656芯片作为硬件接口电路,该芯片主要用于通 PCI总线,特别适合于PCI总线的外设功能开发; (2)芯片结合领先的数据通道架构技术,具有 DMA引擎,可编程直接主和直接从数据传输模式; 作者简介:张际生(1981--),男,硕士研究生,研究方向:光通信接入网、嵌入式系统应用。 总第139期 张际生,等:基于PCI9656控制芯片的DMA传输设计 、U ~ 在Linux系统中,有一个指向所有PCI设备 的指针pci—devices,PCI设备描述结构体pci—dev 通过global—list成员将自身链接到这条全局的 PCI设备链表pci—devices上。这样,Linux内核就 可以用这个全局链表来迅速查找系统中的所有 PCI设备。设备上电时,系统初始化代码通过扫 描当前PCI总线的每个插槽是否被占用,读取每 个PCI插槽中可能的PCI设备Device ID和Ven. dor ID.当发现插槽被占用则建立一个pci—dev数 据结构来描述此设备,并将此设备连接到全局PCI 设备链表中。 Linux为所有的PCI设备提供了统一的驱动 程序人口。如前所述,PCI初始化代码在检测到 PCI设备后,将会读取设备标识信息并为其建立一 个设备描述结构信息pci—dev,初始化代码随后根 据这个描述结构为该PCI设备找到其对应的驱动 程序,pci—dev结构体中专门提供了一个pci—driver 成员结构体函数作为驱动程序入口。可以说,PCI 驱动只是为了辅助设备本身的驱动,它为所有的 PCI设备驱动提供了一个统一的接口。每一个通 过PCI总线和系统连接的设备的驱动都包括PCI 驱动和其自身设备驱动。在Linux系统中,采用 pci—driver结构体来定义PCI驱动,该结构体包含 了PCI设备的探测、移除、挂起和恢复等函数。数 据的DMA传输是PCI设备功能的一部分,也是其 驱动函数的一部分。 3.2 DMA通道申请与释放 在使用DMA方式传输数据前,需要向系统申 /设备关闭\ 、 / l释放中断号ll J l释放DMA通道 \ 释放完毕 / 图4相关资源申请与释放流程图 请一个DMA通道。一般来说,该通道的申请会在 PCI设备打开函数中实现,相应地,在设备的关闭 函数中需要释放该DMA通道。整个申请和释放 流程如图4所示。 DMA传输中需要用到中断资源,一般来说,中 断注册函数应该在DMA通道申请之前被执行,在 DMA通道释放之前被注销。中断资源的申请调用 Linux系统提供的request—irq()函数来完成,该函 数需提供使用该中断资源的硬件描述信息,这些 信息皆可由PCI设备的配置空间中获得。接下来 进入DMA通道的申请,该步骤将调用函数request —dma(),函数有两个参数:unsigned int channel, const char name,其中channel为DMA通道编号, 可选范围为0到7;name用来标识使用该通道的 设备,可以在用户空间查看。如果DMA通道申请 失败,程序将跳出申请流程并释放中断资源然后 报错。 当设备关闭时,需要相应地释放中断资源和 DMA通道,与打开函数相反,设备关闭函数是先注 销中断资源而后释放DMA通道。中断注销函数 为free—irq(),DMA通道释放函数为free—dma(). 3.3 DMA缓冲区分配与释放 使用DMA方式传输数据时需要开辟一块内 存区域用于与外设交互数据,这块内存区域被称 为DMA缓冲区。Linux2.6内核中能够用于分配 DMA缓冲区的函数有三个:kmalloc,一get—free—pa— ges和pci—alloc—consistent,本文采用一get—free—pa— ges函数作为分配手段,该函数如下所示: get—free一—pages(unsigned int flags,unsigned int order); 函数中的flag参数常常使用GFP—KERNEL或 者GFP—ATOMIC;order参数是请求的缓冲页面大 小,该参数是一个以2为底数的对数。如果不想 使用对数参数,可以使用get—order函数来从size 中提取order,这样就有: int order get order(size); .return—get—free—pages(GFP—KERNEL,or— der); 如果分配成功,函数将返回缓冲区第一页的 起始地址,在此将其保存在无符号长整型数addr 中。当使用完DMA缓冲区,可以使用free—page 函数来予以释放,该函数如下所示: void free—page(unsigned long addr) 电光 系统 第1期 3.4缓冲区映射 在Linux系统中,程序使用虚拟地址来分配和 访问 存空间,但基于DMA功能的PCI设备却使 用总线地址来访问内存空间,于是在申请到缓冲 区后存在一个地址转换的问题。在Linux系统中 采用映射来解决这个问题。对于PCI设备来说, 缓存区的映射有两种方式:流DMA映射和一致 DMA映射。程序开发人员被建议使用流DMA映 射而不是一致DMA映射。因为一致DMA映射具 有很长的存活周期,它会占用一些相关的寄存器 而却只是在初期使用它们一次。此外,在一些硬 件上,某些可以用于流式DMA映射上的优化手段 不能被运用在一致性DMA映射上。本文的流 DMA映射实现函数如下: dma—addr—t dma—map—single(struct device dev,void addr,sizet size,enum dma—data—drec— —tion diretion); 该函数返回缓存区的总线地址bus—addr,同 时将总线的控制权交给外设DMA控制器。函数 中,size表示待发送数据的大小,diretion表示数据 的传输方向,常用的选项有DMA—TO—DEVICE:数 据发送到外设、DMA—FROM—DEVICE:数据来自于 外设。 3.5 DMA传输实现 DMA是不通过CPU而直接写入数据,它以块 的方式传输数据,只要设定本地和PCI端的起始 地址、传输字节数和传输方式,再设置DMA传输 方式就可以了。PCI9656支持两个的DMA通 道,能在PCI总线和局部总线之间双向传输数据, 每个通道包含一个DMA控制器和一个双向FIFO. 大多数DMA控制器具有一个相似的架构,它有一 个DMA缓冲区的开始地址和一个记录待传输数 据位字节数的计数寄存器,随着每次的传输,DMA 控制器增加其地址寄存器数值和减小计数寄存器 数值。当计数寄存器减小到0时,DMA控制器产 生一个中断,并准备下一次传输。 公共缓冲区 总线主 DMA硬件 驱动程序 ——— 命令缓冲区 ]地址l 状态缓冲区 I长度l 图5 DMA控制器架构图 PCI9656提供了两个的DMA通道,每个 通道拥有的双向256字节FIFO和DMA控制 器,并具备可编程直接主控、直接从属数据传输模 式以及PCI信息传输功能。由于两个DMA通道 的数据传输实现原理基本相同,以下仅介绍PCI 主控设备利用DMA通道0实现数据传输的过程, 这个流程如图6所示。 图6数据传输流程图 此处将DMA通道和缓冲区的申请作为传输 实现的前期准备工作。在传输的初始化阶段,首 先需要将缓冲区的虚拟地址映射成外设可以访问 的总线地址并设置数据的传输方向,这步工作调 用上节所述的dma—addr_t dma—map—single()函数 来完成,该函数会返回一个缓冲区的总线地址并 将PCI总线的控制权交给外设。由于该次传输选 用的是芯片的DMA通道0,所以接下来要对相应 的DMA控制器0进行设置,设置的内容有DMA 控制器的工作模式、缓冲区总线地址、PCI设备地 址、设置需发送数据长度等。当设置完毕后即可 使能该DMA控制器并进人数据发送阶段。随着 每次的传输,DMA控制器增加其地址寄存器数值 并减小计数寄存器数值。当计数寄存器减小到0 时,DMA控制器产生一个中断,该中断函数会产生 一个数据接收通知并释放外设对PCI总线的控制 权。至此,一次PCI主控设备至局部总线的DMA 方式数据传输就已经完成了。 总第139期 张际生,等:基于PCI9656控制芯片的DMA传输设计 6l 4结束语 PCI总线是当今的主流总线,它拥有较高的数 参考文献 [1]董春桥,李凯.Linux系统PCI设备驱动程序开发[J]. 计算机测量与控制,2005,13(11):1289—1291. [2]Corbet,Rubini,Kroah—Hartman.Linux.Device.Drivers [M].O’Reilly Media.inc,2005. 据传输带宽,DMA技术以其高速大批量的传输特 性,能很好的匹配PCI总线实现数据的传输,同时 还能减少CPU的工作量,大大提高了系统的工作 [3]刘秀萍,李艳芬.基于DMA方式的高速数据传输技术 [J].导弹试验技术,2009.02:61—63. 效率。基于目前应用极为广泛的Linux操作系统, 本文介绍了系统中PCI设备的定义及其驱动程序 中DMA功能模块的一般结构,并对DMA数据传 输的实现机制进行了描述。 [4]赵利娜,贾毅东,欧攀.嵌入式Linux系统中的多层次 驱动程序[J].计算机工程,2009,35(9):69—71. [5]魏蕾,宋荣杰.Linux下PCI设备开发以及字符驱动程 序框架的研究[J].现代电子技术,2007,249(10):137 一】39. 一 一。。。 L_____ 儿 。。 …。儿 。。。 … __ u 一 _J____L 一 儿 “。。 。。 。。。。 __。。L_。。山 I_“ ’《电光系统》征稿简则 ,, “ 《电光系统》杂志由工业和信息化部主管,是中国电子科技集团公司第二十七研究所主办的学 术性科技期刊。 《电光系统》主要报道:测控技术;微波雷达,军用/民用激光雷达、测距机技术;工业激光技术;国 外激光技术发展;国内外靶场测量技术;计算机在现代电子技术中的应用;工业自动化控制;电子结构 与工艺技术等专业的论文、技术报告;民品和新产品开发等方面的研究进展或较新研究成果等。 稿件要求: 1 【-J 1.文稿内容具有创新性、科学性或实用性,要求论点明确,主题突出,层次清楚,结构严谨,数 据可靠,图、表清楚紧凑(插图用“JPG”、“TIF”或“WMF”格式),语言表达规范。 2.要求附有中英文标题,150~200字的中英文摘要、3—6个中英文关键词及中图分类号。 3.第一作者的作者简介:姓名(出生年月)、性别、学历、职称、毕业院校、研究方向。 4.文中所有物理量和单位应符合国家标准或国际标准,外文字母、单位、符号的大小写、正斜 : 体、上下角标及易混淆的字母应标注清楚;数字超过4位时,每隔3位空四分之一格;量与单位间 空四分之一格。 5.名词术语必须规范化标准化,所写字母在第一次出现时应给出中英文全称。 1=I 6.参考文献著录,格式要求完整、规范。 :J 论文要求在文后著录参考文献,并在文中引用处以“右上角”的形式按顺序标注。 《参考文献规范》所列的文献类型标识码为: 图书M,期刊J,会议录/论文集c,汇编G,报纸N,学位论文D,报告R,标准s,专利P, 数据库DB,计算机程序cP,电子公告EB,联机网络OL。 7.来稿一经刊登,将酌付稿酬,并赠当期样刊一份。 8.来稿著作权属作者,但版权(含各种介质、媒体的版权)转让给编辑部,版权使用费在奉寄稿一 .酬时一次性支付。请勿一稿多投和抄袭,否则责任自负。来稿请注意保守国家秘密,并出具保密 审查表。 来稿请注明作者详细通讯地址及联系电话。 编辑部通讯地址:河南省郑州市郑东新区博学路1000号《电光系统》编辑部。 邮政编码:450047 联系电话:037l一61270587 传真:037l一61270203 LJ E—mail:DGXT1982@163.con l 1