搜索
您的当前位置:首页正文

Linux的DMA高速串口驱动的设计

来源:尚车旅游网
Linux的DMA高速串口驱动的设计* 乔明闯,彭大芹,黄一峰 (重庆邮电大学新一代宽带移动通信终端研究所,重庆400065) 摘要:基于现有的I inux普通方式传输的串口驱动,提出了通过利用DMA的高速串口驱动,根据传输时的实时数据量, 利用DMA方式和普通方式相结合的方式进行数据传输,大大提高了传输速率,同时降低了系统的开销,减少了CPU的 使用。在双核移动终端中进行验证,两芯片通过串口进行芯片间通信,实验结果证明了设计的高速串口驱动具有较好的 可靠性和可行性。 关键词:DMA方式;Linux高速串口驱动;芯片间通信 中图分类号:TP36.2 文献标识码:A Linux High Speed Serial Driver Design Qiao Mingchuang,Peng Daqin,Huang Yi ̄ng (Chongqing Key Lab of Mobile Communications,Chongqing University of Posts and Telecommunications,Chongqing 4000 6 5,China) Abstract:This paper proposed high speed serial port driver using DMA is based on I.inux serial port driver working in normal mode.Ac cording tO the volume of data in real time transmission,we decided tO combine DMA mode with normal mode tO transfer,greatly impro ving the transmission rate.In the same time it also reduces the overhead of the system and reduces the CPU utilization.In dual core mo— bile terminal,two chips communicate with serial port.The results of implementation show that this method has high efficiency and good reliability in serial port driver design. Key words:DMA mode;I inux high speed serial port driver;inter processor communication 引 言 本文讨论的双核终端硬件以AP(Application Proces— sor,应用处理器)+CP(Cell phone Processor,基带处理 器)的架构构建,CP运行TD/GSM双模协议栈,AP运行 Android软件。两个芯片间通过串口进行IPC(Inter— Processor Communication,芯片问通信)通信,像短信、电 话等AT指令以及PS业务等均通过串口实现AP和CP 的通信。当3G的网络环境对数据传输速率要求较高时, 普通串[___I驱动已经满足不了这样的要求,冈此需要用基于 DMA方式的串口驱动,来支持高波特率的数据传输。AP 侧为Android平台,CP的协议栈软件基于Nucleus平 台 。AP与CP串口通信结构图如图1所示。 图1 AP与CP通信的UART通道 式,在实现发送功能时,是CPU将发送缓冲区(上层应用将 要发送的数据写到circ—buf中)中的数据逐个送入串口的 发送FIFO,从而将数据发送出去。在接收时,将接收FIr() 中的数据送入TTY层,供上层的应用读取。在串口的传输 速度较低时,这种方式可以很稳定地工作;而当波特率设置 得很高时,将会导致CPU来不及取走数据,导致串口的 FIFO溢出,从而造成丢数,针对上述问题,提出了基于 2 高速串口驱动设计原则 2.1 DMA的工作原理 目前应用比较广泛的串口驱动都是采用普通传输方 *基金项目: 家重大专项“TD SCDMA增强型多媒体手机终端的研发  和产业化”(No.2009ZX03001 002—01)。DMA(Direct Memory Access)方式的串口传输方式。 DMA是一种无需CPU参与就可以让外设与系统内 存之间进行双向数据传输的硬件机制。使用DMA可以 3 6 Microcontrollers&Embedded Systems 20 13年第10期 WWW.mesnet.corn.cn  -j 叠 ≯ 使系统CPU从实际的i/o数据传输过程中摆脱出来,从 bytes; unsigned int state; } //申请缓冲区的大小 //缓冲区当前的状态 而大大提高系统的吞吐率。DMA方式的数据传输由 DMA控制器(DMAC)控制,在传输期间,CPU可以并发 地执行其他任务。当DMA传输结束后,DMAC通过中断 通知CPU数据传输已经结束,然后由CPU执行相应的中 断服务程序进行后处理。内存中用于与外设交互数据的 一下面的结构体用来在uart~port基础上增加一些 DMA方式需要的成员变量。 struct uartdmaport{ 块区域被称作DMA缓冲区,DMA缓冲区必须是物理 。 struct uartport uport; //封装uart—port结构体 //DMA发送通道 上连续的 int dma channeltx; int dmachannelrx; 将DMA用于串口驱动时,在接收时需要申请一片和 外设接收FIFO进行直接交互的缓冲区,通过void*dma alloccoherent(struct device*dev,sizet size,dmaad~ ——~//DMA接收通道 dmaaddr t dma—addr tx;//发送缓冲区映射出来的物理地址 //DMA方式发送的count //DMA方式发送的countp int tx count; int txcountp; dmabuffer rx~—drt*handle,gfp—t gfp)来实现,DMA负责将接收FIFO struct uartstruct uarthufferE2]; //申请的接收缓冲区 中的数据送到申请的缓冲区中,然后CPU负责将缓冲区 中的数据推至TTY层。发送时需要将发送缓冲区映射 出其总线地址才能和外设发送FIF0进行交互,通过dma addrt dmamap—single(struct device*dev,void*buff— dmabuffer ~pending; //指向需要向TTY’层推送数据的缓冲区 int rxcount; ——int rxcountp; int curr; er,sizet size,enum dmadata—~dircetion direction)来实现。 1.2 申请的DMA缓冲区交替接收机制 在用DMA方式接收时,并不直接将接收FIFO中的 dmaaddrt dmadest; —struct taskletstruct rxtlet 数据送到TTY层,而是申请了一片2 KB大小的DMA缓 冲区,并将其分成两个1 KB的缓冲区,用来交替从接收 FIFO中接收数据,将2 KB大小的缓冲区分成为大小为1 KB的rxbuf[O]和rx—buf[1],在串口的设备节点被打开 _struct taskletstruct tx tlet; 2.2发送流程设计 为了提高发送效率,在发送前首先会判断发送缓冲区 中的数据个数,只有数据量较大时,才会用DMA方式进 行发送,当数据较少时直接用普通方式进行发送,这样可 以提高效率。DMA方式发送流程设计如图2所示,图中 n的值可自由配置,本设计中n一32。 发送流程大致如下: ①首先将发送缓冲区映射出其总线地址以供DMA 时,把这两个缓冲区排队到DMA bur队列中。这里利用 申请的两个缓冲区交替从FIFO中接收数据,以提高传输 效率。流程大致如下: ①启动DMA,等待接收FIFO中的数据达到触发值, 产生中断来进行DMA传输,将接收FIFO中的数据送到 rx buf中。 ②当其中一个rx_bur接收数据满时,将其数据送到 上层之后排队到DMA bur队列中。 方式使用,配置DMA通道的各个寄存器以及传输方式, 并设置DMA传输完成的回调函数。 ②当上层调用write系统调用时,将向circbur缓冲 ③而此时另外一块之前已经排队的rx_buf已经开始 接收数据,等待接收满时,执行步骤②,两块rx—bur如此 交替从接收FIFO中接收数据,当接收满时排队到DMA 区中写人数据,首先调用start tx发送数据,并根据缓冲区 数据的多少确定发送的方式。 ③缓冲区中的数据个数小于预定值时使用普通方式 进行传输,当大于这个值时使用DMA方式进行发送 (DMA控制器会根据设置的源地址和目的地址,将缓冲 区中的数据搬送到发送FIFO中,DMA传输完毕后,调用 之前注册的DMA完成的回调函数,此时更新缓冲区的尾 指针以及其他数据)。 bur队列中去,等待下次继续从接收FIFO中接收数据。 2高速串口驱动设计流程 2.1 相应的数据结构 下面的结构体用来描述DMA来负责接收时,申请的 一片DMA缓冲区的信息,此缓冲区用来暂存从接收 dma—FIF0中接收来的数据。 struct uart④当发送FIFO中的数据个数小于设定的个数时,产 生中断然后重复步骤③。 //缓冲区的虚拟地址的首地址 buffer{ unsigned char*area; unsigned char pos; dmaaddrt dmaaddrrx; //缓冲区虚拟地址当前的位移 //缓冲区的物理地址size—t 2.3接收流程设计 考虑到接收时,接收FIFO中的数据个数达不到设定 敬请登录网站在线投稿 2013年第10期 《平I亨机 嵌入式系诧应Ij9》 37 硼【 开始 接收流程大致如下: ①首先申请2 KB的DMA缓冲区,分成两个接收rx 二]== 发送数据 bur,配置DMA的各个寄存器,将2个rxbuf均排队到 二]== 调用start tx DMA buffer队列,启动DMA。 ②当接收FIFO中的数据达到设定值时,串口会送给 DMA一个中断。由于此时DMA已经是启动状态,所以 Y 开始DMA传输,传送完一个countp(DMA控制器周期传 普通方式传输I l DMA方式传输 输长度寄存器的值)时,每来一个中断,传输一个eountp, 直到count(DMA控制器传输长度寄存器的值)减小到0 时执行DMA完成的回调函数。 FIFO中的数据 个数小于设定 个数,产生中 ③在DMA的回调函数中将会更新DMA buf队列中 的缓冲区,将下一个排队中的缓冲区作为接收数据的缓冲 区。同时count为0时,说明当前接收buf中的数据已满, 开始将rx buf中的数据推向上层。推向上层之后,排队 到DMA buffer队列,为下次接收数据作准备。 Y 普通方式传输I N 传输完毕? l DMA方式传输 ④在count寄存器中的值减小为0时,调用DMA的 回调函数,使正在排队的另一块申请的rx—buf开始从接 收FIF()中接收数据,直到接收到count减小到0时,再执 行步骤③。 —T 结图2束 ⑤当一定时间内接收FIFO中未接收到数据,则此时 产生超时中断,这时需要先将rx—bur中的数据先推到 TTY层,然后再用普通方式将接收FIFO中的数据送入 TTY层。 发送流程图 的值时不会触发中断,这样容易造成在FIFO中遗留数 据,所以使能超时中断。当接收FIF()在设定时间内没有 收到数据时会产生超时中断,此时用普通方式将接收 FIFO中的数据送到TTY层。但是这样操作前要确保申 3实验结果 AP芯片运行Android4.0操作系统(其中内核版本为 Linux 3.O),在串口波特率设置为3 Mbps时,通过回环测 请的DMA缓冲区中的数据都被送到了TTY层,否则会 造成数据乱序。接收流程图如图3所示。 试,查看串口的实际传输速率,测试结果如表1所列。 表1 两种传输方式数据传输速度 Mbps _、1 启动DMA接收 二二]二 J 普通方式传输ll 1 .78 实际传输速率 1.81 2.21 串口开始接收数据 产生中断 i第1次 第2次 第3次 平均 1.81 2.2O 1.80 2.2O DMA方式传输i 2.19 通过测试结果可以看出,当波特率设置为3 Mbps时, 产生超时中断 将rxbumU的 数据推向TTY层 —RXFIFO中数据达到 触发值,产生中断 开始DMA方式 传输 普通传输方式的实际速度只能达到1.8 Mbps,满足不了 数据的高速率传输要求,并且由于对系统的资源消耗较 大,对CPU的占用率为12 。而用DMA方式相对较普 通方式传输可以提高传输速率,并且系统开销很低,CPU 占用率为8 。可以看出使用DMA方式可以使系统 CPU从实际的I/0数据传输过程中摆脱 来,从而降低 系统的开销。 普通方式传输 N 堡堡竺塞鉴 ● Y 通过在3G环境中的实验,使用DMA方式的高速串口 驱动可以正常使用PS业务,可以享有高速率的数据下载业 务。而普通方式在3G上网环境下的高速传输数据,_3 8 Microcontrollers&Embedded Systems 20 13年第10期  www.mesnet.com.CR 圈 结 语 12通道数据采集系统实物电路板和采集电池电压如 图6所示。 实验结果显示,所采集的电池电压具有很高的精确 度,能完全实现多路数据的采集,特别对于蓄电池组,具有 更加良好的监测及保护性能。目前,该监测方案已经应用 于矿用应急电源蓄电池组电源管理系统,具有较高的可靠 性和实用性。耀 参考文献 [1]MAXIM Integrated.MAX11068 Datasheet[-EB/OL].[2013 Q6 .http;ffwww.maximintegrated.com/datasheet/index. mvp/id/5523. E2]潘琢金.C8051F340/I/2/3/4/5/6/7全速USB FLASH微控 制器数据手册[EB/OL ̄.[2013—06].http://www.xh1. corn.cn/CN/Jisuln{o AllInfo.aspx?menuid一0103040101. 酝谊(磺士雨 宛囊 研露方向为馥算机撩嘲与l工程膛搠 图6 监测系统实物图和采集结果 (责任l端辫{捕迪娜寝稿鹰期:2013-06-01) _由于FIFO溢出,导致重传,从而效率较低,数据下 [2]谭钦红,张际生,李文杰,等.Linux系统中PCI设备DMA数 载速度较低。 据传输实现[J3.重庆邮电大学学报:自然科学版,2012(2). [3]谭平,王小平.ARM Linux下DMA数据同步传输机制及实 现EJ3.无线互联科技,2013(2). [4]赵同样.嵌人式Linux系统驱动研究与开发[D].哈尔滨:中 国地震局工程力学研究所,2O12. 结 语 通过将串口驱动普通传输方式改写为基于DMA的 工作方式,可以提高传输速率,同时降低系统的开销,满足 在3G网络环境下高速上网的需求。本文提出的基于 DMA方式的串口驱动对其他需要利用串口高速传输数 据的应用也具有借鉴意义。l 参考文献 [1]王海霞.TD/GSM双模手机软件架构的研究与实现[D]. 南京:南京邮电大学,2010. Es]李宇丽.基于ARM的嵌入式Linux系统的研究及应用[D]. 西安:西安电子科技大学,2007. 错阉(硕 彭太簿(正高级童程师、硕士生导师)l'研究方向油移 谚毙霞渤爱嵌 畿:1.!nux终端菠备开发 磷通信 黄 峰《颥 《责任骟辑;鸯珍收稿离期:2o13—05忽2) 劳特巴赫针对Cortex—M系列推出全新一体化解决方案 目前,嵌入式系统调试仿真工具层出不穷 这些调试仿真工具在功能和通用性方面存在很大差异,价格相差也非常悬殊,既有 几十元的简易JTAG调试器,也有几万元甚至几十万元的高端调试仿真器。 一直致力于高端市场的劳特巴赫公司,近日针对Cortex—M系列推出了全新一体化解决方案—— ̄Trace 这是一款适用于ARM Cortex—M系列处理器的新型组合调试与跟踪系统,集调试功能与跟踪功能于一体,但是售价却是劳特巳赫传统产品价格的一半。 劳特巴赫凭借此款名为“Trace的新产品扩展了其产品组合。该产品专为ARM Cortex—M系列设计。通过其TRACE32 PowerView软件调试环境,“Trace系统为开发者提供了熟悉的调试和追踪用户界面。通过使用简单及复杂的断点,开发者可控制 程序执行并分析C及C++代码数据。同时,该工具也支持在程序运行期问访问内存和外围设备。  ̄Trace通过USB3.0连接至主机,通过JTAG、串行线调试或cJTAG(IEEE 1149.7)与目标板进行连接,也提供半尺寸的lO/ 20/34针适配器和14/20针JTAG连接器。对于标准开发板,许多其他适配器也同样适用。应用跟踪模式时,该工具内置256 MB 存储缓冲器,如果用户需要采集更长周期的程序流数据,也可以设置为流数据传送至主机保存。 与传统工具不同,“Trace采用全新紧凑设计,模块化设计及可扩展化,使其系统成本更具吸引力。与所有劳特巴赫产品一样, Trace由TRACE32 Power View GUI控制。该系统可以通过劳特巴赫有限公司的全球销售与分销渠道订购,产品编号为LA一 4530,也可以登陆公司主页Lauterbach.com/order订购。 (责任编辑:芦潇静) 4 2 Microcontrollers&Embedded Systems 20 13年第10期 WwW.mesnet.com.cn 

因篇幅问题不能全部显示,请点此查看更多更全内容

Top