APP下载

基于i.MX6Q+FPGA平台Android下EIM总线接口设计

2016-06-08陈崇森

现代计算机 2016年13期
关键词:驱动程序内核调用

陈崇森

(广州海格通信集团股份有限公司,广州510663)



基于i.MX6Q+FPGA平台Android下EIM总线接口设计

陈崇森

(广州海格通信集团股份有限公司,广州510663)

摘要:

关键词:

0 引言

i.MX6Q平台是Freescale公司推出的新一代面向多媒体设备的高性能低功耗应用处理器,在手持、车载终端,平板电脑等通信、工业、医疗及消费类电子领域获得广泛应用。基于四核ARM Cortex-A9架构,运行频率可高达1.2GHz,外设接口丰富,可运行Android系统,为用户提供流畅的使用体验。大规模FPGA可实现专属复杂算法运算及片上系统的定制,两者结合可为数字业务处理提供完美的平台解决方案。i.MX6Q与FPGA采用EIM总线接口连接可实现高速通信,此种连接具有通信可靠,FPGA时序逻辑易于实现等优点,但是此类接口在Android 4.2.2下驱动开发没有先例可参考,实现从Android的App到FGPA的顶层到底层的数据贯通成为了设备研发的关键。

1 i.MX6Q的特点及EIM接口

i.MX6Q的特点[1]如下:

①4个ARM Cortex-A9内核,每个内核运行频率高达1.2 GHz,1 MB L2缓存,32 KB指令和数据缓存NEON SIMD媒体加速器。

②GPU 3D为Vivante GC2000,200Mtri/s 1000Mpxl /s,OpenGL ES 3.0 & Halti,CL EP;GPU 2D(矢量图形)为Vivante GC355,300Mpxl/s,OpenVG 1.1;GPU 2D(复合)为Vivante GC320,600Mpxl/s,BLIT;支持1080p60 h. 264视频解码,1080p30 H.264 BP/双720p视频编码;摄像头接口支持1x 20位并行,MIPI-CSI2(4通道),三路同时输入。

③存储器支持两个32 LP-DDR2,1个64 DDR3 / LV-DDR3;NAND支持SLC/MLC,40位ECC,ONFI2.2,DDR。

④数据连接支持4个USB2.0,1 Gbps + IEEE1588以太网接口,3个SD/MMC 4.4,1个SDXC5x SPI,5x UART,3x I2C,MIPI-HIS,PCIe 2.0(单通道)。

⑤支持2 x 4XGA(2048x1536)或2 x[1080p + WXGA(1280x720)]显示。

⑥电源管理PMU集成恩智浦PF100电源管理单元。

i.MX6Q的EIM总线接口用于为片外设备和存储器提供带片选、时钟和控制逻辑的总线接口,既提供如SRAM等设备的异步访问功能,又具备对NOR-Flash 或PSRAM等设备的同步访问功能。EIM总线具备异步模式、异步页面模式、多路复用地址数据模式、突发时钟模式、低功耗模式及启动模式等六种工作模式[2],该嵌入式平台EIM总线采用异步控制模式,EIM总线功能框图如图1所示。

EIM总线提供多达4个片选分区,每个片区支持128MB的寻址空间,具备写保护引脚,支持多路复用配置成x8、x16、x32数据接口。支持大端及小端模式访问,具备外部中断功能。

该嵌入式平台大规模FPGA采用ALTERA公司Cyclone III系列的EP3C40F324芯片。EP3C40F324芯片内部含39600个逻辑单元,1161216 bit片内RAM,324个管脚[3]。i.MX6Q与EP3C40F324通过EIM总线接口连接进行数据传输,具体连接如图2所示。

图1 EIM总线功能框图

2 Android系统下EIM总线接口设计

Android是一种基于Linux的操作系统,最早由Google等30多家科技公司和手机公司组成的“开放手机联盟”共同研发,而且完全免费开源,主要应用于移动设备,如智能手机及平板电脑[4]。Android系统的总体框架主要分为四层:Kernel、Libraries、Framework、Applications。其中Kernel、Libraries采用C语言或汇编语言实现,使用JNI连接Libraries和Framework。各层描述如下:

图2 i.MX6Q与EP3C40F324的连接

①最底层为Linux Kernel,主要负责内存管理、进程调度等系统管理以及终端的硬件驱动。其中的Binder driver为Google为Android设计的一个增强系统的进程间通信能力模块。

②Kernel的上一层为Libraries,包含了核心库、第三方库和Android虚拟机。Android并没有直接采用传统的J2SE或J2ME的Java虚拟机,而是自己建立了一个称为dalvik的虚拟机,号称更节省字节码的空间,性能更好。

③Framework为Android为应用开发者设计的一套软件框架,提供了丰富的组件,简化了程序开发的架构设计,封装了SDK,提供API供上层调用。

④Application为在Framework基础上开发的各种应用。

HAL层(硬件抽象层)是位于操作系统内核与硬件电路之间的接口层,其目的是在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟的硬件平台[5]。HAL层与Android系统框架的关系如图3所示:

图3 HAL层与Android系统框架结构图

要实现i.MX6Q的EIM总线接口从Android的应用程序到FPGA的贯通,自底向上需要开发的驱动及添加的接口包括:

①Android的Linux内核源代码工程中编写EIM总线驱动程序。

②Android的HAL层增加接口模块以访问EIM总线驱动程序。

③Android系统中编写JNI方法为应用程序框架层提供Java接口。

④Android系统的应用程序框架层增加EIM总线服务接口。

从Android的应用程序到FPGA的接口分层调用关系如图4所示:

图4 EIM总线接口的分层调用关系图

3 Android系统下EIM总线接口实现

按照EIM总线接口设计方法,第一步完成Linux内核源代码工程中编写EIM总线驱动程序。EIM总线驱动在该嵌入式平台上的应用本质上属于字符设备驱动,驱动程序需实现Linux驱动接口函数,为应用程序与FPGA通信提供标准接口。EIM总线的时序配置关系到通信速率的设置及与FPGA交换数据的稳定性,涉及的EIM总线配置寄存器如表1所示。

表1 EIM总线配置寄存器

图5 EIM总线在异步模式读写时序图

EIM总线在异步模式下的读写时序如图5所示。

针对Linux3.0.35内核的EIM总线接口驱动设计,程序主体为各个文件操作函数的具体实现,文件操作结构体eimbus_fops中的成员函数定义如下:

其中eimbus_read提供CS1片区基于物理地址偏移的数据读取接口,eimbus_write提供CS1片区基于物理地址偏移的数据写入接口,eimbus_mmap提供物理地址空间到应用空间的高效片区映射;驱动程序加载及卸载时执行eimbus_init及eimbus_exit函数,eimbus_init完成EIM总线CS1片区的物理地址空间到虚拟地址空间映射、EIM总线时序配置等初始化工作,而eimbus_exit则执行卸载时相关资源的释放。通过修改Kernel相关目录的Kconfig文件,将此驱动编译进内核。

第二步在HAL层增加接口模块以访问EIM总线驱动程序。按照Android硬件抽象层规范要求,在Android开发包顶层目录的hardware/libhardware/ include/hardware下创建eimbus.h用于定义模块ID、硬件模块结构体eimbus_module_t、硬件接口结构体eimbus_device_t。在硬件接口结构体中,fd表示设备文件描述符,对应驱动设备文件"/dev/eimbus",eim_write_data及eim_real_data为HAL层向上层提供的函数接口。在hardware/libhardware/modules下创建eimbus目录,在eimbus目录下建立eimbus.c源程序,定义模块实例变量,实现设备打开和关闭接口eimbus_device_open及eimbus_device_close,设备访问接口eimbus_device_t及eim_write_data。模块实例变量定义如下:

其中eimbus_device_open调用系统open函数打开/dev/eimbus,eimbus_device_close调用系统close函数关闭/dev/eimbus;eim_write_data调用系统write函数使用驱动定义的标准接口函数,eim_read_data调用系统read函数使用驱动定义的标准接口函数。在hardware/libhardware/modules/eimbus目录下新建Android.mk文件用于编译此接口模块,最终生成eimbus.default.so目标文件。

第三步,编写JNI方法为应用程序框架层提供Java接口。在frameworks/base/services/jni目录,创建com_Android_server_EimbusService.cpp源程序,定义eimbus_init、eimbus_readData和eimbus_writeData三个JNI方法。其中eimbus_readData调用硬件抽象层定义的硬件访问接口对FPGA进行读操作,eimbus_writeData调用硬件抽象层定义的硬件访问接口对FPGA进行写操作。JNI方法表定义如下:

通过修改对应目录的Android.mk文件,将此JNI方法编译进Android系统镜像。

最后一步,在Android系统的应用程序框架层增加EIM总线服务接口。在Android系统中,应用程序通过代理来调用硬件服务。在frameworks/base/core/java/ android/os目录,创建IEimbusService.aidl文件定义IEimbusService接口,分别通过writeData和readData两个函数来实现通过EIM总线访问FPGA。通过修改对应目录的Android.mk文件,编译IEimbusService.aidl生成IEimbusService.Stub接口。在frameworks/base/ services/java/com/Android/server目录,创建EimbusService.java文件,定义EimbusService调用JNI方法init_native、writeData_native和readData_native提供EIM总线访问服务。通过修改SystemServer.java文件,在系统启动时自动加载EimbusService。

最后可编写Android应用程序来测试EIM总线对FPGA片内RAM读写。应用程序App通过ServiceM-anager.getService("eimbus")来获得EimbusService,服务名称“eimbus”在系统启动加载EimbusService时指定。然后通过IEimbusService.Stub.asInterface函数将EimbusService转换为IEimbusService接口,IEimbusService接口在Android.os.IEimbusService中定义。App通过IEimbusService.readData和IEimbusService.writeData两个接口实现对FGPA片内RAM的读写。

通过在i.MX6Q侧编写Android应用程序,并在FPGA侧编程实现符合EIM总线时序的被读写逻辑,通过FPGA集成开发环境Quartus II的SignalTap II逻辑分析工具观测读写时序波形与回环数据测试表明,Android应用程序与FPGA通过EIM总线可实现稳定快速通信。

4 结语

本文详细介绍了Android系统下i.MX6Q与FPGA通过EIM总线实现可靠通信的接口分层设计及实现方法,实现FPGA芯片这种非标准接口在Android系统下的数据互通,可用于终端、平板等通信、工业领域,对需要使用FPGA编程实现专用算法的Android系统嵌入式平台具有很好的参考价值。

参考文献:

[1]Freescale Semiconductor. http://www.nxp.com,2016.

[2]Freescale Semiconductor. i.MX 6Dual/6Quad Applications Processor Reference Manual,2013.

[3]Altera Corporation. Cyclone III Device Handbook,2012.

[4]李宁.Android开发权威指南[M].北京:人民邮电出版社,2011.

[5]王振丽.Android底层开发技术实战详解[M].北京:电子工业出版社,2015.

Design of EIM Bus Interface Based on i.MX6Q+FPGA Platform under Android

CHEN Chong-sen
(Guangzhou Haige Communications Group Incorporated Company,Guangzhou 510663)

Abstract:

Keywords:

以Freescale公司的i.MX6Q四核处理器及ALTERA EP3C40F324 FPGA为核心的嵌入式硬件平台,介绍i.MX6Q与FPGA基于EIM总线通信接口设计,基于Linux 3.0.35内核开发此接口的驱动程序方法以及基于Android 4.2.2下从应用到驱动程序的通信实现。该技术已应用到某终端设备研制,实现FPGA芯片与Android系统的连接,实际测试其与Android应用程序可靠通信,对同类型嵌入式平台的驱动接口设计及开发有借鉴意义。

i.MX6Q;EIM总线;FPGA;Android

文章编号:1007-1423(2016)13-0060-06

DOI:10.3969/j.issn.1007-1423.2016.13.016

作者简介:

陈崇森(1983-),男,广东广州人,硕士,研究方向为嵌入式系统、驱动程序设计等

收稿日期:2016-03-18修稿日期2016-04-18

Applies Freescale i.MX6Q quad core processor and Altera EP3C40F324 FPGA as the core components for the embedded platform. The communication interface design is based on EIM bus between I.MX6Q and FPGA,the development method of this interface driver is based on Linux 3.0.35 kernel,and the implementation of communication from the application to the driver is based on android 4.2.2. The technology has been applied to a terminal equipment. The connection between FPGA chip and the Android system is successful. Tests show that the communication between Android application and FPGA is reliable. The design of the interface is a reference to the same type of embedded platform.

i.MX6Q;EIM Bus;FPGA;Android

猜你喜欢

驱动程序内核调用
万物皆可IP的时代,我们当夯实的IP内核是什么?
强化『高新』内核 打造农业『硅谷』
核电项目物项调用管理的应用研究
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
LabWindows/CVI下基于ActiveX技术的Excel调用
基于系统调用的恶意软件检测技术研究
利用RFC技术实现SAP系统接口通信
驱动程序更新与推荐
驱动程序更新与推荐