APP下载

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

2016-03-13

现代商贸工业 2016年12期
关键词:内核定义驱动

况 昊

(西华大学,四川 成都610039)

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 软件结构

图1 总体结构

3 模块设计说明

3.1 平台驱动模块

3.1.1 设备定义功能模块

(1)设备定义模块描述。通过设置platform_device结构变量mxc_fb_device定义设备。

(2)输入、输出。

表1 平台驱动模块输入、输出

(3)模块接口关系。定义相关平台设备。

(4)函数。

表2 平台驱动模块函数

3.1.2 设备注册功能模块

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

(2)模块接口关系。注册:注册平台设备。查询调用:被相关函数查询设备注册状态,并自动调用probe函数。

(3)输入输出。无。

(4)函数。

表3 平台驱动模块函数

3.2 LCD控制器模块

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

(1)模块描述。注册和定义LCD控制器的设备驱动。

(2)模块接口关系。已经被定义和注册的设备驱动可以被调用。

(3)函数。

表4 LCD控制器模块函数

3.2.2 设置framebuffer缓冲区模块

(1)模块描述。设置framebuffer缓冲区所需的空间和定义相关底层函数。

(2)输入、输出。

表5 LCD控制器模块输入、输出

(3)模块接口关系。缓冲区:预写入显示帧数据,然后流向显示器。

(4)函数。

表6 LCD控制器模块函数

3.2.3 调控显示信息和外接设备信息模块

(1)模块描述。初始化fb-info的固定、可变的参数,检查、调控显示控制器以及显示输出设备信息。

(2)输入、输出。

表7 调控显示信息和外接设备信息模块输入、输出

(3)模块接口关系。检查调整显示控制器参数var。

(4)函数。

表8 调控显示信息和外接设备信息模块函数

3.2.4 注册framebuffer驱动模块

(1)模块描述。注册一个framebuffer驱动。

(2)模块接口关系。注册:注册LCD控制器的framebuffer驱动。

(3)函数。

表9 注册framebuffer驱动模块函数

3.3 外接设备模块

3.3.1 外接设备驱动定义、注册模块

(1)模块描述。一个I2C设备驱动需用两个结构struct i2c_driver和struct i2c_client来描述。其中i2c_driver表示一个I2C设备驱动,i2c_client用于描述一个I2C设备。

(2)模块接口关系。定义:定义设备和设备驱动。注册:注册外设驱动。

(3)函数。

表10 外接设备模块函数

3.3.2 初始化寄存器模块

(1)模块描述。初始化并设置各种格式功能的寄存器。

(2)输入、输出。

表11 初始化寄存器模块输入、输出

(3)模块接口关系。初始化寄存器:初始化并设置芯片上的寄存器。

(4)函数。

表12 初始化寄存器模块函数

3.3.3 设置显示输出状态信息模块

(1)模块描述。设置有关显示输出状态的信息,如屏幕的显示分辨率、画面位置等。

(2)输入、输出。

表13 设置显示输出状态信息模块输入、输出

(3)模块接口关系。显示设置:根据用户输入信息调整输出状态。

(4)函数。

表14 设置显示输出状态信息模块函数

4 部分模块功能详细设计

4.1 framebuffer数据结构

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结构然后利用上述的两个函数向系统注册或注销它。

4.3 部分屏幕信息显示相关代码

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](美国)Christopher Hallinan.嵌入式Linux开发[M].北京:人民邮电出版社,2008.

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

猜你喜欢

内核定义驱动
基于模糊PI控制的驱动防滑仿真系统分析
强化『高新』内核 打造农业『硅谷』
屈宏斌:未来五年,双轮驱动,砥砺前行
轨旁ATC系统门控柜接收/驱动板改造
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
基于S3C6410的Wi-Fi驱动移植实现
修辞学的重大定义
山的定义
教你正确用(十七)