新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux下Qt/Embedded的應(yīng)用

嵌入式Linux下Qt/Embedded的應(yīng)用

作者: 時(shí)間:2012-04-05 來源:網(wǎng)絡(luò) 收藏

引言

嵌入式操作系統(tǒng)是目前比較流行的操作系統(tǒng),以其小巧、操作簡單、便于攜帶而深受消費(fèi)者的歡迎。在當(dāng)今流行的嵌入式操作系統(tǒng)當(dāng)中,Linux深受開發(fā)者的青睞。是Trolltech公司推出的一個(gè)多平臺(tái)的C++圖形用戶界面應(yīng)用程序框架。它給應(yīng)用程序開發(fā)者提供建立圖形用戶界面所需的所用功能。是完全面向?qū)ο蟮?,很容易擴(kuò)展,并且允許真正的組件編程。

是由Trolltech這家公司所開發(fā)的一套開源的C++圖形用戶界面庫。在XWindow上KDE桌面環(huán)境就是用這套圖形界面庫所建立。它采用 C++的語法,有各式各樣的圖形對(duì)象可供使用,采用signal/slot信號(hào)的事件信號(hào)傳遞機(jī)制。Qt/則是在嵌入式環(huán)境下所使用的 Qt。目前市面上所有上市的LinuxPDA都是采用Qt/作為圖形接口的函數(shù)庫。Qt/的特性是可以直接在 Framebuffer上顯示圖形接口,反應(yīng)的速度更快了,這對(duì)硬件與容量都有限制的嵌入式環(huán)境來說非常重要。圖1為Qt/Embedded的實(shí)現(xiàn)結(jié)構(gòu)。


圖1 Qt/Embedded的實(shí)現(xiàn)結(jié)構(gòu)

筆者參與了一個(gè)基于ARM9的下的GUI的移植及應(yīng)用程序開發(fā),所用處理器是三星公司的S3C24l0X,操作系統(tǒng)為Linux2.4.18,應(yīng)用GNUGCC交叉編譯器。

硬件平臺(tái)

S3C2410X是三星公司的基于ARM920T的S3C2410X芯片。S3C2410X集成了一個(gè)LCD控制器(支持STN和TFT帶有觸摸屏的液晶顯示屏)、SDRAM、觸摸屏、USB、SPI、SD和MMC等控制器,4個(gè)具有PWM功能的計(jì)時(shí)器和1個(gè)內(nèi)部時(shí)鐘,8通道的10位ADC,117位通用 I/O口和24位外部中斷源,8通道10位AD控制器,處理器工作頻率最高達(dá)到203MHz。

S3C2410中的LCD控制器可支持單色/彩色LCD顯示器。支持彩色TFT時(shí),可提供4/8/12/16位顏色模式,其中16位顏色模式下可以顯示 65536種顏色。配置LCD控制器重要的一步是指定顯示緩沖區(qū),顯示的內(nèi)容就是從緩沖區(qū)中讀出的,其大小由屏幕分辨率和顯示顏色數(shù)決定。文中采用的是臺(tái)灣元太V16C6448ACTFT顯示模塊,在640*480分辨率下可提供16位彩色顯示。

Qt/Embedded底層支持分析

Qt/Embedded的底層圖形引擎是基于(Frame Buffer),是出現(xiàn)在2.2.x以上內(nèi)核的版本當(dāng)中的一種驅(qū)動(dòng)程序接口。這種接口采用mmap系統(tǒng)調(diào)用,將顯示設(shè)備抽象為區(qū)。用戶可以將它看成是顯示內(nèi)存的一個(gè)映像,將其映射到進(jìn)程地址空間以后,就可以直接進(jìn)行讀寫操作了,而寫操作可以立即反映在屏幕上。幀緩沖驅(qū)動(dòng)程序是最重要的驅(qū)動(dòng)程序之一,正是這個(gè)驅(qū)動(dòng)程序才能使系統(tǒng)屏幕顯示內(nèi)容,其實(shí)現(xiàn)分為兩個(gè)方面:一是對(duì)LCD及其相關(guān)部件的初始化,包括畫面緩沖區(qū)的創(chuàng)建和對(duì)DMA通道的設(shè)置;二是對(duì)畫面緩沖區(qū)的讀寫,具體到代碼為read,write等系統(tǒng)調(diào)用接口。

幀緩沖是Linux為圖形設(shè)備提供的一個(gè)抽象接口,它允許上層應(yīng)用程序在圖形模式下直接對(duì)顯示緩沖區(qū)進(jìn)行讀寫操作。這種操作是抽象的、統(tǒng)一的。應(yīng)用程序不必關(guān)心物理顯存的位置、換頁機(jī)制等等具體細(xì)節(jié)。這些都是由幀緩沖設(shè)備驅(qū)動(dòng)來完成的。幀緩沖設(shè)備對(duì)應(yīng)的設(shè)備文件通常為/dev/fb031,Linux的幀緩沖設(shè)備的驅(qū)動(dòng)主要基于兩個(gè)文件:

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

幀緩沖設(shè)備屬于字符設(shè)備,采用“文件層-驅(qū)動(dòng)層”的接口方式。

幀緩沖設(shè)備在驅(qū)動(dòng)層所要做的工作僅僅是對(duì)Linux為幀緩沖的驅(qū)動(dòng)層接口fb-info進(jìn)行初始化,然后調(diào)用這兩個(gè)函數(shù)對(duì)其注冊(cè)或注銷。幀緩沖設(shè)備驅(qū)動(dòng)層接口直接對(duì)LCD設(shè)備硬件進(jìn)行操作,而fbmem.c可以記錄和管理多個(gè)底層設(shè)備驅(qū)動(dòng)。

文件fbmem.c中定義了幀緩沖設(shè)備的文件層接口file-operations結(jié)構(gòu)體,它對(duì)應(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)閉操作*/
};

在這個(gè)結(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ù)的支持。另一個(gè)功能函數(shù)是ioctl(),ioctl()是設(shè)備驅(qū)動(dòng)程序中對(duì)設(shè)備的I/O通道進(jìn)行管理的函數(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ù)的對(duì)應(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++教程



上一頁 1 2 下一頁

關(guān)鍵詞: 嵌入式Linux Qt Embedded 幀緩沖

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉