<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux系統(tǒng)圖形及圖形用戶界面

          嵌入式Linux系統(tǒng)圖形及圖形用戶界面

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

          本文首先概述了Linux圖形領(lǐng)域的基本設(shè)施,然后描述了一些可供使用的高級(jí)圖形庫以及支持系統(tǒng)。希望對(duì)的開發(fā)有所幫助。

          1Linux圖形領(lǐng)域的基礎(chǔ)設(shè)施

          本小節(jié)首先向讀者描述Linux圖形領(lǐng)域中常見的基礎(chǔ)設(shè)施。之所以稱為基礎(chǔ)設(shè)施,是因?yàn)檫@些系統(tǒng)(或者函數(shù)庫),一般作為其他高級(jí)圖形或者圖形應(yīng)用程序的基本函數(shù)庫。這些系統(tǒng)(或者函數(shù)庫)包括:XWindow、SVGALib、FrameBuffer等等。

          1.1XWindow

          提起Linux上的圖形,許多人首先想到的是XWindow。這一系統(tǒng)是目前類UNIX系統(tǒng)中處于控制地位的桌面圖形系統(tǒng)。無疑,XWindow作為一個(gè)圖形環(huán)境是成功的,它上面運(yùn)行著包括CAD建模工具和辦公套件在內(nèi)的大量應(yīng)用程序。但必須看到的是,由于XWindow在體系接口上的原因,限制了其對(duì)游戲、多媒體的支持能力。用戶在XWindow上運(yùn)行VCD播放器,或者運(yùn)行一些大型的三維游戲時(shí),經(jīng)常會(huì)發(fā)現(xiàn)同樣的硬件配置,卻不能獲得和Windows操作系統(tǒng)一樣的圖形效果――即使使用了加速的XServer,其效果也不能令人滿意。另外,大型的應(yīng)用程序(比如Mozilla瀏覽器)在XWindow上運(yùn)行時(shí)的響應(yīng)能力,也相當(dāng)不能令人滿意。當(dāng)然,這里有Linux內(nèi)核在進(jìn)程調(diào)度上的問題,也有XWindow的原因。

          XWindow為了滿足對(duì)游戲、多媒體等應(yīng)用對(duì)圖形加速能力的要求,提供了DGA(直接圖形訪問)擴(kuò)展,通過該擴(kuò)展,應(yīng)用程序可以在全屏模式下直接訪問顯示卡的幀緩沖區(qū),并能夠提供對(duì)某些加速功能的支持。

          1.2SVGALib

          SVGALib是中最早出現(xiàn)的非X圖形支持庫。這個(gè)庫從最初對(duì)標(biāo)準(zhǔn)VGA兼容芯片的支持開始,一直發(fā)展到對(duì)老式SVGA芯片的支持以及對(duì)現(xiàn)今流行的高級(jí)視頻芯片的支持。它為用戶提供了在控制臺(tái)上進(jìn)行圖形編程的接口,使用戶可以在PC兼容系統(tǒng)上方便地獲得圖形支持。但該系統(tǒng)有如下不足:

          1)接口雜亂。SVGALib從最初的vgalib發(fā)展而來,保留了老系統(tǒng)的許多接口,而這些接口卻不能良好地迎合新顯示芯片的圖形能力。

          2)未能較好地隱藏硬件細(xì)節(jié)。許多操作,不能自動(dòng)使用顯示芯片的加速能力支持。

          3)可移植性差。SVGALib目前只能運(yùn)行在x86平臺(tái)上,對(duì)其他平臺(tái)的支持能力較差(Alpha平臺(tái)除外)。

          4)發(fā)展緩慢,有被其他圖形庫取代的可能。SVGALib作為一個(gè)老的圖形支持庫,目前的應(yīng)用范圍越來越小,尤其在Linux內(nèi)核增加了FrameBuffer驅(qū)動(dòng)支持之后,有逐漸被其他圖形庫替代的跡象。

          5)對(duì)應(yīng)用的支持能力較差。SVAGLib作為一個(gè)圖形庫,對(duì)高級(jí)圖形功能的支持,比如直線和曲線等等,卻不能令人滿意。盡管SVGALib有許多缺點(diǎn),但SVGALib經(jīng)常被其他圖形庫用來初始化特定芯片的顯示模式,并獲得映射到進(jìn)程地址空間的線性顯示內(nèi)存首地址(即幀緩沖區(qū)),而其他的接口卻很少用到。另外,SVGALib中所包含的諸如鍵盤、鼠標(biāo)和游戲桿的接口,也很少被其他應(yīng)用程序所使用。

          因此,SVGALib的使用越來越少,筆者也不建議用戶使用這個(gè)圖形庫。當(dāng)然,如果用戶的顯示卡只支持標(biāo)準(zhǔn)VGA模式,則SVGALib還是比較好的選擇。

          1.3 FrameBuffer

          FrameBuffer 是出現(xiàn)在 2.2.xx 內(nèi)核當(dāng)中的一種驅(qū)動(dòng)程序接口。這種接口將顯示設(shè)備抽象為幀緩沖區(qū)。用戶可以將它看成是顯示內(nèi)存的一個(gè)映像,將其映射到進(jìn)程地址空間之后,就可以直接進(jìn)行讀寫操作,而寫操作可以立即反應(yīng)在屏幕上。該驅(qū)動(dòng)程序的設(shè)備文件一般是 /dev/fb0、/dev/fb1 等等。比如,假設(shè)現(xiàn)在的顯示模式是 1024x768-8 位色,則可以通過如下的命令清空屏幕:

          $ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768

          在應(yīng)用程序中,一般通過將 FrameBuffer 設(shè)備映射到進(jìn)程地址空間的方式使用,比如下面的程序就打開 /dev/fb0 設(shè)備,并通過 mmap 系統(tǒng)調(diào)用進(jìn)行地址映射,隨后用 memset 將屏幕清空(這里假設(shè)顯示模式是 1024x768-8 位色模式,線性內(nèi)存模式):

          int fb; unsigned char* fb_mem; fb = open (“/dev/fb0”, O_RDWR); fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0); memset (fb_mem, 0, 1024*768);

          FrameBuffer 設(shè)備還提供了若干 ioctl 命令,通過這些命令,可以獲得顯示設(shè)備的一些固定信息(比如顯示內(nèi)存大?。?、與顯示模式相關(guān)的可變信息(比如分辨率、象素結(jié)構(gòu)、每掃描線的字節(jié)寬度),以及偽彩色模式下的調(diào)色板信息等等。

          通過 FrameBuffer 設(shè)備,還可以獲得當(dāng)前內(nèi)核所支持的加速顯示卡的類型(通過固定信息得到),這種類型通常是和特定顯示芯片相關(guān)的。比如目前最新的內(nèi)核(2.4.9)中,就包含有對(duì) S3、Matrox、nVidia、3Dfx 等等流行顯示芯片的加速支持。在獲得了加速芯片類型之后,應(yīng)用程序就可以將 PCI 設(shè)備的內(nèi)存I/O(memio)映射到進(jìn)程的地址空間。這些 memio 一般是用來控制顯示卡的寄存器,通過對(duì)這些寄存器的操作,應(yīng)用程序就可以控制特定顯卡的加速功能。

          PCI 設(shè)備可以將自己的控制寄存器映射到物理內(nèi)存空間,而后,對(duì)這些控制寄存器的訪問,給變成了對(duì)物理內(nèi)存的訪問。因此,這些寄存器又被稱為“memio”。一旦被映射到物理內(nèi)存,Linux 的普通進(jìn)程就可以通過 mmap 將這些內(nèi)存 I/O 映射到進(jìn)程地址空間,這樣就可以直接訪問這些寄存器了。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          linux相關(guān)文章:linux教程



          上一頁 1 2 3 下一頁

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();