Linux液晶屏驅(qū)動開發(fā)
發(fā)布時間:2008/8/20 0:00:00 訪問次數(shù):495
在多媒體應(yīng)用的推動下,彩色lcd越來越多地應(yīng)用到了嵌入式系統(tǒng)中 如新一代手機(jī)和掌上電腦多采用tft顯示器件,該顯示器件支持彩色圖形界面和視頻媒體播放。linux作為開放源代碼的操作系統(tǒng)也在市場中占據(jù)了一席之地。由于linux成本低廉,源代碼開放,因此成為國內(nèi)外廠商極力發(fā)展的操作系統(tǒng)。在應(yīng)用需求的推動下,linux下也出現(xiàn)了許多圖形界面軟件包,如minigui、trolletech公司的embedded qt等,其圖形界面及開發(fā)工具與windows ce不相上下。在圖形軟件包的開發(fā)和移植工作中都牽涉到底層lcd的驅(qū)動問題。筆者有幸參與了linux操作系統(tǒng)下lcd部分的開發(fā),其主要功能是點亮液晶屏,將在攝像頭上采集的bmp圖片在液晶屏上顯示并將bmp 格式壓縮成jpeg格式,使得存儲量減少。因此筆者就在開發(fā)過程中遇到的問題一一闡述。
背景知識
在切入正題之前,先來了解在做驅(qū)動過程中需要預(yù)先知道的知識。
1 硬件平臺
mc9328mx1(以下簡稱mx1)是motorola 公司基于arm核心的第一款mcu,主要面向高端嵌入式應(yīng)用。內(nèi)部采用arm920t內(nèi)核,并集成了sdram/flash、lcd,usb、藍(lán)牙.多媒體閃存卡(mmc/sd、memory stick)和cmos攝像頭等控制器。
lcd控制器的功能是產(chǎn)生顯示驅(qū)動信號,驅(qū)動lcd顯示器。用戶只需要通過讀寫一系列的寄存器,完成配制和顯示控制。mx1中的lcd控制器可支持單色/彩色lcd 顯示器。支持彩色tft時,可提供4/8/12/16位顏色模式,其中16位顏色模式下可以顯示64k種顏色。配置lcd控制器重要的一步是指定顯示緩沖區(qū),顯示的內(nèi)容就是從緩沖區(qū)中讀出的,其大小由屏幕分辨率和顯示顏色數(shù)決定。在本例中,采用kyocera 公司的kcs057qv1aj液晶屏,在240×320分辨率下可提供8位彩色顯示,即最大256色位圖。
2.linux下的設(shè)備驅(qū)動
在linux操作系統(tǒng)下有兩類主要的設(shè)備文件類型,一種是字符設(shè)備,另一種是塊設(shè)備。字符設(shè)備和塊設(shè)備的主要區(qū)別是在對字符設(shè)備發(fā)出讀/寫請求時,實際的硬件i/o一般就緊接著發(fā)生了,塊設(shè)備則不然,它利用一塊系統(tǒng)內(nèi)存作緩沖區(qū),當(dāng)用戶進(jìn)程對設(shè)備請求讀/寫時,它首先察看緩沖區(qū)的內(nèi)容,如果緩沖區(qū)的數(shù)據(jù)能滿足用戶的要求,就返回請求的數(shù)據(jù),如果不能,就調(diào)用請求函數(shù)來進(jìn)行實際的i/o操作。
linux的設(shè)備管理是和文件系統(tǒng)解密結(jié)合的,各種設(shè)備都以文件的形式存放在/dev目錄下,稱為設(shè)備文件。應(yīng)用程序可以打開、關(guān)閉和讀寫這些設(shè)備文件,完成對設(shè)備的操作,就像操作普通的數(shù)據(jù)文件一樣。為了管理這些設(shè)備,系統(tǒng)為設(shè)備編了號,每個設(shè)備號又分為主設(shè)備號和次設(shè)備號。主設(shè)備號用來區(qū)分不同種類的設(shè)備,而次設(shè)備號標(biāo)識使用同一個設(shè)備驅(qū)動程序的不同的硬件設(shè)備,比如有兩個軟盤,就可以用從設(shè)備號來區(qū)分它們。設(shè)備文件的主設(shè)備號必須與設(shè)備驅(qū)動程序在登記時申請的主設(shè)備號一致,否則用戶進(jìn)程將無法訪問到驅(qū)動程序。幀緩沖設(shè)備為標(biāo)準(zhǔn)字符設(shè)備,主設(shè)備號為29,次設(shè)備號則從0到31。
3.linux的幀緩沖設(shè)備
幀緩沖區(qū)是出現(xiàn)在linux 2.2.xx及以后版本內(nèi)核當(dāng)中的一種驅(qū)動程序接口,這種接口將顯示設(shè)備抽象為幀緩沖區(qū)設(shè)備區(qū)。它允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進(jìn)行讀寫操作。這種操作是抽象的、統(tǒng)一的,用戶不必關(guān)心物理顯存的位置、換頁機(jī)制等具體細(xì)節(jié)。這些都由framebufer設(shè)備驅(qū)動來完成。幀緩沖設(shè)備對應(yīng)的設(shè)備文件為/dev/fb*,如果系統(tǒng)有多個顯示卡,linux下還可支持多個幀緩沖設(shè)備,最多可達(dá)32個,分別為/dev/fb0到/dev/fb31,而/dev/fb則為當(dāng)前缺省的幀緩沖設(shè)備,通常指向/dev/fb0。當(dāng)然在嵌入式系統(tǒng)中支持一個顯示設(shè)備就夠了。在使用framebufer時,linux是將顯卡置于圖形模式下的.在應(yīng)用程序中,一般通過將frame-buffer設(shè)備映射到進(jìn)程地址空間的方式使用,對于幀緩沖來說,可以把它看成是一段內(nèi)存,用于讀寫內(nèi)存的函數(shù)均可對這段地址進(jìn)行讀寫,只不過這段內(nèi)存被專門用于放置要在lcd上顯示的內(nèi)容,其目的就是通過配置lcdc寄存器在一段指定內(nèi)存與lcd 之間建立一個自動傳輸?shù)耐ǖ。這樣,任何程序只要修改這段內(nèi)存中的數(shù)據(jù),就可以改變lcd 上的顯示內(nèi)容。
framebuffer設(shè)備驅(qū)動基于linux/include/linux/fb.h和linux/drivers/video/fbmem.c這兩個文件,下面就詳細(xì)分析這兩個文件。
首先分析linux/include/linux/fb.h文件,幾乎主要的結(jié)構(gòu)都是在這個文件中定義的。這些結(jié)構(gòu)包括:
◆ fb_var_screeninfo 這個結(jié)構(gòu)描述了顯示卡的特性,記錄了幀緩沖設(shè)備和指定顯示模式的可修改信息。其中變量xres定義了屏幕一行所占的像素數(shù),yres定義了屏幕一列所占的像素數(shù),bits_per_pixel定義了每個像素用多少個位來表示。
◆ fb_fix_screen
在多媒體應(yīng)用的推動下,彩色lcd越來越多地應(yīng)用到了嵌入式系統(tǒng)中 如新一代手機(jī)和掌上電腦多采用tft顯示器件,該顯示器件支持彩色圖形界面和視頻媒體播放。linux作為開放源代碼的操作系統(tǒng)也在市場中占據(jù)了一席之地。由于linux成本低廉,源代碼開放,因此成為國內(nèi)外廠商極力發(fā)展的操作系統(tǒng)。在應(yīng)用需求的推動下,linux下也出現(xiàn)了許多圖形界面軟件包,如minigui、trolletech公司的embedded qt等,其圖形界面及開發(fā)工具與windows ce不相上下。在圖形軟件包的開發(fā)和移植工作中都牽涉到底層lcd的驅(qū)動問題。筆者有幸參與了linux操作系統(tǒng)下lcd部分的開發(fā),其主要功能是點亮液晶屏,將在攝像頭上采集的bmp圖片在液晶屏上顯示并將bmp 格式壓縮成jpeg格式,使得存儲量減少。因此筆者就在開發(fā)過程中遇到的問題一一闡述。
背景知識
在切入正題之前,先來了解在做驅(qū)動過程中需要預(yù)先知道的知識。
1 硬件平臺
mc9328mx1(以下簡稱mx1)是motorola 公司基于arm核心的第一款mcu,主要面向高端嵌入式應(yīng)用。內(nèi)部采用arm920t內(nèi)核,并集成了sdram/flash、lcd,usb、藍(lán)牙.多媒體閃存卡(mmc/sd、memory stick)和cmos攝像頭等控制器。
lcd控制器的功能是產(chǎn)生顯示驅(qū)動信號,驅(qū)動lcd顯示器。用戶只需要通過讀寫一系列的寄存器,完成配制和顯示控制。mx1中的lcd控制器可支持單色/彩色lcd 顯示器。支持彩色tft時,可提供4/8/12/16位顏色模式,其中16位顏色模式下可以顯示64k種顏色。配置lcd控制器重要的一步是指定顯示緩沖區(qū),顯示的內(nèi)容就是從緩沖區(qū)中讀出的,其大小由屏幕分辨率和顯示顏色數(shù)決定。在本例中,采用kyocera 公司的kcs057qv1aj液晶屏,在240×320分辨率下可提供8位彩色顯示,即最大256色位圖。
2.linux下的設(shè)備驅(qū)動
在linux操作系統(tǒng)下有兩類主要的設(shè)備文件類型,一種是字符設(shè)備,另一種是塊設(shè)備。字符設(shè)備和塊設(shè)備的主要區(qū)別是在對字符設(shè)備發(fā)出讀/寫請求時,實際的硬件i/o一般就緊接著發(fā)生了,塊設(shè)備則不然,它利用一塊系統(tǒng)內(nèi)存作緩沖區(qū),當(dāng)用戶進(jìn)程對設(shè)備請求讀/寫時,它首先察看緩沖區(qū)的內(nèi)容,如果緩沖區(qū)的數(shù)據(jù)能滿足用戶的要求,就返回請求的數(shù)據(jù),如果不能,就調(diào)用請求函數(shù)來進(jìn)行實際的i/o操作。
linux的設(shè)備管理是和文件系統(tǒng)解密結(jié)合的,各種設(shè)備都以文件的形式存放在/dev目錄下,稱為設(shè)備文件。應(yīng)用程序可以打開、關(guān)閉和讀寫這些設(shè)備文件,完成對設(shè)備的操作,就像操作普通的數(shù)據(jù)文件一樣。為了管理這些設(shè)備,系統(tǒng)為設(shè)備編了號,每個設(shè)備號又分為主設(shè)備號和次設(shè)備號。主設(shè)備號用來區(qū)分不同種類的設(shè)備,而次設(shè)備號標(biāo)識使用同一個設(shè)備驅(qū)動程序的不同的硬件設(shè)備,比如有兩個軟盤,就可以用從設(shè)備號來區(qū)分它們。設(shè)備文件的主設(shè)備號必須與設(shè)備驅(qū)動程序在登記時申請的主設(shè)備號一致,否則用戶進(jìn)程將無法訪問到驅(qū)動程序。幀緩沖設(shè)備為標(biāo)準(zhǔn)字符設(shè)備,主設(shè)備號為29,次設(shè)備號則從0到31。
3.linux的幀緩沖設(shè)備
幀緩沖區(qū)是出現(xiàn)在linux 2.2.xx及以后版本內(nèi)核當(dāng)中的一種驅(qū)動程序接口,這種接口將顯示設(shè)備抽象為幀緩沖區(qū)設(shè)備區(qū)。它允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進(jìn)行讀寫操作。這種操作是抽象的、統(tǒng)一的,用戶不必關(guān)心物理顯存的位置、換頁機(jī)制等具體細(xì)節(jié)。這些都由framebufer設(shè)備驅(qū)動來完成。幀緩沖設(shè)備對應(yīng)的設(shè)備文件為/dev/fb*,如果系統(tǒng)有多個顯示卡,linux下還可支持多個幀緩沖設(shè)備,最多可達(dá)32個,分別為/dev/fb0到/dev/fb31,而/dev/fb則為當(dāng)前缺省的幀緩沖設(shè)備,通常指向/dev/fb0。當(dāng)然在嵌入式系統(tǒng)中支持一個顯示設(shè)備就夠了。在使用framebufer時,linux是將顯卡置于圖形模式下的.在應(yīng)用程序中,一般通過將frame-buffer設(shè)備映射到進(jìn)程地址空間的方式使用,對于幀緩沖來說,可以把它看成是一段內(nèi)存,用于讀寫內(nèi)存的函數(shù)均可對這段地址進(jìn)行讀寫,只不過這段內(nèi)存被專門用于放置要在lcd上顯示的內(nèi)容,其目的就是通過配置lcdc寄存器在一段指定內(nèi)存與lcd 之間建立一個自動傳輸?shù)耐ǖ。這樣,任何程序只要修改這段內(nèi)存中的數(shù)據(jù),就可以改變lcd 上的顯示內(nèi)容。
framebuffer設(shè)備驅(qū)動基于linux/include/linux/fb.h和linux/drivers/video/fbmem.c這兩個文件,下面就詳細(xì)分析這兩個文件。
首先分析linux/include/linux/fb.h文件,幾乎主要的結(jié)構(gòu)都是在這個文件中定義的。這些結(jié)構(gòu)包括:
◆ fb_var_screeninfo 這個結(jié)構(gòu)描述了顯示卡的特性,記錄了幀緩沖設(shè)備和指定顯示模式的可修改信息。其中變量xres定義了屏幕一行所占的像素數(shù),yres定義了屏幕一列所占的像素數(shù),bits_per_pixel定義了每個像素用多少個位來表示。
◆ fb_fix_screen
熱門點擊
- 存儲器的地址線(Address Line)數(shù)
- 一套數(shù)字音頻采集、播放和傳輸系統(tǒng)的實現(xiàn)
- 1-Wire總線與DS18B20應(yīng)用仿真
- 在嵌入式系統(tǒng)中應(yīng)用NAND Flash閃存作
- 韋爾推出用于超高速接口的靜電保護(hù)芯片ESDA
- 基于μPD780822型單片機(jī)的客車CAN總
- 基于USB的ARINC429總線接口模塊設(shè)計
- 賽普拉斯2Mb/8Mb nvSRAM無需電池
- ST7267單片機(jī)與SIM卡的接口設(shè)計
- 基于鐵電存儲器FM25640在電表數(shù)據(jù)存儲中
推薦技術(shù)資料
- 100A全集成電源模塊R
- Teseo-VIC6A GNSS車用精準(zhǔn)定位
- 高效先進(jìn)封裝工藝
- 模數(shù)轉(zhuǎn)換器 (Analog-to-Digit
- 集成模數(shù)轉(zhuǎn)換器(ADC)
- 128 通道20 位電流數(shù)字轉(zhuǎn)換器̴
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究