正文

嵌入式Linux下ARM处理器与DSP的数据通信(1)2008-09-22 22:23:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/niao0311/38452.html

分享到:

1 引言

基于ARM核心处理器的嵌入式系统以其自身资源丰富、功耗低、价格低廉、支持厂商众多的缘故,越来越多地应用在各种需要复杂控制和通信功能的嵌入式系统中。

内核源码开放的Linux与ARM体系处理器相结合,可以发挥Linux系统支持各种协议及存在多进程调度机制的优点,从而使开发周期缩短,扩展性增强。作为数字处理专用电路,DSP的数字信号处理能力十分强大,但对诸如任务管理、通信、人机交互等功能的实现较为困难。

如果将这三者结合起来,即由DSP结合采样电路采集并处理信号,由ARM处理器作为平台,运行Linux操作系统,将经过DSP运算的结果发送给用户程序进行进一步处理,然后提供给图形化友好的人机交互环境完成数据分析和网络传输等功能,就会最大限度的发挥三者所长。


  
2 系统结构

该系统硬件由二部分组成,其中一部分为若干块DSP板,各自独立承接数据采集和信号处理。另一部分为以ARM为核心处理器的CPU板。系统硬件框图如图1所示(仅接口部分)。
  
3 接口硬件部分设计

3.1 HPI接口简介

HPI接口是TI公司新一代、高性能DSP上用以完成与主机或其他DSP之间数据交换的接口,这里主要介绍实际电路中使用的控制引脚和时序。
HCNTL0和HCNTL1为访问控制选择。用来确定主机(ARM)究竟对TMS320C6711中的哪一个HPI寄存器进行处理。具体功能如表1所列。



HHWIL:半字节定义选择,与HPIC寄存器中的HWOB位进行配合可以选择当前传输的是高半字还是低半字。低电平是第一个半字,高电平是第二个半字。

HCS:选通脉冲(Strobe),与HDS1、HDS2相互配合完成内部信号HSTROBE的生成。逻辑关系如图2所示。

将HDS1、HDS2分别固定为高电平和低电平,这样HCS就和HSTROBE完全一致。
HSTROBE读时序如图3所示。

3.2 接口电路

ARM处理器通过DSP的HPI接口与DSP进行连接的硬件原理如图4所示(以单板DSP为例)。其中SN74LVTH16245为16位(二个8位)双向三态总线收发器,主要起总线驱动和方向控制的作用同时也保证在不对HPI口进行操作时数据总线锁闭。AT91RM9200为Atmel公司生产的ARM9为核心的处理器,其中引脚D0-D15为数据总线,A2-A8为地址总线的一部分,CS3为片选信号线,当ARM对总线地址范围为0x40000 0000~0x4FFF FFFF的外部设备进行操作时,会在该引脚产生一个片选信号。同时该信号控制SN74LVTH16245的使能端,避免在读写其他地址时对HPI端口造成影响。TMS320C6711D是TI公司生产的DSP,每秒可以完成15亿次浮点运算,数据处理功能十分强大。引脚D0-D15为数据总线。其余端口是HPI接口的控制引脚。



4 驱动程序设计

4.1 Linux驱动程序简介

在Linux操作系统下有二种方式将驱动程序装入操作系统内核:一种是直接将驱动程序编译进内核,另外一种是将驱动程序构建为驱动程序模块后采用insmod/rmmod命令将模块加载内核中。由于是在嵌入式系统中进行程序开,所以笔者选用了模块加载方式。这样,在整个程序的调试过程中不必因为修改某处而反复编译整个内核,只需编译驱动程序模块并重新加载。

本例中Linux下的驱动程序主要用来完成文件(Linux把外部设备也认为是文件)的打开、关闭、读、写等操作。也就是对如下结合的填充。

Static struct file_operations fops=
{open:hpi_open,
release:hpi_release,
mmap:hpi_mmap,
};

其中,open和release完成设备的打开和关闭。mmap为内存地址映射操作。因为采用的是模块加载方式,所以还应该加上int init_module(void)和void cleanup_module(void)函数,以完成模块的注册和卸载。

4.2 驱动程序中映射的实现

由于驱动程序的内存空间是在内核空间中,因此首先应解决内核空间与用户空间的交互问题。这里采用最直接的方式将内核空间和用户空间联系起来实现映射,即利用remap_page_range内核函数(通过mmap系统调用实现)。

函数原形如下:

int remap_page_range(unsigned long virt_add,unsigned long phys_add,unsigned long size,pgprot_tprot);

函数的功能是构造用于映射一段物理地址的新页表。函数返回的值通常是0或者一个负的错误码。函数参数的确切含义如下:

virt_add:重映射起始处的用户虚拟地址。phys_add:虚拟地址所映射的物理地址。Size:被重映射的区域的大小。Prot:新VMA(virtual memory area)的“保证(protection)”标志。具体定义在源泉文件/include/linux/mm.h中。系统调用MMAP的程序代码如下:

static int hpi_mmap(struct file *f,struct vm_area_struct *vma)
vma->vm_flags|=VM_WRITE;
if(remap_page_range(vma->vm_start,((0x40000000)),
vma->vm_end-vma->vm_start,(_pgprot (pgprot_val(pgprot_noncached(vma->vm_page_prot))|
(L_PTE_WRITE|L_PTE_DIRTY))))) //进行映射
{return -1;} //映射失败
return 0;
}

结合硬件结构可对函数remap_page_range()分别填充如下参数:

remap_page_range(vma->vm_start,((0x40000000)),vma->vm_end-vma->vm_start,(__pgprot(pgprot_val(pgprot_noncached(vma->vm_page_prot)) |(L_PTE_WRITE|L_PTE_DIRTY)))))
其中vma为结合vm_area_struct,在中定义。

应用中需要注意以下字段:unsigned long vm_flags应该使用标志VM_RESERVED,以避免内存管理系统将该VMA交换出去。因为要对DSP写入数据,所以必须使用标志VM_WRITE说明对这一段VMA是允许写入的。pgport_t vm_page_prot指明了对VMA的保护权限。由于利用CS3对DSP的HPI接口进行控制,所以应用pgprot_noncached禁止高速缓冲。



通过mmap的构建就能够将内核空间的数据映射到用户空间去,也就是说可以在用户空间内直接对地址为0x4000_0000的内存空间进行操作,而该段空间正是DSP的HPI接口所对应的地址。

在实际应用中,应对CS3的低电平脉宽加以控制,方法是在初始化模块时对ARM的控制寄存器CSR[3]进行调节。该寄存器的D0-D6确定了ARM外部总线的时钟延时周期,D7为等待周期的使能,D12-D14为数据宽度。具体定义如下:AT91_SYS->EBI_SMC2_CSR[3]=0x00003083,即使用16bit数据宽度,等待周期为3个。当ARM主频为180MHz时,CS3低电平脉宽约为150ns。

阅读(1829) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册