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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > S3C2440上LCD驅(qū)動(dòng)(FramBuffer)實(shí)例開發(fā)詳解(一)

          S3C2440上LCD驅(qū)動(dòng)(FramBuffer)實(shí)例開發(fā)詳解(一)

          作者: 時(shí)間:2016-08-15 來源:網(wǎng)絡(luò) 收藏

            嵌入式Linux之我行,主要講述和總結(jié)了本人在學(xué)習(xí)中的每個(gè)步驟。一為總結(jié)經(jīng)驗(yàn),二希望能給想入門嵌入式Linux的朋友提供方便。如有錯(cuò)誤之處,謝請(qǐng)指正。

          本文引用地址:http://www.ex-cimer.com/article/201608/295508.htm

            一、開發(fā)環(huán)境

            編譯器:arm-linux-gcc-4.3.2

            二、背景知識(shí)

            1. LCD工作的硬件需求:

            要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅(qū)動(dòng)器,而且還需要相應(yīng)的LCD控制器。在通常情況下,生產(chǎn)廠商把LCD驅(qū)動(dòng)器會(huì)以COF/COG的形式與LCD玻璃基板制作在一起,而LCD控制器則是由外部的電路來實(shí)現(xiàn),現(xiàn)在很多的MCU內(nèi)部都集成了LCD控制器,如S3C2410/2440等。通過LCD控制器就可以產(chǎn)生LCD驅(qū)動(dòng)器所需要的控制信號(hào)來控制STN/TFT屏了。

            2. S3C2440內(nèi)部LCD控制器結(jié)構(gòu)圖:

            

           

            我們根據(jù)數(shù)據(jù)手冊(cè)來描述一下這個(gè)集成在S3C2440內(nèi)部的LCD控制器:

            a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器組成;

            b:REGBANK由17個(gè)可編程的寄存器組和一塊256*16的調(diào)色板內(nèi)存組成,它們用來配置LCD控制器的;

            c:LCDCDMA是一個(gè)專用的DMA,它能自動(dòng)地把在偵內(nèi)存中的視頻數(shù)據(jù)傳送到LCD驅(qū)動(dòng)器,通過使用這個(gè)DMA通道,視頻數(shù)據(jù)在不需要CPU的干預(yù)的情況下顯示在LCD屏上;

            d:VIDPRCS接收來自LCDCDMA的數(shù)據(jù),將數(shù)據(jù)轉(zhuǎn)換為合適的數(shù)據(jù)格式,比如說4/8位單掃,4位雙掃顯示模式,然后通過數(shù)據(jù)端口VD[23:0]傳送視頻數(shù)據(jù)到LCD驅(qū)動(dòng)器;

            e:TIMEGEN由可編程的邏輯組成,他生成LCD驅(qū)動(dòng)器需要的控制信號(hào),比如VSYNC、HSYNC、VCLK和LEND等等,而這些控制信號(hào)又與REGBANK寄存器組中的LCDCON1/2/3/4/5的配置密切相關(guān),通過不同的配置,TIMEGEN就能產(chǎn)生這些信號(hào)的不同形態(tài),從而支持不同的LCD驅(qū)動(dòng)器(即不同的STN/TFT屏)。

            3. 常見TFT屏工作時(shí)序分析:

            

           

            LCD提供的外部接口信號(hào):

            VSYNC/VFRAME/STV:垂直同步信號(hào)(TFT)/幀同步信號(hào)(STN)/SEC TFT信號(hào);

            HSYNC/VLINE/CPV:水平同步信號(hào)(TFT)/行同步脈沖信號(hào)(STN)/SEC TFT信號(hào);

            VCLK/LCD_HCLK:象素時(shí)鐘信號(hào)(TFT/STN)/SEC TFT信號(hào);

            VD[23:0]:LCD像素?cái)?shù)據(jù)輸出端口(TFT/STN/SEC TFT);

            VDEN/VM/TP:數(shù)據(jù)使能信號(hào)(TFT)/LCD驅(qū)動(dòng)交流偏置信號(hào)(STN)/SEC TFT 信號(hào);

            LEND/STH:行結(jié)束信號(hào)(TFT)/SEC TFT信號(hào);

            LCD_LPCOE:SEC TFT OE信號(hào);

            LCD_LPCREV:SEC TFT REV信號(hào);

            LCD_LPCREVB:SEC TFT REVB信號(hào)。

            所有顯示器顯示圖像的原理都是從上到下,從左到右的。這是什么意思呢?這么說吧,一副圖像可以看做是一個(gè)矩形,由很多排列整齊的點(diǎn)一行一行組成,這些點(diǎn)稱之為像素。那么這幅圖在LCD上的顯示原理就是:

            A:顯示指針從矩形左上角的第一行第一個(gè)點(diǎn)開始,一個(gè)點(diǎn)一個(gè)點(diǎn)的在LCD上顯示,在上面的時(shí)序圖上用時(shí)間線表示就為VCLK,我們稱之為像素時(shí)鐘信號(hào);

            B:當(dāng)顯示指針一直顯示到矩形的右邊就結(jié)束這一行,那么這一行的動(dòng)作在上面的時(shí)序圖中就稱之為1 Line;

            C:接下來顯示指針又回到矩形的左邊從第二行開始顯示,注意,顯示指針在從第一行的右邊回到第二行的左邊是需要一定的時(shí)間的,我們稱之為行切換;

            D:如此類推,顯示指針就這樣一行一行的顯示至矩形的右下角才把一副圖顯示完成。因此,這一行一行的顯示在時(shí)間線上看,就是時(shí)序圖上的HSYNC;

            E:然而,LCD的顯示并不是對(duì)一副圖像快速的顯示一下,為了持續(xù)和穩(wěn)定的在LCD上顯示,就需要切換到另一幅圖上(另一幅圖可以和上一副圖一樣或者不一樣,目的只是為了將圖像持續(xù)的顯示在LCD上)。那么這一副一副的圖像就稱之為幀,在時(shí)序圖上就表示為1 Frame,因此從時(shí)序圖上可以看出1 Line只是1 Frame中的一行;

            F:同樣的,在幀與幀切換之間也是需要一定的時(shí)間的,我們稱之為幀切換,那么LCD整個(gè)顯示的過程在時(shí)間線上看,就可表示為時(shí)序圖上的VSYNC。

            上面時(shí)序圖上各時(shí)鐘延時(shí)參數(shù)的含義如下:(這些參數(shù)的值,LCD產(chǎn)生廠商會(huì)提供相應(yīng)的數(shù)據(jù)手冊(cè))

            VBPD(vertical back porch):表示在一幀圖像開始時(shí),垂直同步信號(hào)以后的無效的行數(shù),對(duì)應(yīng)驅(qū)動(dòng)中的upper_margin;

            VFBD(vertical front porch):表示在一幀圖像結(jié)束后,垂直同步信號(hào)以前的無效的行數(shù),對(duì)應(yīng)驅(qū)動(dòng)中的lower_margin;

            VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數(shù)計(jì)算,對(duì)應(yīng)驅(qū)動(dòng)中的vsync_len;

            HBPD(horizontal back porch):表示從水平同步信號(hào)開始到一行的有效數(shù)據(jù)開始之間的VCLK的個(gè)數(shù),對(duì)應(yīng)驅(qū)動(dòng)中的left_margin;

            HFPD(horizontal front porth):表示一行的有效數(shù)據(jù)結(jié)束到下一個(gè)水平同步信號(hào)開始之間的VCLK的個(gè)數(shù),對(duì)應(yīng)驅(qū)動(dòng)中的right_margin;

            HSPW(horizontal sync pulse width):表示水平同步信號(hào)的寬度,用VCLK計(jì)算,對(duì)應(yīng)驅(qū)動(dòng)中的hsync_len;

            對(duì)于以上這些參數(shù)的值將分別保存到REGBANK寄存器組中的LCDCON1/2/3/4/5寄存器中:(對(duì)寄存器的操作請(qǐng)查看S3c2440數(shù)據(jù)手冊(cè)LCD部分)

            LCDCON1:17 - 8位CLKVAL

            6 - 5位掃描模式(對(duì)于STN屏:4位單/雙掃、8位單掃)

            4 - 1位色位模式(1BPP、8BPP、16BPP等)

            LCDCON2:31 - 24位VBPD

            23 - 14位LINEVAL

            13 - 6位VFPD

            5 - 0位VSPW

            LCDCON3:25 - 19位HBPD

            18 - 8位HOZVAL

            7 - 0位HFPD

            LCDCON4: 7 - 0位HSPW

            LCDCON5:

            4. 幀緩沖(FrameBuffer):

            幀緩沖是Linux為顯示設(shè)備提供的一個(gè)接口,它把一些顯示設(shè)備描述成一個(gè)緩沖區(qū),允許應(yīng)用程序通過FrameBuffer定義好的接口訪問這些圖形設(shè)備,從而不用去關(guān)心具體的硬件細(xì)節(jié)。對(duì)于幀緩沖設(shè)備而言,只要在顯示緩沖區(qū)與顯示點(diǎn)對(duì)應(yīng)的區(qū)域?qū)懭腩伾担瑢?duì)應(yīng)的顏色就會(huì)自動(dòng)的在屏幕上顯示。下面來看一下在不同色位模式下緩沖區(qū)與顯示點(diǎn)的對(duì)應(yīng)關(guān)系:

            

           

            幀緩沖設(shè)備為標(biāo)準(zhǔn)的字符型設(shè)備,在Linux中主設(shè)備號(hào)29,定義在/include/linux/major.h中的FB_MAJOR,次設(shè)備號(hào)定義幀緩沖的個(gè)數(shù),最大允許有32個(gè)FrameBuffer,定義在/include/linux/fb.h中的FB_MAX,對(duì)應(yīng)于文件系統(tǒng)下/dev/fb%d設(shè)備文件。

            1. 幀緩沖設(shè)備驅(qū)動(dòng)在Linux子系統(tǒng)中的結(jié)構(gòu)如下:

            

           

            我們從上面這幅圖看,幀緩沖設(shè)備在Linux中也可以看做是一個(gè)完整的子系統(tǒng),大體由fbmem.c和xxxfb.c組成。向上給應(yīng)用程序提供完善的設(shè)備文件操作接口(即對(duì)FrameBuffer設(shè)備進(jìn)行read、write、ioctl等操作),接口在Linux提供的fbmem.c文件中實(shí)現(xiàn);向下提供了硬件操作的接口,只是這些接口Linux并沒有提供實(shí)現(xiàn),因?yàn)檫@要根據(jù)具體的LCD控制器硬件進(jìn)行設(shè)置,所以這就是我們要做的事情了(即xxxfb.c部分的實(shí)現(xiàn))。


          上一頁 1 2 下一頁

          關(guān)鍵詞: 嵌入式linux

          評(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); })();