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