- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
嵌入式机器视觉系统中ARM与DSP的数据通信方法
下面是本文中的HPI接口的驱动程序的设备入口hpi_open函数,它负责打开、准备设备。
任何时候对字符设备(HPI)接口进行打开操作,都会调用设备的open入口点(hpi_open)。所以open函数(hpi_open)必须对将要进行的I/O操作(对DSP读写数据)做好必要的准备工作,例如设备是独占的,则open函数(hpi_open)必须将设备标记成忙状态,如上面例程中的①处两行所示。
3.2 驱动程序中映射的实现
由于在Linux系统中,用户应用程序不能直接对驱动程序的内存空间进行操作,因此必须用到内存映射机制。内存映射是指把内核中的特定的内存空间映射到用户空间的内存中去。对驱动程序来说,内存映射可以提供给用户程序直接访问设备内存的能力。
mmap系统调用映射一个设备,意味着使用户空间的一段地址关联到设备内存上,这使得只要程序在分配的地址范围内进行读取或者写入,实际上就是对设备的访问。
mmap方法是file_operations结构的一部分,要实现映射必须分两步:
1)调用内核中的remap_page_range函数,它的功能是:构造用于映射一段物理地址的新页表,实现了内核空间与用户空间的映射,其原型如下:
函数参数的确切含义如下:unsigned long virt_add为重映射开始处的虚拟地址。这个函数为虚地址空间virt_add和virt_add+size之间的范围构造页表。unsigned long phys_add为虚拟地址应该映射到的物理地址。unsigned long size为被重映射的区域的大小,以字节为单位。pgprot_t prot为新VMA所请求的"保护"属性。驱动程序不必修改保护,在vma->vma_page_prot中找到的参数可以不加改变地使用。
本课题中使用mmap调用的代码如下:
这样就为DSP的HPI接口所对应的总线物理地址:0x10000000(对应nGCS2)在vma->vm_start和vma->vm_end之间构造了新的页表。
2)在构造好新页表之后,可以调用mmap函数完成映射,从图2可以看到硬件连接图中的连接DSP片选信号的是引脚nGCS2,从图3中查出它在内存空间对应的位置是0x10000000。mmap函数的原型是:mmap(void*start,sizelength,int prot,int flags,int fd,off_toff-set)。用以下语句获得映射后的地址:
hpi_mmap_add=mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_SHARED,hpi_fd,0)其中参数start指明描述字fd对应的"文件"(也就是/dev/hpi设备)在进程地址空间内的映射区的开始地址,必须是页面对齐的地址,通常设为NULL,让内核去自动选择开始地址。任何情况下,mmap的返回值为内存映射区的开始地址。这样通过对hpi_mmap_add操作,实现对起始地址为0x10000000的内存段操作。
作者:毛晓波 刘国栋 陈铁军 黄云峰 来源:电子设计工程