×
嵌入式开发 > 详情

嵌入式Linux下Qt/Embedded的应用

发布时间:2020-07-09 发布时间:
|

引言

嵌入式操作系统是目前比较流行的操作系统,以其小巧、操作简单、便于携带而深受消费者的欢迎。在当今流行的嵌入式操作系统当中,Linux深受开发者的青睐。Qt是Trolltech公司推出的一个多平台的C++图形用户界面应用程序框架。它给应用程序开发者提供建立图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正的组件编程。

Qt是由Trolltech这家公司所开发的一套开源的C++图形用户界面库。在XWindow上KDE桌面环境就是用这套图形界面库所建立。它采用 C++的语法,有各式各样的图形对象可供使用,采用signal/slot信号的事件信号传递机制。Qt/Embedded则是在嵌入式环境下所使用的 Qt。目前市面上所有上市的LinuxPDA都是采用Qt/Embedded作为图形接口的函数库。Qt/Embedded的特性是可以直接在 Framebuffer上显示图形接口,反应的速度更快了,这对硬件与容量都有限制的嵌入式环境来说非常重要。图1为Qt/Embedded的实现结构。


图1Qt/Embedded的实现结构

笔者参与了一个基于ARM9的嵌入式Linux下的GUI的移植及应用程序开发,所用处理器是三星公司的S3C24l0X,操作系统为Linux2.4.18,应用GNUGCC交叉编译器。

硬件平台

S3C2410X是三星公司的基于ARM920T的S3C2410X芯片。S3C2410X集成了一个LCD控制器(支持STN和TFT带有触摸屏的液晶显示屏)、SDRAM、触摸屏、USB、SPI、SD和MMC等控制器,4个具有PWM功能的计时器和1个内部时钟,8通道的10位ADC,117位通用 I/O口和24位外部中断源,8通道10位AD控制器,处理器工作频率最高达到203MHz。

S3C2410中的LCD控制器可支持单色/彩色LCD显示器。支持彩色TFT时,可提供4/8/12/16位颜色模式,其中16位颜色模式下可以显示 65536种颜色。配置LCD控制器重要的一步是指定显示缓冲区,显示的内容就是从缓冲区中读出的,其大小由屏幕分辨率和显示颜色数决定。文中采用的是台湾元太V16C6448ACTFT显示模块,在640*480分辨率下可提供16位彩色显示。

Qt/Embedded底层支持分析

Qt/Embedded的底层图形引擎是基于帧缓冲(Frame Buffer),帧缓冲是出现在2.2.x以上内核的版本当中的一种驱动程序接口。这种接口采用mmap系统调用,将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间以后,就可以直接进行读写操作了,而写操作可以立即反映在屏幕上。帧缓冲驱动程序是最重要的驱动程序之一,正是这个驱动程序才能使系统屏幕显示内容,其实现分为两个方面:一是对LCD及其相关部件的初始化,包括画面缓冲区的创建和对DMA通道的设置;二是对画面缓冲区的读写,具体到代码为read,write等系统调用接口。

帧缓冲是Linux为图形设备提供的一个抽象接口,它允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的、统一的。应用程序不必关心物理显存的位置、换页机制等等具体细节。这些都是由帧缓冲设备驱动来完成的。帧缓冲设备对应的设备文件通常为/dev/fb031,Linux的帧缓冲设备的驱动主要基于两个文件:

1)linux/include/linux/fb.h;
2)linux/drivers/video/fbmem.c。

帧缓冲设备属于字符设备,采用“文件层-驱动层”的接口方式。

帧缓冲设备在驱动层所要做的工作仅仅是对Linux为帧缓冲的驱动层接口fb-info进行初始化,然后调用这两个函数对其注册或注销。帧缓冲设备驱动层接口直接对LCD设备硬件进行操作,而fbmem.c可以记录和管理多个底层设备驱动。

文件fbmem.c中定义了帧缓冲设备的文件层接口file-operations结构体,它对应用程序可见,该结构体的定义如下:

staticstructfile-operationsfb-fops=
{
owner:THIS-MODULE,
read:fb-read,/*读操作*/
write:fb-write,/*写操作*/
ioctl:fb-ioctl,/*控制操作*/
mmap:fb-mmap,/*映射操作*/
open:fb-open,/*打开操作*/
release:fb-release,/*关闭操作*/
};

在这个结构体中功能函数open()和release()不需要底层的支持,而read(),write(),mmap()则需要调用fb-get- fix(),fb-get-var(),fb-set-var()(这些函数位于结构体fb-info中指针fbops指向的结构体变量中)等与底层 LCD硬件相关的函数的支持。另一个功能函数是ioctl(),ioctl()是设备驱动程序中对设备的I/O通道进行管理的函数,应用程序应用 ioctl()系统调用来调用fb-get-fix(),fb-get-var(),fb-set-var()等方法来获得和设置结构体fb-info中 var,fix和cmap等变量的信息。在fbmem.c中给出了ioctl()命令和fb-info中结构体fb-ops的成员函数的对应关系如下:

FBIOGET-VSCREENINFOfb-get-var
FBIOPUT-VSCREENINFOfb-set-var
FBIOGET-FSCREENINFOfb-get-fix
FBIOPUTCMAPfb-set-cmap
FBIOGETCMAPfb-get-cmap
FBIOPAN-DISPLAYfb-pan–display




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
一只老鸟的嵌入式ARM学习心得