<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/201608/295508.htm

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

  編譯器:arm-linux-gcc-4.3.2

  二、背景知識

  1. LCD工作的硬件需求:

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

  2. S3C2440內部LCD控制器結構圖:

  

 

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

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

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

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

  d:VIDPRCS接收來(lái)自L(fǎng)CDCDMA的數據,將數據轉換為合適的數據格式,比如說(shuō)4/8位單掃,4位雙掃顯示模式,然后通過(guò)數據端口VD[23:0]傳送視頻數據到LCD驅動(dòng)器;

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

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

  

 

  LCD提供的外部接口信號:

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

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

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

  VD[23:0]:LCD像素數據輸出端口(TFT/STN/SEC TFT);

  VDEN/VM/TP:數據使能信號(TFT)/LCD驅動(dòng)交流偏置信號(STN)/SEC TFT 信號;

  LEND/STH:行結束信號(TFT)/SEC TFT信號;

  LCD_LPCOE:SEC TFT OE信號;

  LCD_LPCREV:SEC TFT REV信號;

  LCD_LPCREVB:SEC TFT REVB信號。

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

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

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

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

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

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

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

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

  VBPD(vertical back porch):表示在一幀圖像開(kāi)始時(shí),垂直同步信號以后的無(wú)效的行數,對應驅動(dòng)中的upper_margin;

  VFBD(vertical front porch):表示在一幀圖像結束后,垂直同步信號以前的無(wú)效的行數,對應驅動(dòng)中的lower_margin;

  VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數計算,對應驅動(dòng)中的vsync_len;

  HBPD(horizontal back porch):表示從水平同步信號開(kāi)始到一行的有效數據開(kāi)始之間的VCLK的個(gè)數,對應驅動(dòng)中的left_margin;

  HFPD(horizontal front porth):表示一行的有效數據結束到下一個(gè)水平同步信號開(kāi)始之間的VCLK的個(gè)數,對應驅動(dòng)中的right_margin;

  HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算,對應驅動(dòng)中的hsync_len;

  對于以上這些參數的值將分別保存到REGBANK寄存器組中的LCDCON1/2/3/4/5寄存器中:(對寄存器的操作請查看S3c2440數據手冊L(fǎng)CD部分)

  LCDCON1:17 - 8位CLKVAL

  6 - 5位掃描模式(對于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為顯示設備提供的一個(gè)接口,它把一些顯示設備描述成一個(gè)緩沖區,允許應用程序通過(guò)FrameBuffer定義好的接口訪(fǎng)問(wèn)這些圖形設備,從而不用去關(guān)心具體的硬件細節。對于幀緩沖設備而言,只要在顯示緩沖區與顯示點(diǎn)對應的區域寫(xiě)入顏色值,對應的顏色就會(huì )自動(dòng)的在屏幕上顯示。下面來(lái)看一下在不同色位模式下緩沖區與顯示點(diǎn)的對應關(guān)系:

  

 

  幀緩沖設備為標準的字符型設備,在Linux中主設備號29,定義在/include/linux/major.h中的FB_MAJOR,次設備號定義幀緩沖的個(gè)數,最大允許有32個(gè)FrameBuffer,定義在/include/linux/fb.h中的FB_MAX,對應于文件系統下/dev/fb%d設備文件。

  1. 幀緩沖設備驅動(dòng)在Linux子系統中的結構如下:

  

 

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


上一頁(yè) 1 2 下一頁(yè)

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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>