嵌入式Linux下Qt/Embedded的應(yīng)用
引言
嵌入式操作系統(tǒng)是目前比較流行的操作系統(tǒng),以其小巧、操作簡單、便于攜帶而深受消費者的歡迎。在當(dāng)今流行的嵌入式操作系統(tǒng)當(dāng)中,Linux深受開發(fā)者的青睞。Qt是Trolltech公司推出的一個多平臺的C++圖形用戶界面應(yīng)用程序框架。它給應(yīng)用程序開發(fā)者提供建立圖形用戶界面所需的所用功能。Qt是完全面向?qū)ο蟮模苋菀讛U展,并且允許真正的組件編程。
Qt是由Trolltech這家公司所開發(fā)的一套開源的C++圖形用戶界面庫。在XWindow上KDE桌面環(huán)境就是用這套圖形界面庫所建立。它采用 C++的語法,有各式各樣的圖形對象可供使用,采用signal/slot信號的事件信號傳遞機制。Qt/Embedded則是在嵌入式環(huán)境下所使用的 Qt。目前市面上所有上市的LinuxPDA都是采用Qt/Embedded作為圖形接口的函數(shù)庫。Qt/Embedded的特性是可以直接在 Framebuffer上顯示圖形接口,反應(yīng)的速度更快了,這對硬件與容量都有限制的嵌入式環(huán)境來說非常重要。圖1為Qt/Embedded的實現(xiàn)結(jié)構(gòu)。
圖1 Qt/Embedded的實現(xiàn)結(jié)構(gòu)
筆者參與了一個基于ARM9的嵌入式Linux下的GUI的移植及應(yīng)用程序開發(fā),所用處理器是三星公司的S3C24l0X,操作系統(tǒng)為Linux2.4.18,應(yīng)用GNUGCC交叉編譯器。
硬件平臺
S3C2410X是三星公司的基于ARM920T的S3C2410X芯片。S3C2410X集成了一個LCD控制器(支持STN和TFT帶有觸摸屏的液晶顯示屏)、SDRAM、觸摸屏、USB、SPI、SD和MMC等控制器,4個具有PWM功能的計時器和1個內(nèi)部時鐘,8通道的10位ADC,117位通用 I/O口和24位外部中斷源,8通道10位AD控制器,處理器工作頻率最高達到203MHz。
S3C2410中的LCD控制器可支持單色/彩色LCD顯示器。支持彩色TFT時,可提供4/8/12/16位顏色模式,其中16位顏色模式下可以顯示 65536種顏色。配置LCD控制器重要的一步是指定顯示緩沖區(qū),顯示的內(nèi)容就是從緩沖區(qū)中讀出的,其大小由屏幕分辨率和顯示顏色數(shù)決定。文中采用的是臺灣元太V16C6448ACTFT顯示模塊,在640*480分辨率下可提供16位彩色顯示。
Qt/Embedded底層支持分析
Qt/Embedded的底層圖形引擎是基于幀緩沖(Frame Buffer),幀緩沖是出現(xiàn)在2.2.x以上內(nèi)核的版本當(dāng)中的一種驅(qū)動程序接口。這種接口采用mmap系統(tǒng)調(diào)用,將顯示設(shè)備抽象為幀緩沖區(qū)。用戶可以將它看成是顯示內(nèi)存的一個映像,將其映射到進程地址空間以后,就可以直接進行讀寫操作了,而寫操作可以立即反映在屏幕上。幀緩沖驅(qū)動程序是最重要的驅(qū)動程序之一,正是這個驅(qū)動程序才能使系統(tǒng)屏幕顯示內(nèi)容,其實現(xiàn)分為兩個方面:一是對LCD及其相關(guān)部件的初始化,包括畫面緩沖區(qū)的創(chuàng)建和對DMA通道的設(shè)置;二是對畫面緩沖區(qū)的讀寫,具體到代碼為read,write等系統(tǒng)調(diào)用接口。
幀緩沖是Linux為圖形設(shè)備提供的一個抽象接口,它允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進行讀寫操作。這種操作是抽象的、統(tǒng)一的。應(yīng)用程序不必關(guān)心物理顯存的位置、換頁機制等等具體細節(jié)。這些都是由幀緩沖設(shè)備驅(qū)動來完成的。幀緩沖設(shè)備對應(yīng)的設(shè)備文件通常為/dev/fb031,Linux的幀緩沖設(shè)備的驅(qū)動主要基于兩個文件:
1)linux/include/linux/fb.h;
2)linux/drivers/video/fbmem.c。
幀緩沖設(shè)備屬于字符設(shè)備,采用“文件層-驅(qū)動層”的接口方式。
幀緩沖設(shè)備在驅(qū)動層所要做的工作僅僅是對Linux為幀緩沖的驅(qū)動層接口fb-info進行初始化,然后調(diào)用這兩個函數(shù)對其注冊或注銷。幀緩沖設(shè)備驅(qū)動層接口直接對LCD設(shè)備硬件進行操作,而fbmem.c可以記錄和管理多個底層設(shè)備驅(qū)動。
文件fbmem.c中定義了幀緩沖設(shè)備的文件層接口file-operations結(jié)構(gòu)體,它對應(yīng)用程序可見,該結(jié)構(gòu)體的定義如下:
staticstructfile-operationsfb-fops=
{
owner:THIS-MODULE,
read:fb-read,/*讀操作*/
write:fb-write,/*寫操作*/
ioctl:fb-ioctl,/*控制操作*/
mmap:fb-mmap,/*映射操作*/
open:fb-open,/*打開操作*/
release:fb-release,/*關(guān)閉操作*/
};
在這個結(jié)構(gòu)體中功能函數(shù)open()和release()不需要底層的支持,而read(),write(),mmap()則需要調(diào)用fb-get- fix(),fb-get-var(),fb-set-var()(這些函數(shù)位于結(jié)構(gòu)體fb-info中指針fbops指向的結(jié)構(gòu)體變量中)等與底層 LCD硬件相關(guān)的函數(shù)的支持。另一個功能函數(shù)是ioctl(),ioctl()是設(shè)備驅(qū)動程序中對設(shè)備的I/O通道進行管理的函數(shù),應(yīng)用程序應(yīng)用 ioctl()系統(tǒng)調(diào)用來調(diào)用fb-get-fix(),fb-get-var(),fb-set-var()等方法來獲得和設(shè)置結(jié)構(gòu)體fb-info中 var,fix和cmap等變量的信息。在fbmem.c中給出了ioctl()命令和fb-info中結(jié)構(gòu)體fb-ops的成員函數(shù)的對應(yīng)關(guān)系如下:
FBIOGET-VSCREENINFOfb-get-var
FBIOPUT-VSCREENINFOfb-set-var
FBIOGET-FSCREENINFOfb-get-fix
FBIOPUTCMAPfb-set-cmap
FBIOGETCMAPfb-get-cmap
FBIOPAN-DISPLAYfb-pan–display
linux相關(guān)文章:linux教程
c++相關(guān)文章:c++教程
評論