• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于FrameBuffer的嵌入式系統(tǒng)LCD圖像顯示的實(shí)現(xiàn)

      2017-05-08 13:52:21孫靜

      孫靜

      摘要:本文以O(shè)MAP3530為處理器,S3C2410 LCD控制器為基礎(chǔ),基于嵌入式Linux 2.6內(nèi)核,研究了FrameBuffer機(jī)制下的LCD驅(qū)動(dòng)程序,介紹了相關(guān)的數(shù)據(jù)結(jié)構(gòu),F(xiàn)rameBuffer的加載和卸載的完整過(guò)程。實(shí)現(xiàn)了在LCD上顯示字符、圖形、圖像的應(yīng)用。

      關(guān)鍵詞: 幀緩沖; LCD; 圖像顯示

      中圖分類號(hào): TP311

      文獻(xiàn)標(biāo)志碼: A

      文章編號(hào): 2095-2163(2016)06-0127-03

      0引言

      隨著嵌入式技術(shù)的發(fā)展,顯示模塊在嵌入式產(chǎn)品中得到了日趨廣泛的設(shè)計(jì)應(yīng)用。LCD可顯示字符、漢字和圖形,具有低功耗、體積小、綠色環(huán)保等特點(diǎn),因而在嵌入式產(chǎn)品的顯示系統(tǒng)上已然成為重點(diǎn)優(yōu)先研究首選。LCD的驅(qū)動(dòng)程序針對(duì)不同的處理器通用性較差,本文為此研討提出了一種移植性較好的LCD驅(qū)動(dòng)程序,即基于Linux的FrameBuffer機(jī)制,同時(shí)采用S3C2410 LCD控制器,進(jìn)而開(kāi)發(fā)生成了嵌入式LCD的字符、圖形、圖像顯示方法。

      [BT4]1基于FrameBuffer的驅(qū)動(dòng)設(shè)計(jì)

      [BT5]1.1FrameBuffer機(jī)制

      FrameBuffer是Linux操作系統(tǒng)為顯示設(shè)備提供的一種驅(qū)動(dòng)程序接口,可將顯示緩沖區(qū)實(shí)現(xiàn)抽象處理,屏蔽圖像硬件的底層,上層應(yīng)用程序在圖形模式下直接對(duì)顯示緩沖區(qū)進(jìn)行讀寫(xiě)操作。用戶不必關(guān)心顯示緩沖區(qū)的具體物理位置、存放方式。FrameBuffer的顯示緩沖區(qū)位于Linux核心態(tài)地址空間,每個(gè)應(yīng)用程序均有自己的虛擬地址空間。用戶通過(guò)調(diào)用mmap函數(shù),可將文件的內(nèi)容映射到應(yīng)用空間。對(duì)于FrameBuffer設(shè)備而言,通過(guò)映射操作,可將屏幕緩沖區(qū)的物理地址應(yīng)用到程序空間的一段虛擬地址中,然后通過(guò)讀寫(xiě)對(duì)應(yīng)段虛擬地址而訪問(wèn)屏幕緩沖區(qū),從而在屏幕上繪制各種圖形、圖像、文字等。FrameBuffer的優(yōu)點(diǎn)是可高度靈活地支持不同的硬件,減少了新處理器的開(kāi)發(fā)工作。

      [BT5]1.2基于FrameBuffer的驅(qū)動(dòng)設(shè)計(jì)

      FrameBuffer幀緩沖設(shè)備給用戶設(shè)計(jì)指定的讀寫(xiě)接口file_operations實(shí)際由fbmem.c文件里的特定file_operatins結(jié)構(gòu)對(duì)象來(lái)展現(xiàn)提供,而特定幀緩沖設(shè)備fb_info結(jié)構(gòu)體的注冊(cè)、注銷(xiāo)及其中成員的維護(hù),尤其是fb_ops中的成員函數(shù)的實(shí)現(xiàn)則由對(duì)應(yīng)的xxxfb.c文件來(lái)構(gòu)造調(diào)取顯示,fb_ops中的成員函數(shù)最終會(huì)操作LCD控制器的寄存器。圖1即給出了幀緩沖設(shè)備驅(qū)動(dòng)的程序結(jié)構(gòu)。

      1.2.1FrameBuffer相關(guān)的數(shù)據(jù)結(jié)構(gòu)

      本節(jié),將研究給出與幀緩沖相關(guān)的數(shù)據(jù)結(jié)構(gòu)的功能設(shè)計(jì)概述如下:

      1)fb_info。記錄了FrameBuffer的全部信息,包括設(shè)備的定制參數(shù)、狀態(tài)以及操作函數(shù)指針。每一個(gè)幀緩沖設(shè)備必須對(duì)應(yīng)唯一fb_info。

      2)fb_ops。fb_info的成員變量fb_ops即為指向底層操作的函數(shù)的指針,這些函數(shù)是需要驅(qū)動(dòng)程序開(kāi)發(fā)人員來(lái)制定編寫(xiě)的。包括打開(kāi)、釋放函數(shù),用于檢查可以修改的屏幕參數(shù)并調(diào)整到適當(dāng)值,同時(shí)設(shè)置color寄存器,使用戶設(shè)置的屏幕參數(shù)在硬件上能夠呈現(xiàn)事實(shí)有效等具體功能的分配操作。

      3)fb_var_screeninfo和fb_fix_screeninfo。這2個(gè)結(jié)構(gòu)體也是fb_info的成員。其中,fb_var_screeninfo記錄用戶可修改的顯示控制器參數(shù),包括屏幕分辨率和每個(gè)像素點(diǎn)的比特?cái)?shù)。fb_fix_screeninfo記錄用戶不能修改的顯示控制器的參數(shù),如屏幕緩沖區(qū)的物理地址、長(zhǎng)度。當(dāng)對(duì)幀緩沖設(shè)備展開(kāi)執(zhí)行映射操作的時(shí)候,就是從fb_fix_screeninfo中取得緩沖區(qū)物理地址的。

      4)fb_bitfield。描述每一像素顯示緩沖區(qū)的組織方式,包括位域偏移、位域長(zhǎng)度和MSB指示。

      5)fb_cmap。記錄設(shè)備無(wú)關(guān)的顏色表信息。

      1.2.2FrameBuffer設(shè)備驅(qū)動(dòng)的模塊加載和卸載

      FrameBuffer設(shè)備驅(qū)動(dòng)的模塊加載,可解析描述為如下4個(gè)步驟:

      1)申請(qǐng)fb_info結(jié)構(gòu)體的內(nèi)存空間,初始化fb_info結(jié)構(gòu)體中固定和可變的屏幕參數(shù),即填充fb_info的fb_var_screeninfo var和fb_fix_screeninfo fix成員。

      2)根據(jù)LCD屏幕的特點(diǎn),執(zhí)行LCD控制器硬件的初始化。

      3)申請(qǐng)F(tuán)rameBuffer設(shè)備的顯示緩沖區(qū)空間。

      4)注冊(cè)FrameBuffer設(shè)備。

      FrameBuffer設(shè)備驅(qū)動(dòng)的模塊卸載,則需依次釋放fb_info結(jié)構(gòu)體內(nèi)存、關(guān)閉LCD、釋放顯示緩沖區(qū)以及注銷(xiāo)FrameBuffer設(shè)備的流程也將移交到平臺(tái)驅(qū)動(dòng)的移除函數(shù)中順序操控完成。

      [BT4]2基于FrameBuffer的LCD圖像顯示的實(shí)現(xiàn)

      在LCD上顯示圖像的主流程如圖2所示。首先調(diào)用open函數(shù)打開(kāi)設(shè)備,然后調(diào)用ioctl獲取設(shè)備相關(guān)信息,接下來(lái)就是讀取圖形文件數(shù)據(jù),把圖像的RGB值映射到顯存中,這部分也是圖像顯示的設(shè)計(jì)核心。

      [BT5]2.1LCD刷新函數(shù)

      本系統(tǒng)采用RGB565模式,即Red占5位(bit[11:15]),Green占6位(bit[5:10]),Blue占5位(bit[0:4])。LCD刷新函數(shù)的功能是把二級(jí)緩存LCDBuffer的數(shù)據(jù)由32位彩色圖形信息轉(zhuǎn)換成16位圖形信息,而后存送至fbp指向的一級(jí)緩存。轉(zhuǎn)換方法如下:

      pixcolor = ((pbuf[0]&0xf8)>>3)|(((pbuf[1]&0xfc)>>2)<<5)|(((pbuf[2]&0xf8)>>3)<<11);

      [BT5]2.2顯示像素點(diǎn)

      LCD上顯示圖像的基礎(chǔ)設(shè)計(jì)操作即是顯示像素點(diǎn),基于FrameBuffer顯示像素點(diǎn)就是把屏幕對(duì)應(yīng)坐標(biāo)位置的顏色值賦值到LCDFRAMEBUFFER數(shù)組里。本系統(tǒng)使用的是640×480 TFT液晶屏,通過(guò)如下方法可處理實(shí)現(xiàn)像素點(diǎn)的最終顯示,關(guān)鍵代碼如下:

      typedef unsigned long tOff;

      void LCD_WRITE_MEM( U32 off,U16 Data)

      {

      (* ((U16*)LCDFRAMEBUFFER + (off)) ) = Data;

      }static void SetPixel(U16 x, U16 y, U32 c)

      {

      tOff Off = (tOff)((tOff)y*(tOff)640 + (x));

      LCD_WRITE_MEM(Off, Data);

      }

      [BT5]2.3基本圖形繪制

      得到了像素點(diǎn)的研究顯示,就可以在LCD上繪制基本圖形了。其中,水平線和垂直線是原始功能線型。本次研究指出,水平線的繪制就是保持點(diǎn)的縱坐標(biāo)不變,橫坐標(biāo)從x0變化到x1,依次顯示像素點(diǎn),這樣就得到一條從(x0,y0)到(x1,y0)的水平線。同樣道理,橫坐標(biāo)不變,縱坐標(biāo)從y0變化到y(tǒng)1,依次顯示像素點(diǎn),即可得到一條從(x0,y0)到(x0,y1)的垂直線。在此基礎(chǔ)上,矩形的繪制是給出矩形的左上角坐標(biāo)和右下角坐標(biāo),而后根據(jù)這2個(gè)坐標(biāo)在矩形范圍內(nèi)畫(huà)線即可得到實(shí)現(xiàn)。

      由于嵌入式系統(tǒng)不能處理浮點(diǎn)數(shù),在LCD屏上顯示圓形則較復(fù)雜。本系統(tǒng)采用改進(jìn)的Bresenham畫(huà)圓算法,分別給出了空心圓和實(shí)心圓的繪制方法,空心圓程序設(shè)計(jì)流程如圖3所示。實(shí)心圓就是把空心圓內(nèi)的像素點(diǎn)顯示出來(lái)。

      .4漢字及BMP位圖圖像顯示方法

      漢字是以點(diǎn)陣字模形式存儲(chǔ)的,采用16×16點(diǎn)陣(32字節(jié))、24×24點(diǎn)陣(72字節(jié)),每個(gè)點(diǎn)用一個(gè)二進(jìn)制位表示,將其在屏幕上顯示出來(lái),就是研究指定刻畫(huà)的漢字。

      BMP位圖文件和大多數(shù)圖形文件一樣,分為文件描述區(qū)(頭文件信息)和圖像存儲(chǔ)區(qū)(像素?cái)?shù)據(jù))兩部分。圖像的顯示方法和漢字類似,區(qū)別之處只是需要從位圖文件里讀出頭文件信息,BMP位圖LCD顯示的程序流程如圖4所示。

      3結(jié)束語(yǔ)

      基于Linux的FrameBuffer和OMAP3530處理器的開(kāi)發(fā)平臺(tái),在LCD上顯示實(shí)現(xiàn)了清晰、穩(wěn)定的圖形、字符和圖像。該方法移植修改簡(jiǎn)單、方便,為嵌入式產(chǎn)品的顯示系統(tǒng)構(gòu)建了具體模式設(shè)計(jì)基礎(chǔ),對(duì)嵌入式LCD的應(yīng)用提供了通用的實(shí)現(xiàn)方法。

      參考文獻(xiàn):[HT]

      張策, 楊緒劍, 王君君. 基于 FrameBuffer 的 LCD 驅(qū)動(dòng)設(shè)計(jì)[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2009,30 (23):5372-5375.

      [2] 葛化敏,鄭靜,楊利青. 基于ARM-Linux的LCD顯示模塊設(shè)計(jì)[J]. 儀表技術(shù)與傳感器,2009(7):75-77,86.

      [3] 王海霞,武一. 基于SOPC的LCD顯示模塊的設(shè)計(jì)與實(shí)現(xiàn)[J]. 液晶與顯示,2012,27(4):508-514.

      [4] 馬舜峰,金龍旭,安少婷,等. 一種基于ARM9的彩色TFT-LCD模塊設(shè)計(jì)及實(shí)現(xiàn), 液晶與顯示,2010,25(5):718-723.

      连城县| 新建县| 庆城县| 通化县| 通州市| 无为县| 潜江市| 平南县| 留坝县| 通城县| 武夷山市| 清徐县| 田东县| 堆龙德庆县| 武宁县| 宝坻区| 砚山县| 团风县| 正宁县| 霍州市| 丹凤县| 乐昌市| 海口市| 富蕴县| 泗水县| 新乡市| 徐汇区| 湘潭市| 桓台县| 西畴县| 永仁县| 松阳县| 珠海市| 承德市| 平遥县| 上蔡县| 密云县| 宣化县| 海门市| 郴州市| 宣武区|