首页 > 范文大全 > 正文

基思卡尔imx6的VGA驱动模块开发

开篇:润墨网以专业的文秘视角,为您筛选了一篇基思卡尔imx6的VGA驱动模块开发范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:

随着智能移动终端的发展,Android和Linux操作系统越来越火爆。与此同时越来越多的半导体芯片制造厂不断的更新推出高性能的智能处理器,这就需要软件开发者不断的研究和优化每一个新的ARM处理器,提高软件的适应性使之能够完美的发挥出处理器的性能。以飞思卡尔半导体的imx6为硬件系统平台,给出了嵌入式产品中vga显示接口的实现方案,分析了Linux内核结构、驱动添加和注册流程、framebuffer的处理机制及其在驱动中的应用方法,详细讲述了在Linux2.6.28内核下,基于framebuffer开发VGA显示驱动的方法及步骤。

关键词: Linux 设备驱动;VGA;framebuffer;IMX6

中图分类号:TB

文献标识码:A

doi:10.19311/ki.16723198.2016.12.087

1引言

1.1目的

编写基于imx6开发的移动终端上VGA的功能添加和优化的详细说明书是为了方便更多的人了解飞思卡尔imx6这个ARM CortexTM-A9架构处理器性能和架构,同时能够深入了解VGA的具体工作流程和结构,在了解VGA在内核如何工作的过程当中也会跟大家讲解一下Linux内核的基本属性和结构以及内部驱动管理和调用。

1.2项目背景

i.MX6是基于ARM CortexTM-A9架构的高扩展性多核系列嵌入式多媒体应用处理器,普遍使用于工业控制、车载电脑控制、智能移动终端、监控设备、机顶盒、KTV点歌设备等方面。它的强力的3D图像处理引擎、支持多种格式的视频压缩解压功能和内部集成的电源管理等优点使得它成为优秀的智能设备开发平台,同时由于他支持高规格的LCD显示2×4XGA(2048×1536)或2×[1080p+WXGA(1280×720)],因此以前的一些能适用于Linux内核的VGA驱动需要我们嵌入式软件开发人员进行调整。

VGA也就是Video Graphic Array,即显示绘图阵列。它的接口是一个模拟信号接口,在显示领域成为了一种成熟通用的显示器标准接口,由于它的通用性和高性能适应性被各种规格的显示器在硬件上使用和支持。在当今PC机以及各种显示和控制设备中VGA得到大众的欢迎,因此在进行嵌入式软件开发中VGA驱动成为我们调试和开发的重中之重。本文以Linux2.6内核和飞思卡尔IMX6处理器为系统的软、硬件平台,详细论述了基于framebuffer技术开发VGA显示驱动程序的方法。

2总体设计

2.1软件描述

VGA驱动模块结构包含:平台驱动、LCD控制器驱动、外设驱动。进行VGA的嵌入式开发主要是为Android系统嵌入VGA功能模块让我们的移动终端可以通过VGA接口外接显示器满足客户的要求,同时对VGA驱动进行的优化能让我们的系统可以充分发挥出飞思卡尔imx6处理器强劲的图像处理和显示功能提高用户体验。

2.2设计方法

在实现一个功能或者解决某一个问题的时候,我们要经过理论分析,推导,简化,逐步达到目的,因此我们首先应该分析VGA驱动结构和工作流程,抓住关键点预计如何优化显示效果,其次分析如何添加驱动到Linux内核使LCD能够正常显示智能移动终端通过VGA传输的信号,最后结合VGA驱动和LCD优化显示画面,让imx6处理器的优秀性能能够发挥出来。

2.3软件结构

3模块设计说明

3.1平台驱动模块

3.1.1设备定义功能模块

(1)设备定义模块描述。

通过设置 platform_device结构变量mxc_fb_device定义设备。

(2)输入、输出。

3.1.2设备注册功能模块

(1)模块描述。

向系统注册已经被定义的设备,注册状态可被其他模块检测。

(2)模块接口关系。

注册:注册平台设备。

查询调用:被相关函数查询设备注册状态,并自动调用probe函数。

(3)输入输出。无。

(4)函数。

3.2LCD控制器模块

3.2.1定义、注册平台设备驱动模块

(1)模块描述。

注册和定义LCD控制器的设备驱动。

(2)模块接口关系。

已经被定义和注册的设备驱动可以被调用。

(3)函数。

4部分模块功能详细设计

4.1framebuffer数据结构

Framebuffer程序是Linux2.6.x内核中出现的一种驱动程序接口。它把一些显示设备抽象描述成一个缓冲区域,由于Linux不像Windows那样能够直接调用显卡驱动因此framebuffer就提供了一个沟通内存和显卡的桥梁。用户直接通过定义好的接口直接访问显卡,这样就不需要知道底层的操作和调用。

Framebuffer在Linux内核中一把包含于两个文件fb.h和fbmen.c。其中fbmen.c主要提供LCD驱动的通用文件操作接口,而fb.h中包含有很多重要的宏定义和结构体。在结构体中有些是我们需要注意和优化的如:

(1) struct fb_fix_screeninfo,这个结构体主要用来描述显卡自身的属性,包含标识符、显示数据缓存地址、显示数据类型等,在显卡被设定模式后创建,一旦系统开始运行之后,该结构体的值就不能被我们改动。

(2) struct fb_var_screeninfo,此结构主要用来描述显卡的一般特性,比如虚实分辨率,以及两者之间的offset等,也就是说,这个结构体可以决定我们所能驱动的外接显示屏的尺寸。

(3) struct fb_cmap,主要用来描述设备无关的颜色映射信息。可以通过FBIOGETCMAP和FBIOPUTCMAP对应的ioctl操作设定或获取颜色映射信息。

4.2驱动的注册于注销

从Linux2.6.x内核提供的平台驱动机制为了方便内核管理把设备和驱动用platform_device和platform_driver来表示,其中platform_device表示设备而platform_driver用来注册驱动。设备驱动是给用户的程序提供系统调用的接口,让用户能够直接通过接口来驱动硬件设备而不用深入的了解硬件底层代码。内核驱动管理机制提供了两个函数给我们进行注册或者注销我们特定平台的LCD驱动程序。int register_framebuffer(struct fb_info *fb_info)用于注册该驱动;int unregister_framebuffer(struct fb_info *fb_info)则用于注销该驱动。几乎所有的底层设备驱动所要做的事情就是填充fb_inf o结构然后利用上述的两个函数向系统注册或注销它。

5总结

经测试,我的VGA驱动程序在IMX6平台上能够成功添加和实现。文中给出了VGA驱动的整体架构并对一些主要的工作模块和机制进行了详细的讲解,同时对主要模块的设计思想和实现方法进行了详细的分析讨论。我在实现VGA模块的开发和移植过程中通过阅读大量的相关资料,听取指导老师的一些建议,对Linux下ARM嵌入式开发积累了大量的经验,大大的提高了我的解决调通驱动的能力,加深了对Android的整体架构的理解,知识面的不足也充分暴露出来亟待改正。

参考文献

[1]王振丽.Android底层开发技术实战详解――内核、移植和驱动[M].北京:电子工业出版社,2012,(8).

[2] 陈强.Android底层接口与驱动开发技术详解[M].北京:中国铁道出版社,2012 ,(8).

[3]郭小梅.基于mx51的VGA驱动开发[J].电脑编程技巧与维护,2011,(08).

[4](美国)ChristopherHallinan.嵌入式Linux开发[M].北京:人民邮电出版社,2008.

[5]Robert Love,陈莉君,康华.Linux内核设计与实现[M].北京:机械工业出版社,2011.