基于HPI的数据通信接口设计

2009-06-20 08:45程泽国秦开宇梅领亮
中国高新技术企业 2009年6期

程泽国 秦开宇 曹 勇 梁 前 梅领亮

摘要:文章采用DSP的HPI(Host Port Interface)接口技术,设计实现了运行于Linux下ATMEL公司的ARM9微控制器AT91RM9200与TI公司的TMS320C6713数字信号处理器之间的数据通信。并给出了硬件连接方案和嵌入式Linux下的驱动程序开发过程和部分关键源代码。

关键词:HPI接口;ARM;DSP;嵌入式Linux;设备驱动程序

中图分类号:TP274文献标识码:A文章编号:1009-2374(2009)06-0150-02

基于ARM核心处理器的嵌入式系统,以其自身资源丰富、功耗低、价格低廉的缘故,越来越多地应用在各种复杂控制的嵌入式系统中。但ARM也有自身的弱点,如ARM在大量数据处理方面就不如DSP快。

DSP作为数字处理专用电路,由于其特殊的结构、专门的硬件乘法器和特殊的指令,使其能快速地实现各种数字信号处理及满足各种高实时性要求,但其对诸如任务管理、通信、人机交互等功能的实现较为困难。

在当今有大量计算的数字系统中,由于ARM在数字处理方面和DSP在系统控制方面都有其弱点,单独用ARM或DSP来完成系统的设计都不是很好的选择。而如果将ARM、DSP、Linux三者结合起来,即由DSP处理信号,以ARM处理器作为平台,运行Linux操作系统,将经过DSP运算的结果发送给用户程序进行进一步处理,然后提供给图形化友好的人机交互环境完成数据分析和网络传输等功能,就会最大限度的发挥三者所长。

一、HPI接口硬件电路连接设计

(一)HPI接口介绍

HPI(Host Port Interface主机接口)是TI公司为了满足DSP与其他微处理器接口通信而专门设计的16/32位宽度并行接口。主机处理器可以通过它直接访问DSP的整个内存空间。

HPI接口就功能来分,可以分为数据接口和控制接口两大类。数据接口用于与外部主机交换数据,HD[15-0]为HPI数据接口;控制接口负责寄存器的设置和信号的控制,HPI接口向主机提供三个寄存器:地址寄存器(HPIA),控制寄存器(HPIC)和数据寄存器(HPID),通过HCNTL[1-0]可以选择相应的寄存器。HHWIL的功能是区分当前在HPI总线上的数据是前一个半字还是后一个半字。HR/W为HPI的读写控制信号,高电平时为读操作,低电平时为写操作。HDS1和HDS2为HPI数据有效信号。HCS为HPI接口的片选信号。HRDY为HPI的输出信号,低电平表示HPI准备就绪。HINT是一个输出信号, HPI可以通过该引脚中断主机。

(二)ARM与DSP间的硬件连接

本文所采用的AT91RM9200具有丰富的接口用以与外部通信。根据以上所介绍的HPI接口原理,设计出AT91RM9200与TMS320C6713硬件连接方案如图1所示:

图1 AT91RM9200与TMS320C6713硬件连接

将ARM的数据线D0:15与DSP的数据地址线HD0:15相连;用ARM的地址信号线A4、A3、A2和A1分别连接DSP的HR/W、HCNTL1、HCNTL0和HHWIL控制信号线;用ARM外部总线接口控制信号线NCS2、NWR0、NRD和NWAIT分别连接DSP的控制信号线HCS、HDS2、HDS1和HRDY,其中HRDY需取反后连接NWAIT;DSP的HINT信号线连接到ARM的中断脚IRQ0。DSP的HAS信号线在设计中直接用10k电阻上拉至高电平。

二、HPI接口驱动程序设计

在编写接口驱动时,HPI接口是被看作接到主机RAM的外设,由硬件设计可知DSP芯片HPI接口的片选线与ARM芯片EBI总线的片选NCS2相连,DSP内部存储器映射到ARM的地址空间0x30000000~0x3FFFFFFF。由于ARM的地址线连接HPI接口控制线,所以对不同寄存器的读写操作在此看来是对不同的地址进行相应的操作。在下面代码中设置HPI的基地址HPI_BADD为0x30000000,其通过ioremap()映射后的虚拟地址为HPI_VBADD,对地址偏移量进行操作就能指定对不同寄存器进行不同操作的对应地址指针(W和R表示读和写,F和S表示前半字和后半字,A表示以地址自增方式读或写)。

typedef unsigned short AT91_DSP;

#define HPI_BADD 0x30000000

#define bHPI (Nb) (HPI_VBADD+ (Nb))

#define HPIC_W_F ((AT91_DSP *) bHPI (0))

//00000--A4A3A2A1A0

#define HPIC_W_S ((AT91_DSP *) bHPI (2))//00010

#define HPIA_W_F ((AT91_DSP *) bHPI (4))//00100

#define HPIA_W_S ((AT91_DSP *) bHPI (6))//00110

#define HPID_R_F_A ((AT91_DSP *) bHPI (c))//01100

#define HPID_R_S_A ((AT91_DSP *) bHPI (e))//01110

……

字符设备驱动程序最重要的数据结构是定义于Linux/fs文件中的file_operations结构体,实现file_operation结构体中的成员函数是驱动程序设计的主体内容,这些函数实际会在应用程序进行Linux系统调用时最终被调用。

在HPI驱动程序中,hpi_open和hpi_release函数用于打开和释放设备,hpi_read和hpi_write函数指定了驱动程序的读写入口点。在hpi_open函数中需要完成对HPIC寄存器的初始化,通过设置HPIC的HWOB比特位将HPI数据传输设定为高半字在前还是低半字在前,本文采用低半字在前。

在hpi_read和hpi_write函数中,ARM存取DSP数据时,将读写的起始地址写入地址寄存器HPIA,然后就可以在数据寄存器HPID中存取数据了。以HPI驱动读函数为例关键源代码如下:

……

down (& (dev->sem));//获取信号量

outw ((0xffff&taddr;), HPIA_W_F);

outw((0xffff&(taddr>>16)),HPIA_W_S);

//将读起始地址taddr写入HPIA寄存器

for (i=0; i

{t1=inw (HPID_R_F_A);

t2=inw (HPID_R_S_A);

read_buf[i] = (t1 | (t2<<16));

}//自增方式读count个数据至缓冲区

ret=copy_to_user(buf,read_buf,count)?-EFAULT:ret; //复制到用户空间

……

up (& (dev->sem));//释放信号量

……

至此,HPI的设备驱动已经实现,只要把该设备驱动编译成模块动态加载到Linux内核中,应用程序就可以调用HPI驱动,实现对DSP的访问。

三、结语

本文利用HPI实现了ARM与DSP之间的数据通信,所给出的硬件连接方案简单可靠,在实际应用中只需要在通信双方规定一个简单的协议便可实现两者之间的高速数据通信。通过HPI接口实现双机通信充分发挥了ARM和DSP的优点,有巨大的实际应用价值。

作者简介:程泽国(1980-),男,电子科技大学自动化工程学院硕士研究生,研究方向:嵌入式系统。