在Linux下驅動(dòng)STN彩色LCD
伴隨著(zhù)高性能嵌入式處理器的飛速發(fā)展與普及,特別是ARM處理器系列的出現,嵌入式系統的功能也變得越來(lái)越強大。以前的單色LCD已不能滿(mǎn)足現今的各種多媒體應用,彩色LCD被越來(lái)越多地應用到嵌入式系統中。同時(shí),在應用需求的促使下,許多工作在Linux下的圖形界面軟件包的開(kāi)發(fā)和移植工作中都涉及到底層LCD驅動(dòng)的開(kāi)發(fā)問(wèn)題。 在硬件采用Intel ASSABET開(kāi)發(fā)板,軟件采用Linux 2.4.19平臺,編譯器為arm-linux-gcc的交叉編譯器作為開(kāi)發(fā)的前提下,因為ASSABET開(kāi)發(fā)板上使用的是Sharp 3.9英寸320240 TFT彩色LCD,現改用Kyocera 7.7英寸640480 STN型彩色LCD,所以通過(guò)對其Linux驅動(dòng)程序進(jìn)行改寫(xiě)和調試,成功地實(shí)現了對該種屏的驅動(dòng)和顯示。 LCD 控制器 LCD控制器的功能是顯示驅動(dòng)信號,進(jìn)而驅動(dòng)LCD顯示器。在驅動(dòng)LCD設計的過(guò)程中首要的是配置LCD控制器。在配置LCD控制器中最重要的一步則是幀緩沖區的指定。用戶(hù)所要顯示的內容皆是從緩沖區中讀出,從而顯示到屏幕上。幀緩沖區的大小由屏幕的分辨率和顯示色彩數決定。驅動(dòng)幀緩沖的實(shí)現是整個(gè)驅動(dòng)開(kāi)發(fā)過(guò)程的重點(diǎn)。 ASSABET開(kāi)發(fā)板采用SA1110作為處理器。SA1110微處理器是Intel公司生產(chǎn)的一種基于StrongARM環(huán)境的微處理器。該處理器內部有一LCD驅動(dòng)控制器,可支持單、雙屏顯示和最大10241024dpi。每個(gè)像素數據以4、8、12或16位編碼后存儲于外部存儲器內,通過(guò)LCD的專(zhuān)用DAM控制器,被裝入至532位的FIFO中。在雙屏顯示時(shí),兩個(gè)DMA通道分別負責上下屏幕的顯示,但只有第一個(gè)DMA通道有調色板緩沖器。幀緩沖器中的已編碼像素數據是作為指針指向25612位的調色板。調色板的色調數據控制著(zhù)抖動(dòng)邏輯,以產(chǎn)生各種灰度和彩色信號并從LCD數據引腳輸出。 顯示屏 LCD選擇Kyocera公司的7.7英寸STN型LCD。該LCD可在640480分辨率的情況下提供12位彩色顯示。該屏為雙屏掃描模式,具有兩個(gè)8位的數據通道,每種基色都由4位的抖動(dòng)邏輯來(lái)產(chǎn)生15級灰度,因此可以顯示最多153=3375種可能的顏色。 驅動(dòng)LCD的設計 幀緩沖設備 幀緩沖設備為圖像硬件設備提供了一種抽象化處理。它代表了一些視頻硬件設備,允許應用軟件通過(guò)定義明確的界面來(lái)訪(fǎng)問(wèn)圖像硬件設備。這樣軟件無(wú)需了解任何涉及硬件底層驅動(dòng)的東西(如硬件寄存器)。它允許上層應用程序在圖形模式下直接對顯示緩沖區進(jìn)行讀寫(xiě)和I/O控制等操作。通過(guò)專(zhuān)門(mén)的設備節點(diǎn)可對該設備進(jìn)行訪(fǎng)問(wèn),如/dev/fb*。 Linux下可支持多個(gè)幀緩沖設備,最多可達32個(gè),即從/dev/fb0到/dev/fb31。通常情況下,缺省的幀緩沖設備為/dev/fb0。 在SA1110處理器的LCD控制器操作中,幀緩沖器用于存放全部屏幕的所有編碼像素數據。在它的最低位地址處是32或512字節的緩沖器,用來(lái)存放調色板數據表。32位緩沖器用于4、12或16位像素編碼的16項調色板;512字節緩沖器用于裝入8位像素編碼的256項調色板。在12或16位像素編碼時(shí),不使用調色板,此時(shí)的幀緩沖器的起始32字節必須填入全零。 主要結構體 struct fb_fix_screeninfo中記錄了幀緩沖設備和指定顯示模式的不可修改信息。它包含了屏幕緩沖區的物理地址和長(cháng)度。 struct fb_var_screeninfo中記錄了幀緩沖設備和指定顯示模式的可修改信息。它包括顯示屏幕的分辨率、每個(gè)像素的比特數和一些時(shí)序變量。其中變量xres定義了屏幕一行所占的像素數,yres定義了屏幕一列所占的像素數,bits_per_pixel定義了每個(gè)像素用多少個(gè)位來(lái)表示。 struct fb_info是Linux為幀緩沖設備定義的驅動(dòng)層接口。它不僅包含了底層函數,而且還有記錄設備狀態(tài)的數據。每個(gè)幀緩沖設備都與一fb_info結構相對應。其中成員變量modename為設備名稱(chēng),fontname為顯示字體,fbops為指向底層操作的函數的指針。 Linux內核配置與編譯 使用下面的命令啟動(dòng)Linux內核配置工具: #make menuconfig 啟動(dòng)如下內核選項,選擇對應的選項之后,執行下面的命令:
驅動(dòng)幀緩沖的設計 幀緩沖設備屬于字符設備,采用了“文件層-驅動(dòng)層”的接口方式。Linux為幀緩沖設備定義的驅動(dòng)層接口為struct fb_info結構。在文件層次上,Linux為其定義了下面的操作函數:
應用程序層對幀緩沖設備的訪(fǎng)問(wèn)同對文件的訪(fǎng)問(wèn)操作類(lèi)似。在應用程序中,對幀緩沖設備(dev/fb)的操作只需調用文件層的操作函數。首先打開(kāi)/dev/fb設備文件;隨后用ioctl操作取得屏幕的分辨率和bpp值,從而計算出屏幕緩沖區的大小,并將屏幕的緩沖區映射到用戶(hù)空間;最后就可直接對屏幕緩沖區進(jìn)行圖片顯示。 嵌入式Linux操作系統對幀緩沖的初始化入口在fbmem.c中的如下定義:
通過(guò)該入口可進(jìn)入幀緩沖的初始化函數。下面是對整個(gè)幀緩沖的實(shí)現過(guò)程。 首先,根據所選擇的STN型LCD先初始化顯示屏幕的分辨率(640480)、每個(gè)像素的比特數(實(shí)際所選的LCD為12bpp,但在設計中可作為16bpp來(lái)設計。這是因SA1110的LCD控制器對兩者處理方式相同而只有色彩深度的比例不同的緣故)和各種時(shí)序值。隨后這些值將會(huì )被寫(xiě)入LCD控制器的控制寄存器LCCR0到LCCR3內,即完成對LCD控制器內一部分寄存器的配置。特殊的一點(diǎn),因為所選的LCD是12bpp顯示,所以rgbt色彩的深度比值應為4:4:4:0。 其次對LCD進(jìn)行顯示緩沖區的分配。該過(guò)程由kmalloc函數實(shí)現動(dòng)態(tài)分配一片連續的空間,需要分配的緩沖區大小為600K字節。緩沖區是在SDRAM中分配大容量的地址,存儲器映射至SA1110內,其中上半屏起始地址保存到LCD控制器的寄存器DBAR1中,下半屏起始地址保存到DBAR2中。在此完全初始化一個(gè)fb_info結構,填充其中的各成員變量。之后進(jìn)行中斷處理請求和各種變量和調色板等的設置。然后注冊驅動(dòng)程序,通過(guò)調用register_framebuffer(fb_info)實(shí)現將fb_info登記入內核。最后,啟動(dòng)GPIO9~2和LCD控制器。 效果 因為該設計將驅動(dòng)作為內核的一部分,而不是模塊加載的方式,所以需重新編譯內核,并將新編譯的Linux內核下載到開(kāi)發(fā)板內。重新啟動(dòng)系統后,通過(guò)應用程序檢測,可以使屏幕顯示任意所需圖片,表明了驅動(dòng)LCD顯示的設計已成功實(shí)現。 在對嵌入式Linux系統進(jìn)行驅動(dòng)LCD的開(kāi)發(fā)時(shí),不僅涉及到對開(kāi)發(fā)板的了解(特別是微處理器和外圍接口),還要求熟練配置Linux內核、掌握Linux的整個(gè)系統啟動(dòng)過(guò)程和Linux下開(kāi)發(fā)設備驅動(dòng)程序過(guò)程,同時(shí)開(kāi)發(fā)人員還需掌握所開(kāi)發(fā)的LCD技術(shù)資料。本文具體的介紹驅動(dòng)LCD過(guò)程中驅動(dòng)幀緩沖的設計。該設計的實(shí)現使得此LCD可應用在嵌入式開(kāi)發(fā)的多種領(lǐng)域,因此具有實(shí)用價(jià)值 |
評論