《基于ARM9的嵌入式Linux系統開發原理與實踐》課件第11章_第1頁
《基于ARM9的嵌入式Linux系統開發原理與實踐》課件第11章_第2頁
《基于ARM9的嵌入式Linux系統開發原理與實踐》課件第11章_第3頁
《基于ARM9的嵌入式Linux系統開發原理與實踐》課件第11章_第4頁
《基于ARM9的嵌入式Linux系統開發原理與實踐》課件第11章_第5頁
已閱讀5頁,還剩56頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第11章TFT-LCD驅動程序開發11.1TFT-LCD工作原理11.2LQ080V3DG01液晶屏11.3SC2410內部LCD控制器11.4Linux驅動程序接口——FrameBuffer11.5LCD驅動程序主要代碼結構以及關鍵代碼分析11.6LCD驅動程序開發實例本章小結

11.1TFT-LCD工作原理

11.1.1LCD概述

液晶最早是奧地利植物學家萊尼茨爾于1888年發現的,他發現某些有機物熔化后會經歷一個不透明的呈白色渾濁液體狀態。第二年,德國物理學家萊曼發現這類渾濁液體外觀上雖然屬于液體,但卻顯示出各向異性晶體特有的雙折射性,于是萊曼將其命名為“液態晶體”,也就是“液晶”。11.1.2LCD顯示原理

液晶是一種介于固體和液體之間,具有規則性分子排列的有機化合物,既有晶體所特有的各向異性造成的雙折射性,又有液體所特有的流動性,如圖11-1所示。圖11-1液晶分子特性

1.液晶的光電特性

液晶分子結構為各向異性,所以液晶的光電特性因方向不同而有所差異,也就是液晶分子在介電系數及折射系數等光電特性都具有各向異性,利用這些性質可以改變入射光的強度,形成灰階,制作顯示器。液晶分子的電光效應最顯著的是扭曲向列效應。在不同電流電場作用下,液晶分子會規則旋轉90°排列。當偏振光通過液晶時,偏振角發生變化,這個變化的角度稱為扭曲角,如圖11-2所示。圖11-2液晶的電光效應

2.液晶的顯示原理

液晶顯示器是將液晶置于兩片導電玻璃之間,靠兩個電極間電場的驅動引起液晶分子扭曲向列的電光效應。在電源的關開之間控制光源透射或遮蔽,產生明暗兩種效果。如圖11-2所示,在玻璃電極板上裝有配向膜,所以液晶會沿著溝槽配向,由于玻璃基板配向膜溝槽偏離90°,所以液晶分子成為扭轉型。11.1.3LCD驅動原理

1.直接驅動法

1)靜態驅動

靜態驅動是指在液晶像素前后電極上施加電壓信號時呈顯示狀態,不施加電壓時呈非顯示狀態。以圖11-3所示筆段式LCD為例,11-3(a)是筆段式液晶的電極排列方式,11-3(b)是其中一個液晶像素的驅動電路原理圖。圖11-3筆段式LCD的靜態驅動在COM端施加一個占空比為1/2的連續方波。當控制信號為高電平時,筆段波形與COM波形反向,液晶像素上施加了一個周期電壓,液晶像素呈顯示狀態;當控制信號為低電平時,筆段波形與COM波形同向,液晶像素上無電壓,呈非顯示狀態。控制時序如圖11-4所示。圖11-4筆段式LCD的靜態驅動時序圖

2)動態驅動

當LCD的像素數增多的,筆段式LCD的結構和驅動方法就變得都不合理了。對于多像素LCD,即點陣式LCD,采用矩陣式排列液晶像素的前后電極,行、列的交叉點為液晶像素,如圖11-5所示。圖11-5點陣式LCD的結構圖

2.有源驅動法

為了進一步提高顯示質量,TFT-LCD以其分辨率高、響應速度快和色彩豐富等優點正逐漸取代STN-LCD。如圖11-6所示,TFT-LCD的每個像素上集成了一個有源器件——薄膜晶體管(TFT),對TFT-LCD的驅動實際上是對每個像素點上的TFT的驅動,而非直接驅動法將驅動信號直接施加到液晶像素上,因此,稱TFT-LCD的驅動為有源驅動法。圖11-6TFT-LCD像素結構11.1.4LCD的分類

1.?TN-LCD與STN-LCD

STN-LCD是TN-LCD的升級產品,兩者結構基本相同。TN-LCD的基本單元和顯示原理如圖11-2所示,液晶的扭曲角為90°,而STN-LCD的扭曲角達到180°~360°,提高了液晶的電光響應速度。如圖11-7所示,由于STN-LCD的掃描行電極和尋址列電極直接連接在液晶像素上進行驅動,因而存在以下幾個重要缺陷。圖11-7STN-LCD結構圖1)分辨率低

2)色彩少,無真彩顯示

3)響應速度慢

2.?TFT-LCD

TFT-LCD的響應速度取決于TFT的開關速度,與液晶像素的充放電速度無關,所以TFT-LCD的響應速度遠快于STN-LCD,可以無拖影地顯示動態圖像。STN-LCD與TFT-LCD分屬于LCD的低端和高端,性能比較如表11-1所示。

11.2LQ080V3DG01液晶屏

LQ080V3DG01芯片是由日本夏普公司生產的TFT-LCD,其外型尺寸為182mm?×?140mm?×?14mm,尺寸為8寸,分辨率為640?×?480,工作溫度為0℃~+70℃,背光類型為1xccfl,顯示顏色為262k,對比度為250∶1,亮度為380cd/m2,?接口類型為TTL,響應時間為

80ms,供壓3.3V/5V,功耗6.2W。

11.3SC2410內部LCD控制器

11.3.1管腳

S3C2410LCD控制器用于傳輸視頻數據和產生必要的控制信號,像VFRAME、VLINE、VCLK、VM等。除了控制信號,S3C2410還有輸出視頻數據的端口VD[23:0],如圖11-8

所示。圖11-8S3C2410LCD控制器的外部管腳圖11.3.2寄存器介紹

1.?LCDCON1

LCDCON1中需要設置以下幾個域:

CLKVAL是時鐘比值參數,它決定了VCLK信號的頻率,對于TFT型模塊要求CLKVAL≥0,VCLK和CLKVAL的關系為

VCLK(Hz)?=?HCLK?/?[(CLKVAL?+?1)?×?21]

2.?LCDCON2

LCDCON2需要設置以下幾個域:

VBPD:該域表示幀同步脈沖之后到一幀圖像開始顯示之間需要消隱的行數;

LINEVAL:該域表示每幀要顯示的行數;

VFPD:該域表示一幀圖像顯示完成到幀同步脈沖到來之間需要消隱的行數;

VSPW:該域表示幀同步脈沖的寬度。

3.?LCDCON3

LCDCON3中需要設置以下幾個域:

HBPD:該域表示行同步脈沖之后到一行圖像開始顯示之間需要消隱的像素數;

HOZVAL:該域表示每行要顯示的像素數;

HFPD:該域表示一行圖像顯示完成到行同步脈沖到來之間需要消隱的像素數。

4.?LCDCON4

LCDCON4中只需要設置一個域:HSPW,該域表示行同步脈沖的寬度。

5.?LCDCON5

LCDCON5中主要需要設置以下幾個域:

BPP24BL決定24bpp視頻存儲器的大小端模式。

FRM565決定16bpp視頻輸出數據的格式。

INVVCLK、INVVLINE、INVVFRAME分別決定了VCLK、VLINE、VSYNC信號的極性。

INVVDEN、INVVD分別決定了VDEN、VD信號的極性。11.3.3控制流程

LCD控制器由REGBANK、LCDCDMA、VIDPRCS、TIMEGEN和LPC3600組成(如圖11-9所示)。圖11-9S3C2410內部LCD控制器方框圖11.3.4TFT控制器操作

S3C2410支持STN-LCD和TFT-LCD,這里只介紹其對TFT-LCD的控制。

TIMEGEN產生LCD驅動器的控制信號,如VSYNC、HSYNC、VCLK、VDEN和LEND等。這些控制信號與REGBANK寄存器組中的LCDCON1/2/3/4/5寄存器的配置關系相當密切,基于LCD控制寄存器中的這些可編程配置,TIMEGEN產生可編程控制信號來支持不同類型的LCD驅動器。VSYNC和HSYNC脈沖的產生依賴于LCDCON2/3寄存器的HOZVAL域和LINEVAL域的配置。

HOZVAL和LINEVAL的值由LCD屏的尺寸決定,如下公式:

HOZVAL?=?水平顯示尺寸?-?1

LINEVAL?=?垂直顯示尺寸?-?1

VCLK信號的頻率取決于LCDCON1寄存器中的CLKVAL域。VCLK和CLKVAL的關系如下:

VCLK(Hz)?=?HCLK?/?[(CLKVAL?+?1)?×?2]

11.4Linux驅動程序接口——

FrameBuffer

11.4.1FrameBuffer

在Linux2.2.xx之后內核版本中出現了一種驅動程序接口即FrameBuffer。這種接口為圖像硬件設備提供了一種抽象化處理。它代表了一些視頻硬件設備,允許應用軟件通過定義明確的界面來訪問圖像硬件設備。圖11-10Linux系統下FrameBuffer的主要結構11.4.2數據結構

1.?LinuxFrameBuffer的數據結構

FrameBuffer的數據結構的定義在內核源碼include/linux/

fb.h文件中。

在FrameBuffer中,fb_info可以說是最重要的一個結構體,它是Linux為幀緩沖設備定義的驅動層接口。它不僅包含了底層函數,而且還有記錄設備狀態的數據。每個幀緩沖設備都與一個fb_info結構相對應。圖11-11LinuxFrameBuffer的總體結構圖

2.?S3C2410中LCD的數據結構

在S3C2410的LCD設備驅動中,定義了s3c2410fb_info(內核源碼driver/video/s3c2410.h)文件中來標識一個LCD設備,結構體如下:圖11-12S3C2410驅動的整體結構

11.5LCD驅動程序主要代碼

結構以及關鍵代碼分析

11.5.1FrameBuffer驅動的統一管理

fbmem.c實現了LinuxFrameBuffer的中間層,任何一個FrameBuffer驅動,在系統初始化時,必須向fbmem.c注冊,即需要調用register_framebuffer()函數,在這個過程中,設備驅動的信息將會存入名稱為registered_fb數組中,這個數組定義為:

structfb_info*registered_fb[FB_MAX];

intnum_registered_fb;11.5.2實現消息的分派

fbmem.c實現了對系統全部FrameBuffer設備的統一管理。當用戶嘗試使用一個特定的FrameBuffer時,fbmem.c怎么知道該調用哪個特定的設備驅動呢?

Linux是通過主設備號和次設備號對設備進行唯一標識。不同的FrameBuffer設備向fbmem.c注冊時,程序分配給它們的主設備號是一樣的,而次設備號是不一樣的。于是就可以通過用戶指明的次設備號,來具體該調用哪一個FrameBuffer驅動。圖11-13LCD驅動的open()函數的調用流程圖11.5.3開發板S3C2410LCD驅動的流程

1.定義了初始的LCD參數

在mach-smdk2410.c(在內核源碼arch/arm/mach-s3c2410目錄中)中,定義了初始的LCD參數。注意,這是個全局變量。

2.?s3c2410fb_probe函數

內核初始化時候調用s3c2410fb_probe函數(內核源碼driver/video/s3c2410fb.c文件中)。

首先動態分配s3c2410fb_info空間。

fbinfo=framebuffer_alloc(sizeof(structs3c2410fb_info),

&pdev->dev);

把域mach_info指向mach-smdk2410.c中的smdk2410_lcd

_cfg。

info->mach_info=pdev->dev.platform_data;

3.?mmap()映射內存函數

當用戶調用mmap()映射內存的時候,fbmem.c把剛才設置好的顯存區域映射給用戶。

start=info->fix.smem_start;

len=PAGE_ALIGN((start&~PAGE_MASK)+info->fix.smem_len);

io_remap_pfn_range(vma,vma->vm_start,off>>PAGE

_SHIFT,

vma->vm_end-vma->vm_start,vma->vm_page_prot);

11.6LCD驅動程序開發實例

11.6.1S3C2410與LCD模塊的連接電路

博創開發板S3C2410與LCD模塊的連接如圖11-14所示。圖11-14S3C2410與LQ080V3DG01連接圖圖11-15S3C241O與LQ080V3DG01連接原理圖11.6.2修改代碼(一)——LCD顯示企鵝圖像

1.修改mach-smdk2410.c文件

在第8章中成功的內核源代碼中將/linux-2.6.14

.success20090807/arch/arm/mach-s3c2410目錄下的mach-smdk2410.c文件打開:

[root@localhostlinux-2.6.14.success20090807]#viarch/arm/mach-s3c2410/mach-smdk2410.c

2.添加mxl.h文件

在?/linux-2.6.14.success20090807/include/asm-arm/arch-s3c2410目錄下創建mxl.h文件:

[root@localhostlinux-2.6.14.success20090807]#viinclude/asm-arm/arch-s3c2410/mxl.h

mxl.h文件內容如下:

#include<asm-arm/arch-s3c2410/map.h>

#defineIRQ_RTL8019

IRQ_EINT4

#defineEXTINT_OFF(IRQ_EINT4-4)

/*RTL8019a,nGCS3*/

#definepRTL8019_BASE

S3C2410_PA_ISA_NET

#definevRTL8019_BASE

S3C2410_VA_ISA_NET

3.注釋blank_screen_t函數內容

注釋drivers\char\vt.c的blank_screen_t(unsignedlongdummy)的函數內容,否則lcd很快關掉顯示。

4.重新配置內核

[root@localhostlinux-2.6.14.success20090807]#makemenuconfig

配置界面如圖11-16所示。圖11-16內核配置LCD驅動界面

5.重新編譯內核

編譯內核:

[root@localhostlinux-2.6.14.success20090807]#makezImage

將重新制作zImage燒寫到博創開發板,再次啟動linxu2.6.14以后就可以在LCD上看到一個小的企鵝,如圖

11-17所示。圖11-17博創開發板LCD顯示企鵝圖像11.6.3修改代碼(二)——LCD顯示小車圖像

1.打開GIMP圖像編輯器

點擊開始菜單,選擇圖形,選擇TheGIMP。

2.打開想要的圖像文件

點擊文件,選擇圖像文件所在目錄,點擊確定,就可顯示圖像文件,如圖11-18所示。圖11-18打開圖像文件

3.修改圖像索引顏色

將鼠標放在圖像中,點擊鼠標右鍵,依次選擇圖像→模式→索引顏色,將顏色改為224色。

4.保存圖像

圖片大小不要大于顯示器分辨率就可以。最后將鼠標放在圖像中,點擊鼠標右鍵,將文件保存為ppm格式(ASCII碼),文件名為:mxl1.ppm,如圖11-19所示。圖11-19保存圖像

5.替換原有的企鵝圖像

將mxl1.ppm拷貝到?/linux-2.6.14.succe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論