第27卷第6期增刊2006年6月仪器仪表学报ChineseJournalofScientificInstrumentV01.27NO.6Jun.2006基于Linux下的ARM与DSP之间数据通信张金平张定会谢光伟上海吴昱曼200093)(上海理工大学光学与电子信息工程学院摘要本文设计运行于Linux下三星¥3C2410ARM9同TI公司的TMS320Vc5420数字信号处理器间的数据通讯方案,给出该方案相应的部分硬件接I:l电路和嵌入式Linux下的驱动程序主要代码和读写HPI程序。关键词LinuxARMDSPHPI嵌入式系统Datacon删unicationbasedonARMprooessoralldDsPinanbeddedlinuxenviromnentXieGuangweiZhangJinping(CollegeZhangDinghuiWuYuminofOpticsandElectronicsInformationEngineering,UniversityofShanghaiforScienceandTechnology,Shanghai200093,China)AbstractThispapermainlydesignsortofdatacommunicationprojectbasedonSamsung’S¥3C2410ARM9whichrunningLinuxsystemandTIcorporation'sTMS320VC5420DSPprocessor.Somehardwarecircuitsanddriverprogrammeandread/writeHPIprogrammeLinuxdiscussed.KeywordsARMDSPHPIembeddedsystem1引言2ARM与DSP间的硬件连接ARM芯片的控制性能较强,在嵌入式系统中嵌入式系统的核心是嵌入式微处理器和嵌入式操作系统。近年来32位处理器以其高性能、低价格,得到了广泛的应用,操作系统已成为嵌入式系统不可缺少的部分。免费的嵌入式操作系统,如Linux等,随着自身不断的改善,得到了飞速的发展。Linux是一个强大的、可信赖的、具有可伸缩性与扩充性的操作系统。Linux实现了许多现代化操作系统的理论,并且支持完整的硬件驱动程序、网络通信协议与多处理器的架构,其源码的公开更有利于操作系统嵌入式应用。DSP由于其特殊的结构、专门的硬件乘法器和特殊的指令,使其能快速地实现各种数字信号处理及满足各种高实时性要求,但对诸如任务管理、通信、人机交互等功能的实现较为困难。基于上述分析,本系统充分利用ARM和DSP的各自特点,使ARM和DSP芯片进行协同工作。ARM选用了Linux操作系统,以利于充分发挥系统的效能。ARM主要用于控制和少量的数据处理。DSP作为数据运算部分,可以充分发挥其对数字信号处理的独特优势。ARM与DSP之间的硬件连接如图1所示。D0一D15HDO—HDl5A1A2bGCS4HCNTL0HCNTLlHCSnWENOEALEELET0H矗盯HDS2_L门。HR删j兰卜H蕊ItlNTIIRDYnWAlTARMS3C2410DSPTMS320VC5420图1ARM与DSP的硬件连接图2.1DSP端接口介绍TMS320VC5420拥有两个DSP核,且片上有32KDARAM和168KSARAM,功耗0.32mW/MIPS,万方数据 第6期增刊基于Linux下的ARM与DSP之间数据通信2057200MIPS全速工作时不超过120mW,功耗极低,同时它有1个16位的HPI接口。HPI(Host—Portinterface)是连接C54x芯片与主机设备或主处理器的并行接口,用于完成主机与目标DSP间的数据交换。在本系统中,主机设备为ARM处理器。下面给出DSP相关管脚的说明:(1)HD0~HDl5:16位双向数据线,用于交换数据;(2)HCNTLl/o:组合用于选择主机所访问的HPI寄存器,如表l所示;(3)HR/W:指明HPI读写控制线;(4)HAS:地址锁存使能(ALE),如果不用就接高电平;(5)HDSl/2、HCA:结合在一起使用,用于数据选通,其逻辑关系如图2所示。表1HCNTLO/1的选择功能描述HCNTLlHCNTL0说明再丽R哑图2数据选通信号(6)HRDY:握手信号,HPI准备好指示;(7)HINT:DSP向主机发出中断请求,系统将HPI接口所有控制寄存器、地址寄存器、数据寄存器统一编址,映射到¥3C2410的Ox2000—0000—0x27FF—FFFF的地址空间,片选信号为nGCS4。2.2ARM端接口介绍¥3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器核,采用0.18pm制造工艺的32位微控制器,最高可运行在203MHz。ARM处理器通过DSP的HPI接口与DSP进行连接的硬件原理如图1所示。下面给出ARM部分管脚介绍:(1)DO—D15为数据总线,用于交换数据;(2)A1一A2为地址总线的一部分,用于控制对DSP中哪个寄存器读写;(3)当ARM对总线地址范围为0x2000—0000—0x27FF—FFFF的外部设备进行操作时,会在nGCS4引脚产生一个片选信号,控制DSP的HPI的使能输入;(4)nOE和nWE用来显示当前总线处于读或写循环,并且控制DSP的读写使万 方数据能,通过图1所示逻辑门变换成HPI的读/写信号;(5)ALE为地址锁能管脚;(6)EINT0是外部中断信号请求管脚;(7)当ARM的0x2000—0000—0x27FF_FFFF存储空间处于激活状态的时候应该通过nWAIT引脚来延长nOE持续时间,从tacc一1核对nWAIT,在采样nWAIT为高电平的后一个周期使nOE变为高电平,nWE和nWAIT信号相同。3ARM和DSP的通信机制当DSP完成数据处理以后,其CPU向HPIC的HINT位写1以中断ARM主机的其他工作以便ARM来读取DSP已处理好的数据,随后ARM将传送另外一批要处理的数据给DSP。主机ARM接收到来自DSP的中断信号以后,设置HCNTL0、HCNTLl对HPIC的HINT位写1来清除中断,同时查询其中的HRDY位是否为1。如果为1,写HPIA以告诉DSP从什么位置开始进行自增读。接着将HPIC的FETCH位置1让DMA传送数据到HPID中。再读HPIC以查询其中的HRDY位是否为1,如果为1则表示DSP中数据已经备妥。最后设置HCNTLo、HCNTLl分别为0、1,从HPID中读取数据同时HPIA自增1。由于采用了自增模式,不需要再次写HPIA。如果有需要,可以每两次读取以后,用软件将其合并成32位数据。主机再将新一批的数据传送给DSP处理时也是同样的道理,但是最后要对HPIC寄存器的DSPINT位置1,让DSP退出复位状态,开始执行新的处理。HPI的时序图如图3所示。为了实现ARM对DSP的控制,要求对HPIC,HPID,HPIA等寄存器的读写必须满足HPI接口的定义,本系统采用自增模式。在ARM读DSP的前半个字节(高16位)和后半个字节(低16位)时,分别设置HCNTL0—0,HCNTLl—1(主机读数据锁存寄存器HPID),在写DSP数据时,同样设置HCNTLo一0,HCNTLl—1(ARM写数据锁存寄存器HPID)。需要注意的是,HPIA在每次读操作后增加1,在写操作前增加1。4ARM和DSP的通信接口程序设计在Linux操作系统中,有2种方法将驱动程序装入操作系统内核:一种是直接将驱动程序编译进内核,2058仪器仪表学报第27卷嘲姆豳烂誓EⅪ豳豳嗷j匠)豳暖豳C。嬲广—气黼弋盘匾广—、广—、厂雕∞_腑。√、-_一_-,戳=丁—弋n厂一1、一种一—_,、晰_,篇—————qK至>——固K互>一漂——————<噩卜———《豹忡~忡———弋==7弋八.厂一图3HPI的读写时序图另外一种是将驱动程序构建为驱动程序模块后采用insmod/rmmod命令将模块加载到内核中。本系统中采用模块加载的方式。这样,在整个程序的调试过程中就不必因为修改某处而反复编译整个内核,只需编译驱动程序模块并重新加载。Linux系统访问设备就像访问文件一样,例如打开设备使用系统调用open(),关闭设备使用系统调用close(),读写设备使用调用read()和write()。在Linux内核中,字符设备使用structfile—operations结构来定义设备的各种操作集合,结构中的各个函数分别被相应同名或类似的名称的系统调用。当然驱动程序并不是要实现所有的操作,可以根据实际设备需要,有选择地实现相应的函数调用。当结构中的操作函数没有被实现时,函数指针变量设置为NULL。在本文所研究的系统中,structfile—operation函数为:structfile_operations{structmodule*owner;//成员1int(*open)(structinode*,structfile*);//成员2ssize_t(*read)(structfile*,char*。size—t,loff_t*);//成员3int(*mmap)(structfile*,structvm_areastruct*);//成员4size(*write)(struetfile*,constchar*.sizet,loff_t*);//成员5int(*release)(structinode*,structfile*);//成员6,;成员1的owner结构指针指向struct—operations结构所属于的驱动程序模块。成员2的open方法用来打开设备,如果该方法没有实现,系统调用open总是成功,直到驱动程序得不到任何打开设备的通知。成员3的read方法用来向设备中读取数据,成功返回读取的字节数(非负值),read等于NULL时,将导致调用失败,并返回一EINVAL(invalidargument非法参万 方数据数)。成员4的mmap方法用来将设备的内存映射为用户进程的地址空间中去,如果设备没有实现这个方法,系统调用mmap将会返回一ENODEV。成员5的write方法用来向设备写入数据,成功返回实际写入的字节数(非负值),write等于NULL时,将导致调用失败,并返回一EINVAL。成员6的release方法在当结构structfile释放时被调用,比如关闭一个文件或设备。字符设备的注册通过调用intregister—chrdev(unsignedintmajor,constchar*name,structfile—operations*fops)来注册,通过intunregister—chrdev(unsignedintmajor,constchar*name)来卸载。当有一个程序对虚拟地址进行查询时,CPU必须把该虚拟地址转换成物理地址,这样才能对物理内存进行访问。这可以通过把地址分割成位字段的方法来实现。每一个位字段都是一个数组的索引,该数组被称为页表。通过这些位字段可以获得下一级页表的地址或保存有虚拟地址的物理页的地址。构造用于映射一段物理地址的新页表的工作是由函数remap_page_range完成的。它的原型如下:intremap—page—range(unsignedlongvirt—add,unsignedlongphys_addr,unsignedlongsize,pgprot—tprot)该函数返回的值通常是0或者一个负的错误码。其中virt_add是需重映射的用户虚拟地址的起始位置,函数为从virt_add到virt—add+size之间的虚拟地址构造页表;phys_addr是虚拟地址所映射到的物理地址,函数影响从phys—add到phys—add+size之间的物理地址;size是被映射区域的大小,以字节为单位;prot是保护标志,驱动程序可以(并且应该)使用vma一>vm_page_prot中的值。remap_page_range的处理过程是对virt_add到virt—add+size之间的每一个页面,查找它所在的页目录和页表(必要时建立页表),清除页表项旧的内容,重新填写它的物理地址与保护域。remap_page—range可以对多个连续的物理页面进行处理。#include<linux/mm.h>intsimple—mmap(structfile*filp,structvm—area—struct*vma){unsignedlongoffset=vma一>vm—pgoff<<PAGELSHIFT;if(offset>一一 一pa(high—memory)II(flip一>Lflags&o_SYNC))vma一>vm_flagsI—VM—10;第6期增刊基于Linux下的ARM与DSP之问数据通信2059vma一>vm_flagsf=VM—RESERVED;if(remap—page_range(vma一>vm_start,offset,vma一>vmend一Ⅵm一>vms切rt,vrna-->vm_page_prot))return—EAGAIN:return0;)/dev/mem的代码进行了检查,以查看所请求的偏移量(保存在vma一>vm—pgoff中)是否超出了物理内存;如果是的话,则设置VMA的VM-10标志,以标记该区域为I/o内存。VM~RESERVED标志总是被设置以防止系统将该区域交换出去。然后它调用remap—page_range来构造必须的页表。所有例子都是/dev/melTl的再现实现,它们将物理地址重映射到用户空间。然而,典型的驱动程序只想映射对应外围设备的小地址区间,而不是所有的内存。为了向用户空间映射整个内存空间的一个子集,驱动程序仅仅需要处理偏移量。hpi—read:读取HPI状态时,先锁定HPI控制单元,防止另一个进程同一时刻改变HPI状态。然后从控制单元获得状态值,并拷贝到用户缓冲。完成操作后解锁,并返回读取字节数。staticssize—thpi—read(structfile*file,char*bur,size—tcount,loft—t*offset){u8temp;intret;structunit*unit=(structunit*)file一>private_data:if(count>1)count=1;HPLLOCK(unit);Temp=hpi_get—value(unit);Ret—copy—to—user(buf,&-temp,count)?一EFAULT:count;HPLUNLOCK(unit);returnret;hpi_write:写HPI状态时,先锁定HPI控制单元,防止另一进程同一时刻改变HPI状态。然后从用户缓冲读万 方数据取数据并写到控制单元去,同时也改变HIP的状态。完成操作后解锁,并返回写的字节数。staticssize_thpLw“te(structfile*file,char*buf,size_tcount,loff_t*offset){u8temp;intret;structunit*unit=(structunit*)file一>private_data;if(count>1)count=1;HPLLOCK(unit);ret=copy_from—user(&temp,bur,count)?一EFAULT:count;if(ret)hpi—set—value(unit,temp);HPI—UNLOCK(unit);returnret;)5结束语本文采用ARM9和DSP双CPU构建的嵌入式系统开发平台,将它们各自的长处有机地结合起来:两者通过高速并行接口(HPI)实现数据交换,其中实时控制交给ARM完成,而DSP完成数据处理。并通过基于ARM的嵌入式Linux操作系统,还能提供友好的人机交互界面。该平台可以很好地在图像采集编解码处理,无线电产品,智能仪表等领域发挥作用。参考文献F1]TMS320C54XDSPReferenceSet[Z].Volume1:CPUandPeripherals.TexasInstruments,2001.[2]TMS320VC5420Fixed—PointDigitalSignalProcessor[Z].TexasInstrument,2001.[3]¥3C2410X32一BITRISCMicroprocessorUser’SManual[Z].SamsungElectronics,2003.[4](美)RubiniA,等,Linux设备驱动程序.2版[M].魏永明,译.北京:中国电力出版社,2002.E53清源科技.TMS320C54XDSP硬件开发教程[M].北京:机械工业出版社,2003.基于Linux下的ARM与DSP之间数据通信
作者:作者单位:刊名:英文刊名:年,卷(期):被引用次数:
张金平, 张定会, 谢光伟, 吴昱旻, Zhang Jinping, Zhang Dinghui, Xie Guangwei, Wu Yumin
上海理工大学,光学与电子信息工程学院,上海,200093仪器仪表学报
CHINESE JOURNAL OF SCIENTIFIC INSTRUMENT2006,27(z3)2次
1.TMS320C54X DSP Reference Set.Volume 1:CPU and Peripherals.Texas Instruments 20012.清源科技 TMS320C54X DSP硬件开发教程 2003
3.Jonathan Corbet;Alessandro Rubin;Greg Kroab-Hartman;魏永明 耿岳 钟书毅 Linux设备驱动程序 20024.S3C2410X 32-BIT RISC Microprocessor User's Manual.Samsung Electronics 20035.TMS320VC5420 Fixed-Point Digital Signal Processor.Texas Instrument 2001
1. 何剑锋.何月顺.叶志翔.HE Jian-feng.HE Yue-shun.YE Zhi-xiang 嵌入式Linux下ARM/DSP通信接口设计及驱动开发[期刊论文]-仪表技术与传感器2009(5)
2. 田家林.陈利学.寇向辉.TIAN JIALIN.CHEN LIXUE.KOU XIANGHUI LINUX嵌入式操作系统在ARM上的移植[期刊论文]-微计算机信息2007,23(11)
1.王金武.全惠敏.戴瑜兴.广建设 基于嵌入式Linux和DSP的在线电能质量监测系统[期刊论文]-仪表技术与传感器2010(2)
2.毛晓波.刘国栋.陈铁军.黄云峰 嵌入式机器视觉系统中ARM与DSP的数据通信方法[期刊论文]-电子设计工程2010(10)
本文链接:http://d.g.wanfangdata.com.cn/Periodical_yqyb2006z3115.aspx