Linux液晶屏驅動(dòng)開(kāi)發(fā)
隨著(zhù)高性能嵌入式處理器的普及和硬件成本的不斷降低,尤其是ARM 系列處理器的推出,嵌入式系統的功能越來(lái)越強。單色LCD也因為色彩單調,存儲信息小,處理速度慢而不能符合人們的需求。
本文引用地址:http://dyxdggzs.com/article/84078.htm在多媒體應用的推動(dòng)下,彩色LCD越來(lái)越多地應用到了嵌入式系統中 如新一代手機和掌上電腦多采用TFT顯示器件,該顯示器件支持彩色圖形界面和視頻媒體播放。Linux作為開(kāi)放源代碼的操作系統也在市場(chǎng)中占據了一席之地。由于Linux成本低廉,源代碼開(kāi)放,因此成為國內外廠(chǎng)商極力發(fā)展的操作系統。在應用需求的推動(dòng)下,Linux下也出現了許多圖形界面軟件包,如MiniGUI、Trolletech公司的Embedded QT等,其圖形界面及開(kāi)發(fā)工具與Windows CE不相上下。在圖形軟件包的開(kāi)發(fā)和移植工作中都牽涉到底層LCD的驅動(dòng)問(wèn)題。筆者有幸參與了Linux操作系統下LCD部分的開(kāi)發(fā),其主要功能是點(diǎn)亮液晶屏,將在攝像頭上采集的BMP圖片在液晶屏上顯示并將BMP 格式壓縮成JPEG格式,使得存儲量減少。因此筆者就在開(kāi)發(fā)過(guò)程中遇到的問(wèn)題一一闡述。
背景知識
在切入正題之前,先來(lái)了解在做驅動(dòng)過(guò)程中需要預先知道的知識。
1 硬件平臺
MC9328MX1(以下簡(jiǎn)稱(chēng)MX1)是Motorola 公司基于A(yíng)RM核心的第一款MCU,主要面向高端嵌入式應用。內部采用ARM920T內核,并集成了SDRAM/Flash、LCD,USB、藍牙.多媒體閃存卡(MMC/SD、Memory Stick)和CMOS攝像頭等控制器。
LCD控制器的功能是產(chǎn)生顯示驅動(dòng)信號,驅動(dòng)LCD顯示器。用戶(hù)只需要通過(guò)讀寫(xiě)一系列的寄存器,完成配制和顯示控制。MX1中的LCD控制器可支持單色/彩色LCD 顯示器。支持彩色TFT時(shí),可提供4/8/12/16位顏色模式,其中16位顏色模式下可以顯示64k種顏色。配置LCD控制器重要的一步是指定顯示緩沖區,顯示的內容就是從緩沖區中讀出的,其大小由屏幕分辨率和顯示顏色數決定。在本例中,采用KYocera 公司的KCS057QV1AJ液晶屏,在240×320分辨率下可提供8位彩色顯示,即最大256色位圖。
2.Linux下的設備驅動(dòng)
在Linux操作系統下有兩類(lèi)主要的設備文件類(lèi)型,一種是字符設備,另一種是塊設備。字符設備和塊設備的主要區別是在對字符設備發(fā)出讀/寫(xiě)請求時(shí),實(shí)際的硬件I/O一般就緊接著(zhù)發(fā)生了,塊設備則不然,它利用一塊系統內存作緩沖區,當用戶(hù)進(jìn)程對設備請求讀/寫(xiě)時(shí),它首先察看緩沖區的內容,如果緩沖區的數據能滿(mǎn)足用戶(hù)的要求,就返回請求的數據,如果不能,就調用請求函數來(lái)進(jìn)行實(shí)際的I/O操作。
Linux的設備管理是和文件系統解密結合的,各種設備都以文件的形式存放在/dev目錄下,稱(chēng)為設備文件。應用程序可以打開(kāi)、關(guān)閉和讀寫(xiě)這些設備文件,完成對設備的操作,就像操作普通的數據文件一樣。為了管理這些設備,系統為設備編了號,每個(gè)設備號又分為主設備號和次設備號。主設備號用來(lái)區分不同種類(lèi)的設備,而次設備號標識使用同一個(gè)設備驅動(dòng)程序的不同的硬件設備,比如有兩個(gè)軟盤(pán),就可以用從設備號來(lái)區分它們。設備文件的主設備號必須與設備驅動(dòng)程序在登記時(shí)申請的主設備號一致,否則用戶(hù)進(jìn)程將無(wú)法訪(fǎng)問(wèn)到驅動(dòng)程序。幀緩沖設備為標準字符設備,主設備號為29,次設備號則從0到31。
3.Linux的幀緩沖設備
幀緩沖區是出現在Linux 2.2.xx及以后版本內核當中的一種驅動(dòng)程序接口,這種接口將顯示設備抽象為幀緩沖區設備區。它允許上層應用程序在圖形模式下直接對顯示緩沖區進(jìn)行讀寫(xiě)操作。這種操作是抽象的、統一的,用戶(hù)不必關(guān)心物理顯存的位置、換頁(yè)機制等具體細節。這些都由Framebufer設備驅動(dòng)來(lái)完成。幀緩沖設備對應的設備文件為/dev/fb*,如果系統有多個(gè)顯示卡,Linux下還可支持多個(gè)幀緩沖設備,最多可達32個(gè),分別為/dev/fb0到/dev/fb31,而/dev/fb則為當前缺省的幀緩沖設備,通常指向/dev/fb0。當然在嵌入式系統中支持一個(gè)顯示設備就夠了。在使用Framebufer時(shí),Linux是將顯卡置于圖形模式下的.在應用程序中,一般通過(guò)將Frame-Buffer設備映射到進(jìn)程地址空間的方式使用,對于幀緩沖來(lái)說(shuō),可以把它看成是一段內存,用于讀寫(xiě)內存的函數均可對這段地址進(jìn)行讀寫(xiě),只不過(guò)這段內存被專(zhuān)門(mén)用于放置要在LCD上顯示的內容,其目的就是通過(guò)配置LCDC寄存器在一段指定內存與LCD 之間建立一個(gè)自動(dòng)傳輸的通道。這樣,任何程序只要修改這段內存中的數據,就可以改變LCD 上的顯示內容。
FrameBuffer設備驅動(dòng)基于linux/include/linux/fb.h和linux/drivers/video/fbmem.c這兩個(gè)文件,下面就詳細分析這兩個(gè)文件。
首先分析linux/include/linux/fb.h文件,幾乎主要的結構都是在這個(gè)文件中定義的。這些結構包括:
fb_var_screeninfo 這個(gè)結構描述了顯示卡的特性,記錄了幀緩沖設備和指定顯示模式的可修改信息。其中變量xres定義了屏幕一行所占的像素數,yres定義了屏幕一列所占的像素數,bits_per_pixel定義了每個(gè)像素用多少個(gè)位來(lái)表示。
fb_fix_screeninfon 這個(gè)結構在顯卡被設定模式后創(chuàng )建,它描述顯示卡的屬性,并且系統運行時(shí)不能被修改;比如FrameBuffer內存的起始地址。
struct fb_info Linux為幀緩沖設備定義的驅動(dòng)層接口。它不僅包含了底層函數,而且還有記錄設備狀態(tài)的數據。每個(gè)幀緩沖設備都與一個(gè)fb_info結構相對應。其中成員變量modename為設備名稱(chēng),fontname為顯示字體,fbops為指向底層操作的函數的指針。
fb_cmap描述設備無(wú)關(guān)的顏色映射信息??梢酝ㄟ^(guò)FBIOGETCMAP 和FBIOPUTCMAP 對應的ioctl操作設定或獲取顏色映射信息。然后分析fbmem.h文件。
評論