下彩色液晶顯示器的設計_第1頁
下彩色液晶顯示器的設計_第2頁
下彩色液晶顯示器的設計_第3頁
下彩色液晶顯示器的設計_第4頁
下彩色液晶顯示器的設計_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、 可修改 歡送下載 精品 Word 可修改 歡送下載 精品 Word 可修改 歡送下載 精品 WordS3C2440A下彩色(cis)液晶顯示器的設計嵌入式系統已成為當今(dngjn)最熱門的概念之一,對大多數嵌入式系統(xtng)開發者而言,顯示系統的硬件和軟件開發是不可回避(hub)的關鍵性技術。三星公司開發的S3C2440A是一款以ARM920T為內核(ni h)的嵌入式微處理器,它的最高工作頻率達533MHz,內含3通道的異步串行口,USB主、從單元設備接口,攝像頭接口,觸摸屏接口,LCD控制器等眾多片上外設接口,且具低功耗、高性能,廣泛適用于PDA、便攜式媒體播放器、手持式導航儀等領

2、域。目前國內對該款高性價比嵌入式微處理器的開發應用才起步不久。 夏普公司生產的LCD屏LQ035Q7DH01為3.5in透反射式TFT-LCD顯示器,屏幕分辨率為320240,能提供262144種色彩,顯示亮度到達100nit,使設計人員能夠在各種照明條件下利用它來生動地展示圖像和文字信息。本文以S3C2440A和LQ035Q7DH01為硬件根底,設計了顯示硬件電路。 軟件平臺采用Linux 2.4.20, 交叉編譯器為arm-linux-gcc 2.95.3,完成了對LQ035Q7DH01顯示屏的驅動程序開發。 以三星公司的嵌入式微處理器S3C2440A和夏普公司3.5inLCD屏LQ035

3、Q7DH01為根底,設計了顯示硬件電路,介紹了幀緩沖設備的處理機制及底層驅動的接口函數,針對本顯示系統給出了如何開發其Linux幀緩沖設備驅動程序。不管是顯示硬件電路還是軟件驅動程序,都有很強的可移植性,可以方便地移植到不同的平臺。1顯示系統硬件電路1.1 LCD控制器電路 LCD控制器用來傳輸圖像數據并產生相應的控制信號,S3C2440A LCD控制器能支持高達4K色STN屏和256K色TFT屏,支持1024768分辨率下的各種液晶屏, 具有LCD專用DMA。LCD控制器產生的控制信號和數據信號主要有:VFRAME:LCD 控制器和LCD驅動器之間的幀同步(tngb)信號, LCD控制器在一

4、個完整幀顯示完成(wn chng)后插入一個VFRAME信號(xnho),開始(kish)新一幀的顯示。 VLINE:LCD控制器和LCD驅動器之間的行同步(tngb)信號,LCD控制器在整行數據移入LCD驅動器后插入一個VLINE信號。 VCLK:LCD控制器和LCD驅動器之間的像素時鐘信號, 由LCD控制器送出的數據在VCLK的上升沿處送出,在VCLK的下降沿處被LCD驅動器采樣。 VM:數據輸出使能信號,在VM 信號躍變成高電平后行數據信號開始由LCD控制器輸出至LCD驅動器,當VM信號躍變為低電平后數據輸出停止。 數據線:也就是RGB信號線,S3C2440A LCD控制器有VD0:23

5、共24根數據線,數據格式不同,接線方式就不同。本文用的是RGB565方式,只需要16根數據線(紅色5根,綠色6根,藍色5根)。其數據線接線方式如表1所示:LCD控制器電路(dinl)如圖1所示:1.2 時序(sh x)和數據匹配電路 由于(yuy)S3C2440A 的LCD控制器與LCD屏LQ035Q7DH01在數據格式及顯示(xinsh)時序上無法匹配,需要(xyo)選用一種時序控制IC或者用CPLD(也就是通常所說的LCD伴侶芯片)來對不同數據格式的數據接口進行映射。但CPLD面積較大、本錢較高,因而通常只在需要對電路進行靈活配置的情況下才使用。本文時序控制IC選用夏普公司的LZ9FC22

6、。該芯片專用于對TFT型QVGA屏幕(屏幕分辨率320240)的LCD進行時序控制。這是一個18bit(R6G6B6)的控制器,由于本文采用的是RGB565 16位工作模式,所以將其輸入引腳R0和B0接地。時序和數據匹配電路如圖2所示:1.3 多路電壓(diny)產生電路 LCD屏內集成(j chn)有數字電路和模擬電路,需要外部提供(tgng)數字電壓和模擬電壓。另外,為了(wi le)完成數據掃描,需要(xyo)TFT輪流開啟/關閉。當TFT開啟時,數據通過源極驅動器加載到顯示電極,顯示電極和公共電極問的電壓差再作用于液晶實現顯示,因此需要控制LCD的開啟電壓、關閉電壓,以及加到公共電極上

7、的電壓, 本系統采用松下公司生產的芯片LM1117DT-3.3來產生LCD所需要的數字電壓,采用美國MAXIM 公司推出的有源矩陣液晶顯示器電源芯片MAX1664來產生其他電壓,MAX1664內部集成有兩個DC-DC變換器,可以為小型TFT LCD提供高效的調節電壓。LCD所需各電壓如表2所示:多路電壓產生電路如圖3所示1.4 顯示驅動和LQ035Q7DH01的接口電路顯示驅動和LQ035Q7DH01的接口電路如圖4所示:1.5 顯示系統整體結構框圖顯示系統整體結構框圖如圖5所示。圖5 顯示系統結構框圖2 Linux下的幀緩沖(hunchng)(frame buffer)設備(shbi) Li

8、nux下編寫顯示設備的驅動程序有兩種方法:一種是把顯示設備抽象(chuxing)成一般的字符設備,驅動程序的寫法和一般的字符設備(shbi)驅動類似;第二種就是幀緩沖設備(shbi)驅動程序的編寫。由于第一種方法不標準,而且實現功能有限,故一般不提倡;而幀緩沖驅動程序比擬簡單,也容易實現,因而在嵌入式系統里得到了廣泛應用。 幀緩沖設備是一個提供顯示內存和顯示芯片存放器從物理內存映射到進程地址空間中的設備,是Linux為圖形設備提供的一個抽象接口,它將顯示設備抽象為幀緩沖區。幀緩沖允許上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫操作。這種操作是抽象的、統一的。應用程序不必關心物理顯存的位置、

9、換頁機制等等具體細節。 幀緩沖設備屬于字符設備,采用“文件層-驅動層的接口方式。 Linux內核include/fnux/fb.h中定義了幀緩沖設備的驅動層接口fb_info結構體,fb_info定義了當前工作的顯示卡的狀態和幀緩沖設備的操作函數, 它僅對內核可見。文件fb.h中還定義了fb_var_screeninfo(顯示卡可變特性,這些特性在程序運行期間可以由應用程序動態改變)、fb_fix_screeninfo(顯示卡不可變特性,這些特性在硬件初始化時就被定義了, 以后不得修改)、fb_cmap(RGB顏色映射表)等結構體,幀緩沖設備驅動程序主要依靠這幾個結構體工作。除了結構體fb_i

10、nfo只能在內核空間訪問外,其他三個結構體都可以在用戶空間訪問。 Linux內核driversvideofbmem.c中定義了幀緩沖設備的文件層接口file_operations結構體,它對應用程序可見,結構體中功能函數open()和release()不需要底層的支持.而read()、write()、mmap()那么需要調用fb_get_fix()、fb_get_var()、fb_set_var()、fb_get_cmap、fb_set_cmap()(這些函數位于結構體fb_info中指針fbops指向的結構體變量中)等與底層LCD硬件相關的函數的支持。另一個功能函數是ioctl(),ioct

11、l()是設備驅動程序中對設備的I/O通道進行管理的函數,應用程序通過ioctl()系統調用來調用fb_get_fix()、fb_get_var()、fb_set_var()、fb_set_cmap()、fb_get_cmap()等來獲得和設置結構體fb_info中fb_var_screeninfo結構變量var、fb_fix_screeninfo 結構變量fix 和fb_cmap結構變量cmap等變量的信息。在fbmem.c中給出了ioctl()命令和fb_info中結構體fb_ops的成員函數的對應關系如下:FBIOGET_VSCREENINFO fb_get_varFBIOPUT_VSCR

12、EENINFO fb_set_varFBIOGET_FSCREENINFO fb_get_fixFBIOPUTCMAP fb_set_cmapFBIOGETCMAP fb_get_cmap用戶應用程序只需要調用FBIOXXXX來操作LCD硬件。 文件fbmem.c中還定義了幀緩沖設備底層驅動的管理函數:register_framebuffer(struct fb_info 3 fb_info)unregister_framebuffer(struct fb_info 3 fb_info) 幀緩沖設備在驅動層所要做的工作僅僅是對Linux為幀緩沖的驅動層接口fb_info進行初始化.然后調用這兩

13、個函數對其注冊或注銷。幀緩沖設備驅動層接口直接對LCD設備硬件進行操作,而fbmem.c可以記錄和管理多個底層設備驅動。3 顯示系統幀緩沖(hunchng)驅動的編寫3.1 定義(dngy)LCD控制器結構(jigu)體 前面(qin mian)已經說過,LCD控制器的功能是傳輸圖像數據并產生相應的控制信號(xnho)來驅動LCD顯示器,驅動程序需要根據當前具體顯示硬件的特性,通過讀寫一系列的LCD控制存放器來完成設定顯示器分辨率和顯示數據的格式,設置控制信號時序,指定顯示緩 中區地址等,從而提供應顯示設備適宜的數據信號和控制信號。文中根據需要為S3C2440A的LCD 控制器定義了一個專用結

14、構體s3c2440fb_mach_info:struct s3c2440fb_mach_infou_long pixclock; /* 像素時鐘頻率 */u_char bpp; /* 每像素需要的bit數 */u_short xres; /* 顯示器行分辨率 */u_short yres; /* 顯示器列分辨率 */u_char hsync_len; /* 行同步信號的長度 */u_char vsync_len; /* 幀同步信號的長度 */u_char left_margin;/* 從本行圖象數據輸出結束到下一行的行同步信號開始之間的像素時鐘數 */u_char right_margin;

15、/* 從行同步信號結束到該行的圖象數據開始輸出之間的像素時鐘數*/u_char upper_margin;/*從本幀圖象數據輸出結束到下一幀的幀同步信號開始之間的無效行數 */u_char lower_margin; /*從幀同步信號結束到該幀圖象數據開始輸出之間的無效行數*/u_char sync;struct s3c2440fb_lcd_reg reg; /*S3C2440ALCD控制存放器結構體 */; 驅動程序通過定義一個s3c2440fb_mach_info結構變量并給該變量賦值來完成LCD控制器的初始化。3.2 編寫結構體fb_info中fb_ops對應的成員函數 對于本嵌入式系統

16、的實現,需要以下5個函數static struct fb_ops s3c2440fb_ops=owner:THIS_MODULE,/*THIS_MODULE宏用來防止驅動模塊在使用狀態下被卸載 /fb_get_fix:s3c2440fb_get_fix,fb_get_var:s3c2440fb_get_var,fb_set_var:s3c2440fb_set_var,fb_get_cmap:s3c2440fb_get_cmap,fb_set_cmap:s3c2440fb_set_cmap,;結構體fb_ops在Linux內核include/linux/fb.h中定義。 這些函數都是用來設置和獲

17、取驅動層接口fb_info結構體中的成員變量的,前文已提過當應用程序對設備文件進行ioctl操作時會調用它們。對于fb_get_fix()和fb_get_var()應用程序傳入的是fb_info中的結構變量fix和var,fb_set_var()函數那么是對var變量進行設置。同樣fb_get_cmap()和fb_set_cmap()那么是對結構變量cmap內容進行讀取和設置。在這5個函數中,fb_set_var()設置了顯示設備的顯示模式,是最重要的一個函數。文中根據需要為當前顯示硬件定義一個專有結構體s3c2440fb_info,該結構體包括一個fb_info結構變量,及其它與所選LCD硬

18、件有關的所有參數.因此結構體fb_ops中成員函數對結構體fb_info的操作實際上就是對結構體s3c2440fb_info的操作。該結構體定義如下:struct s3c2440fb_infostruct fb_info fb; /* fb_info結構變量 */signed int currcon; /* 當前終端控制臺的序號*/u_int max_xres;/*屏幕能顯示的最大行分辨率 */u_int max_yres;/* 屏幕能顯示的最大列分辨率 */struct s3c2440fb_lcd_reg reg;/*S3C2440A LCD控制存放器 */* 其他與LCD硬件有關的參數 *

19、/;結構體fb_ops中的成員函數流程相似,本文在此僅給出函數s3c2440fb_set_var()的流程圖和程序代碼。函數s3c2440fb_set_var()流程圖如圖6所示:static struct fb_ops s3c2440fb_ops=owner:THIS_MODULE,/*THIS_MODULE宏用來防止驅動模塊在使用狀態下被卸載 /fb_get_fix:s3c2440fb_get_fix,fb_get_var:s3c2440fb_get_var,fb_set_var:s3c2440fb_set_var,fb_get_cmap:s3c2440fb_get_cmap,fb_set

20、_cmap:s3c2440fb_set_cmap,;結構體fb_ops在Linux內核include/linux/fb.h中定義。 這些函數都是用來設置和獲取驅動層接口fb_info結構體中的成員變量的,前文已提過當應用程序對設備文件進行ioctl操作時會調用它們。對于fb_get_fix()和fb_get_var()應用程序傳入的是fb_info中的結構變量fix和var,fb_set_var()函數那么是對var變量進行設置。同樣fb_get_cmap()和fb_set_cmap()那么是對結構變量cmap內容進行讀取和設置。在這5個函數中,fb_set_var()設置了顯示設備的顯示模式

21、,是最重要的一個函數。文中根據需要為當前顯示硬件定義一個專有結構體s3c2440fb_info,該結構體包括一個fb_info結構變量,及其它與所選LCD硬件有關的所有參數.因此結構體fb_ops中成員函數對結構體fb_info的操作實際上就是對結構體s3c2440fb_info的操作。該結構體定義如下:struct s3c2440fb_infostruct fb_info fb; /* fb_info結構變量 */signed int currcon; /* 當前終端控制臺的序號*/u_int max_xres;/*屏幕能顯示的最大行分辨率 */u_int max_yres;/* 屏幕能顯示

22、的最大列分辨率 */struct s3c2440fb_lcd_reg reg;/*S3C2440A LCD控制存放器 */* 其他與LCD硬件有關的參數 */;結構體fb_ops中的成員函數流程相似,本文在此僅給出函數s3c2440fb_set_var()的流程圖和程序代碼。函數s3c2440fb_set_var()流程圖如圖6所示:圖6 函數s3c2440fb_set_var()流程圖函數s3c2440fb_set_var()程序如下:static int s3c2440fb_set_var(struct fb_var_screeninfo *var,int con,struct fb_in

23、fo *info)struct s3c2440fb_info *fbi= (struct s3c2440fb_info *)info; /* 將顯示模式讀入結構體s3c2440fb_info*/struct fb_var_screeninfo *dvar= get_con_var(&fbi-fb,con);int err;err= s3c2440fb_validate_var(var,fbi); /* 顯示模式是否有效 */if(err) /* 無效返回 */return err;dvar-red=fbi-rgbrgbidx-red; /* 將顯示參數寫入結構體fb_var_screeninf

24、o */dvar-green=fbi-rgbrgbidx-green;dvar-blue=fbi-rgbrgbidx-bIue;dvar-transp=fbi-rgbrgbidx-transp;display-var= *dvar;s3c2440fb_hw_set_var (dvar,fbi); /* 設置RGB顏色信息,設置S3C2440A的LCD控制存放器 */return 0;3.3 編寫初始化函數 初始化函數首先初始化LCD控制器和結構體s3c2440fb_info,填充s3c2440fb_info中結構變量fb_info的成員變量,這些成員變量的參數值由LCD顯示器廠商的手冊獲得。然

25、后通過consistent_alloc函數分配一片連續的空間。顯示系統采用的LCD顯示方式為320240,16位彩色。需要分配的顯示緩沖區為32024016/8=150k字節,緩沖區通常分配在片外SDRAM 中,起始地址和末地址保存在LCD控制器存放器LCDSADDR1和LCDSADDR2里,最后調用register_framebuffer(&fbi-fb)將fb_info結構變量fb登記入內核。初始化函數如下:int _init s3c2440fb_init(void)(struct s3c2440fb_info *fbi;int ret;fbi=s3c2440fb_init_fbinfo(

26、); /* 初始化LCD控制器和s3c2440fb_info */ret=s3c2440fb_map_video_memory (fbi); /*分配150K字節大小的LCD顯示緩沖區 */if(ret) /* 出錯返回 */if(fbi)kfree(fbi);return ret;s3c2440fb_set_var (&fbi-fb.var,-1,&fbi-fb);ret=register_framebuffer(&fbi-fb);/* 將fb注冊到內核 */if(ret) /* 出錯返回 */if(fbi)kfree(fbi);return ret;printk (Installed S3

27、C2440 frame bufferkn);/*在控制臺顯示安裝顯示驅動程序成功 */MOD_INC_USE_COUNT;/* 該宏用來管理自己被使用的計數,模塊在被使用時,是不允許被卸載的 */return 0;4 驅動(q dn)程序嵌入(qin r)到內核 驅動程序嵌入到內核有兩種方式(fngsh):一種是直接編譯入內核,隨Linux啟動(qdng)的時候加載;另一種(y zhn)是編譯成模塊,動態加載。如果要將其直接編譯入Linux內核,那么需要將源代碼文件拷貝到Linux內核源代碼的相應路徑里,并修改Makefile文件和config.in文件,這種方法會增加內核的大小,而且不能動態

28、卸載,不利于調試,所以目前一般推薦采用第二種方式,如果這樣,在本驅動程序的最后還需要加上宏module_init(s3c2440fb_init);這是告訴編譯器該驅動程序的入口地址為初始化函數s3c2440fb_init()。需要注意的是初始化函數必須在宏module_init(s3c2440fb_init)使用前定義,否那么會出現編譯錯誤。而且在編譯時至少要加上-D_KERNEL_ -DMODULE -DLINUX這幾個參數,編譯完成后通過insmod命令將驅動模塊加載進內核, 通過rmmod命令卸載驅動模塊。5 應用程序對幀緩沖設備的使用 Linux將所有的設備都當作文件進行處理,各種設備通常以文件的形式放在/dev目錄下。幀緩沖設備和其它位于/dev目錄下面的設備類似,其驅動程序的設備文件一般是/dev/fb0、/dev/fb1等等。在應用程序中,操作/dev/fb的一般流程如圖7所示:圖7 應用程序對幀緩沖設備的操作流程其典型應用程序如下:Main()int fbfd=O;struct fb_var_screeninfo vinf

溫馨提示

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

評論

0/150

提交評論