APP下载

GPMC总线在AM3354与FPGA接口应用中的Android驱动实现

2017-12-26刁彦华贾宝青王晓君

电子器件 2017年6期
关键词:外设驱动程序内核

刁彦华,贾宝青,王晓君

(河北科技大学信息科学与工程学院,石家庄 050018)

GPMC总线在AM3354与FPGA接口应用中的Android驱动实现

刁彦华*,贾宝青,王晓君

(河北科技大学信息科学与工程学院,石家庄 050018)

针对以AM3354处理器与FPGA相结合的硬件平台,提出Android下GPMC总线驱动程序的设计方案。论述了GPMC总线结构原理,系统接口设计思路,分析了总线驱动程序的开发流程和方法。完成了Android下GPMC总线驱动程序的设计,包括Linux内核层的添加和Android HAL层的调用,并给出了关键实现代码。Android下GPMC总线驱动程序运行良好,达到预定目标。

Android;GPMC总线;驱动程序;Android HAL

AM3354处理器与FPGA采用GPMC总线实现连接,完成二者之间的数据传输,此种连接方式具有数据传输稳定、高效、FPGA时序逻辑易于实现等优点[1]。但FPGA作为ARM通过GPMC总线连接的新外设,必须要在Android下添加GPMC总线驱动程序,才能保证FPGA与Android系统实现交互。而GPMC总线在Android下的驱动程序的开发研究相对较少,可参考的资料不多,因此Android下GPMC驱动程序的开发是一项值得挖掘的技术。

1 硬件组成

1.1 AM3354处理器

AM3354是由德州仪器生产的以Cortex-A8为核心的处理器。其主频最高速度可以达到1 GHz,不仅处理速度快,而且外部资源丰富,最重要的是内部还集成了GPMC总线,由于它灵活的编程方式使它可以与各种外设连接。该处理器主要用在工业控制领域,尤其是在多处理器组合方式中发挥它的控制作用[2-3]。

1.2 GPMC总线结构原理

GPMC总线是一种通用外部存储控制器,它主要用来连接外部存储器设备。由于它灵活的编程模型,所以支持的外设类型特别丰富,包括异步、同步和页模式的NOR、NAND、SRAM等设备。它与外部设备连接时可以提供16 bit或者8 bit宽的数据总线,时钟频率最高可以提供100 MHz的外部时钟。最大的地址访问空间是512 Mbyte,最多可以连接7片外设,分别由CS0~CS6控制。同时它还支持2个外部中断信号,连接的外设可以通过中断信号向AM3354处理器发出中断请求命令[4-5]。GPMC总线结构原理如图1所示。

图1 总线结构原理图

1.3 FPGA设计

FPGA采用的是xilinx公司的V系列的virtex-6芯片,这款芯片具有成本低、功耗低、运算速度快、内部资源丰富等特点,它和前几代产品相比功耗可以降低50%,成本也降低20%。不仅如此,它还完成了新的组合优化,包括以下几个方面,灵活性、收发器以及开发工具支持等[6-8]。FPGA通过内部编程来模拟GPMC总线的读写时序,以实现AM3354与FPGA之间的通信。GPMC的驱动程序将依据寄存器配置的值产生相应的信号。FPGA根据GPMC总线的控制命令来完成相应的操作

1.4 接口连接

根据系统需求,决定将FPGA作为AM3354的外设,二者之间的通信协议决定采用NOR模式的通信方式,采用数据/地址非复用模式连接、同步通信方式。AM3354与FPGA具体连接如图2所示。

图2 AM3354与FPGA连接示意图

2 GPMC总线寄存器配置

GPMC总线驱动的开发过程中必须对GPMC总线寄存器作深入的研究。为了配置GPMC总线寄存器,必须对GPMC总线寄存器的每一个位作详细研究。GPMC总线可以被划分为7个独立的片选空间,每个片选空间都包括7个32 bit的寄存器[9]。GPMC总线的工作模式、工作时序等都是依据这些寄存器中配置的内容决定的。

为了实现系统中特定的工作模式,要对寄存器进行一一配置。在对寄存器进行配置的过程中,还需进一步了解寄存器每一个位所代表的功能。对GPMC总线寄存器的关键位功能说明如表1所示。

表1 GPMC总线寄存器功能

该设计根据具体要求决定采用同步模式,数据总线和地址总线非复用16 bit的NOR模式。GPMC工作模式确定后就可以对GPMC对应的片选寄存器进行配置。GPMC总线寄存器配置如表2所示。

表2 GPMC总线寄存器关键位配置值

3 GPMC总线驱动程序设计

3.1 Android操作系统的驱动原理

虽然Android系统使用的是Linux内核,但它与Linux又有区别,所以对驱动程序的开发也存在很大的差异。它们之间最大的差别在于Linux系统把与硬件交互的相关驱动都存放在内核当中,而Android则是分为两层:一层存放在硬件抽象层(HAL);另一层存放在Linux内核当中。所以Android驱动不仅要完成内核层的设计同时还要完成HAL层的调用。内核层和Linux系统驱动开发是相同的。HAL层的调用分为两种方法,传统的libhardware_legacy和最新的libhardware,但它们的本质是相同的,都是为上层提供.so动态链接库,而libhardware只是由Stub代理来完成[9-10]。因此GPMC总线驱动的完成,不仅需要在Linux中添加GPMC驱动模块,还必须实现HAL层的调用。

3.2 GPMC驱动程序实现流程

AM3354与FPGA之间通过AM3354本身带有的GPMC总线实现连接,为了完成Android与FPGA之间的数据交互,必须实现Android下GPMC驱动程序的添加。GPMC驱动流程图如图3所示,首先要完成GPMC总线的加载和声明,其次在Linux内核中添加GPMC总线驱动模块,最后完成Android HAL层调用。

图3 GPMC驱动流程图

图4 GPMC驱动开发流程图

4 GPMC总线驱动程序实现

4.1 Linux层 GPMC驱动程序实现

Linux系统下设备驱动主要分为:字符设备、块设备以及网络设备,字符设备是最简单的设备,在收发数据时直接操作的对象就是字符;块设备是以整个缓冲区作为操作对象进行数据的收发;网络设备是通过网络来进行数据的收发。Linux调用设备驱动时有两种方法可供选择,一是将设备驱动直接编译到Linux内核当中,这种方式使得设备驱动成为内核的一部分,在内核启动时就会自动加载;第2种是作为一个可以动态加载的模块,用户可以根据自己的需要来通过指令进行动态的加载,这种方式的优势是可以控制内核的大小[11-12]。本文中将使用字符设备,同时将驱动程序作为可加载的模块,进行动态的加载,从而增加内核的灵活性。GPMC驱动程序的开发包括向内核申请空间、对GPMC片选寄存器进行初始化、完成数据的读写、向内核注册驱动程序以及卸载内核中的相关驱动程序。具体的GPMC驱动开发流程图如图4所示。

4.1.1 GPMC申请内核空间

FPGA作为ARM的外设,通过GPMC总线与ARM实现连接,GPMC总线与外部通信的地址是0x0000 0000到0x1FFF FFFF之间的地址,一共是512 Mbit。申请内核空间需要用gpmc_cs_request函数为FPGA外设向内核申请一段物理地址,利用request mem_region函数为FPGA外设申请一段内存,request mem_region的作用只是占用了内核的内存,但并没有将物理地址映射到内核的内存空间,完成将物理地址映射到内核内存的函数是ioremap。

4.1.2 GPMC片选寄存器初始化

GPMC初始化的依据是GPMC的工作模式,在上文中已经介绍了本设计选择的通信协议是同步传输,16 bit的数据线,地址线和数据线不复用的NOR模式。确定了通信协议之后,只需对寄存器gpmc_configi_j设置相应的值即可完成GPMC片选寄存器的初始化。

4.1.3 读写功能实现

读写功能的实现主要采用的是read(ssize t(*read)(struct file*,char-user*,sizeest,loff t*)和write(ssize t(*write)(struct file*,const char-user*,sizees t,loff t*)两个函数。Read主要完成将FPGA的数据传送到ARM处理器中,而Write主要完成ARM处理器的数据传送到映射的地址内存中。

4.1.4 向内核注册

以上步骤完成之后,需要实现向内核注册,内核才能识别驱动程序的存在并对其进行调用。向内核注册需要申请一个设备号,申请设备号用到的函数是alloc_chrdev_region。至此整个Linux层的GPMC驱动设计就完成了。

图5 GPMC总线在HAL层的调用图

4.2 Android HAL层的调用

Linux内核层GPMC驱动程序设计完成之后,Android下GPMC总线驱动程序的开发,还需在HAL(硬件抽象层)添加相关代码,完成HAL的调用。HAL相当于是中介层,向下完成对Linux内核驱动程序的调用,向上为上层应用提供访问底层硬件的接口。具体实现如图5所示。在HAL层添加新的硬件支持,需要用gpmc_hardware_module_id、struct gpmc_module_t、struct gpmc_device_t分别定义模块的ID、硬件模块的结构体和硬件接口结构体。模块定义之后,还需对这些模块添加操作方法,包括设备的打开关闭、接口的访问、模块方法表等。实现上述步骤之后,即可完成GPMC在HAL层的调用,也完成了向Application Framework层提供硬件服务。但底层是C语言编写的,而Android上层应用程序是由JAVA语言编写的,此时JAVA的应用还不能访问GPMC硬件。需要编写JNI方法来调用HAL方法。完成JNI方法需定义一个JAVA访问底层硬件的服务类GPMCService,JNI方法的实现,本质是对HAL的声明、加载和完成JNI方法表,以及对JNI方法完成注册。实现JNI方法之后,只需进行最后一步,在framework层实现GPMCservice服务。首先需要定义IGPMCService.aidl接口,IGPMCService.aidl可以提供访问GPMC硬件寄存器的方法。通过对IGPMCService.aidl进行编译可以生成IGPMCService.aidl.Stub接口。接口生成之后GPMCservice通过调用JNI中init_mative、set_Reg_native、getReg_native 3个方法来提供GPMC的硬件服务。此时,应用程序就可以通过JAVA接口访问GPMC相关的硬件服务了。

5 结束语

在深入了解Linux和Android驱动原理的基础上,完成了GPMC总线在Linux内核层的驱动程序的开发,以及Android HAL层的调用,最终实现了Android系统下GPMC总线驱动的开发。该方案已经成功的应用到AM3354与FPGA之间,能够保证系统的稳定工作。该设计对Android操作系统之外其他的驱动开发具有一定的借鉴意义。

[1] 孙洁,付友善,孔繁鹏,等. Android系统下的USB设备驱动程序设计[J]. 计算机测量与控制,2013,21(5):1386-1389.

[2] 寇磊. Am335x扫描控制器设备驱动程序的开发与应用[D]. 西安:西安电子科技大学,2014.

[3] 姚博. LED打印机GPMC接口的设计与实现[D]. 西安:西安电子科技大学,2014.

[4] 赵冰洁. 基于FPGA+ARM的多源图像融合技术研究[D]. 中国科学院大学,2014.

[5] TI. AM335x ARM® CortexTM-A8 Microprocessors.www.ti.com. 2015-08-25.[EB/oL].

[6] 张淑梅. 基于ARM+FPGA的高精度数据采集系统设计[J]. 国外电子测量技术,2014,33(11):62-65.

[7] 连猛,丑修建,李庆,等. 基于FPGA和DSP的数据采集与压缩系统[J]. 电子器件2013,38(1):131-134.

[8] 张素萍,高照阳,张建芬. 基于FPGA的可配置IIC总线接口设计[J]. 电子器件,2016,39(4):866-873.

[9] 陈崇森. 基于i.MX6Q+FPGA平台Android下EIM总线接口设计[J]. 现代计算机2016,05(13):60-64.

[10] 李玉洁,朱维杰. Android 系统下CAN 总线驱动程序的设计与实现[J]. 电子科技大学学报,2013,26(2):83-86.

[11] 贾建峰,崔佩玲. 基于FPGA的ARM与CAN控制器的接口设计与实现[J]. 计算机测量与控制,2010,18(11):2652-2655.

[12] 尹剑锋. GPMC总线在DM3730与FPGA通信应用中的Linux驱动实现[J]. 江苏科技信息,2014,12(23):55-57.

ImplementationofAndroidDriverinAM3354andFPGAInterfaceApplicationBasedonGPMCBus

DIAOYanhua*,JIABaoqing,WANGXiaojun

(Information Science and Engineering,Hebei University of Science and Technology,Shijiazhuang 050018,China)

For the hardware platform of combining AM3354 processor with FPGA,a design of GPMC bus driver program in Android is proposed. The structure principle of GPMC bus and the design idea of system interface are discussed,and the development process and method of bus driver are analyzed. The design of GPMC bus driver program is completed in Android including the addition of the Linux kernel layer and the call of the Android HAL layer,and the key implement code is showed. GPMC bus driver program in Android system works well and finally achieves the intended goal.

Android;GPMC bus;driver program;Android HAL

10.3969/j.issn.1005-9490.2017.06.033

2016-09-06修改日期2016-12-26

TP3

A

1005-9490(2017)06-1502-04

刁彦华(1966-),女,黑龙江哈尔滨人,副教授,硕士生导师,硕士,主要从事卫星通信和卫星导航方向的研究;

贾宝青(1990-),男,河北张家口人,河北科技大学硕士研究生,主要从事卫星通信和卫星导航方向的研究;

王晓君(1973-),男,河北科技大学信息学院,教授,硕士生导师,博士后,目前主要研究方向为卫星应用技术。

猜你喜欢

外设驱动程序内核
强化『高新』内核 打造农业『硅谷』
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
计算机硬件设备驱动程序分析
微生物内核 生态型农资
基于MPC8280的CPU单元与内部总线驱动程序设计
Microchip推出具备双ADC外设的全新器件,扩展其低成本8位PIC®单片机产品线
外设天地行情
外设天地行情
外设天地行情