国产在线导航,欧美日本中文,黄色在线观看网站永久免费乱码,chinese国产在线视频,亚洲欧洲第一视频,天天做人人爱夜夜爽2020毛片,亚洲欧美中文字幕在线网站

現(xiàn)在位置:范文先生網(wǎng)>理工論文>電子通信論文>在Linux下驅(qū)動(dòng)STN彩色LCD

在Linux下驅(qū)動(dòng)STN彩色LCD

時(shí)間:2023-02-21 00:11:51 電子通信論文 我要投稿
  • 相關(guān)推薦

在Linux下驅(qū)動(dòng)STN彩色LCD

   伴隨著高性能嵌入式處理器的飛速發(fā)展與普及,特別是ARM處理器系列的出現(xiàn),嵌入式系統(tǒng)的功能也變得越來越強(qiáng)大。以前的單色LCD已不能滿足現(xiàn)今的各種多媒體應(yīng)用,彩色LCD被越來越多地應(yīng)用到嵌入式系統(tǒng)中。同時(shí),在應(yīng)用需求的促使下,許多工作在Linux下的圖形界面軟件包的開發(fā)和移植工作中都涉及到底層LCD驅(qū)動(dòng)的開發(fā)問題。

    在硬件采用Intel ASSABET開發(fā)板,軟件采用Linux 2.4.19平臺(tái),編譯器為arm-linux-gcc的交叉編譯器作為開發(fā)的前提下,因?yàn)锳SSABET開發(fā)板上使用的是Sharp 3.9英寸320×240 TFT彩色LCD,現(xiàn)改用Kyocera 7.7英寸640×480 STN型彩色LCD,所以通過對其Linux驅(qū)動(dòng)程序進(jìn)行改寫和調(diào)試,成功地實(shí)現(xiàn)了對該種屏的驅(qū)動(dòng)和顯示。

    LCD

    控制器
    LCD控制器的功能是顯示驅(qū)動(dòng)信號(hào),進(jìn)而驅(qū)動(dòng)LCD顯示器。在驅(qū)動(dòng)LCD設(shè)計(jì)的過程中首要的是配置LCD控制器。在配置LCD控制器中最重要的一步則是幀緩沖區(qū)的指定。用戶所要顯示的內(nèi)容皆是從緩沖區(qū)中讀出,從而顯示到屏幕上。幀緩沖區(qū)的大小由屏幕的分辨率和顯示色彩數(shù)決定。驅(qū)動(dòng)幀緩沖的實(shí)現(xiàn)是整個(gè)驅(qū)動(dòng)開發(fā)過程的重點(diǎn)。

    ASSABET開發(fā)板采用SA1110作為處理器。SA1110微處理器是Intel公司生產(chǎn)的一種基于StrongARM環(huán)境的微處理器。該處理器內(nèi)部有一LCD驅(qū)動(dòng)控制器,可支持單、雙屏顯示和最大1024×1024dpi。每個(gè)像素?cái)?shù)據(jù)以4、8、12或16位編碼后存儲(chǔ)于外部存儲(chǔ)器內(nèi),通過LCD的專用DAM控制器,被裝入至532位的FIFO中。在雙屏顯示時(shí),兩個(gè)DMA通道分別負(fù)責(zé)上下屏幕的顯示,但只有第一個(gè)DMA通道有調(diào)色板緩沖器。幀緩沖器中的已編碼像素?cái)?shù)據(jù)是作為指針指向256×12位的調(diào)色板。調(diào)色板的色調(diào)數(shù)據(jù)控制著抖動(dòng)邏輯,以產(chǎn)生各種灰度和彩色信號(hào)并從LCD數(shù)據(jù)引腳輸出。

    顯示屏
    LCD選擇Kyocera公司的7.7英寸STN型LCD。該LCD可在640×480分辨率的情況下提供12位彩色顯示。該屏為雙屏掃描模式,具有兩個(gè)8位的數(shù)據(jù)通道,每種基色都由4位的抖動(dòng)邏輯來產(chǎn)生15級灰度,因此可以顯示最多153=3375種可能的顏色。

    驅(qū)動(dòng)LCD的設(shè)計(jì)

    幀緩沖設(shè)備
    幀緩沖設(shè)備為圖像硬件設(shè)備提供了一種抽象化處理。它代表了一些視頻硬件設(shè)備,允許應(yīng)用軟件通過定義明確的界面來訪問圖像硬件設(shè)備。這樣軟件無需了解任何涉及硬件底層驅(qū)動(dòng)的東西(如硬件寄存器)。它允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進(jìn)行讀寫和I/O控制等操作。通過專門的設(shè)備節(jié)點(diǎn)可對該設(shè)備進(jìn)行訪問,如/dev/fb*。

    Linux下可支持多個(gè)幀緩沖設(shè)備,最多可達(dá)32個(gè),即從/dev/fb0到/dev/fb31。通常情況下,缺省的幀緩沖設(shè)備為/dev/fb0。

    在SA1110處理器的LCD控制器操作中,幀緩沖器用于存放全部屏幕的所有編碼像素?cái)?shù)據(jù)。在它的最低位地址處是32或512字節(jié)的緩沖器,用來存放調(diào)色板數(shù)據(jù)表。32位緩沖器用于4、12或16位像素編碼的16項(xiàng)調(diào)色板;512字節(jié)緩沖器用于裝入8位像素編碼的256項(xiàng)調(diào)色板。在12或16位像素編碼時(shí),不使用調(diào)色板,此時(shí)的幀緩沖器的起始32字節(jié)必須填入全零。

    主要結(jié)構(gòu)體

    struct fb_fix_screeninfo中記錄了幀緩沖設(shè)備和指定顯示模式的不可修改信息。它包含了屏幕緩沖區(qū)的物理地址和長度。

    struct fb_var_screeninfo中記錄了幀緩沖設(shè)備和指定顯示模式的可修改信息。它包括顯示屏幕的分辨率、每個(gè)像素的比特?cái)?shù)和一些時(shí)序變量。其中變量xres定義了屏幕一行所占的像素?cái)?shù),yres定義了屏幕一列所占的像素?cái)?shù),bits_per_pixel定義了每個(gè)像素用多少個(gè)位來表示。

    struct fb_info是Linux為幀緩沖設(shè)備定義的驅(qū)動(dòng)層接口。它不僅包含了底層函數(shù),而且還有記錄設(shè)備狀態(tài)的數(shù)據(jù)。每個(gè)幀緩沖設(shè)備都與一fb_info結(jié)構(gòu)相對應(yīng)。其中成員變量modename為設(shè)備名稱,fontname為顯示字體,fbops為指向底層操作的函數(shù)的指針。

    Linux內(nèi)核配置與編譯

    使用下面的命令啟動(dòng)Linux內(nèi)核配置工具:
    #make menuconfig

    啟動(dòng)如下內(nèi)核選項(xiàng),選擇對應(yīng)的選項(xiàng)之后,執(zhí)行下面的命令:

Console drivers --->



Frame-buffer support--->



[*]  Support for frame buffer devices (EXPERIMENTAL)



[*]  SA-1100 LCD support (NEW)



[*]  Advanced low level driver options (NEW)



[*]  16 bpp packed pixels support (NEW)



[*]  Select compiled-in fonts (NEW)



[*]  VGA 88 font



#make dep



#make zImage


    驅(qū)動(dòng)幀緩沖的設(shè)計(jì)
    幀緩沖設(shè)備屬于字符設(shè)備,采用了“文件層-驅(qū)動(dòng)層”的接口方式。Linux為幀緩沖設(shè)備定義的驅(qū)動(dòng)層接口為struct fb_info結(jié)構(gòu)。在文件層次上,Linux為其定義了下面的操作函數(shù):

static struct file_operations fb_fops = { 



   owner: THIS_MODULE, 



   read: fb_read,  /* 讀操作*/ 



   write: fb_write,  /* 寫操作*/ 



   ioctl: fb_ioctl,  /* 控制操作*/ 



   mmap: fb_mmap,  /* 映射操作*/ 



   open: fb_open,  /* 打開操作*/ 



   release: fb_release,  /*關(guān)閉操作*/ 



   };


    應(yīng)用程序?qū)訉彌_設(shè)備的訪問同對文件的訪問操作類似。在應(yīng)用程序中,對幀緩沖設(shè)備(dev/fb)的操作只需調(diào)用文件層的操作函數(shù)。首先打開/dev/fb設(shè)備文件;隨后用ioctl操作取得屏幕的分辨率和bpp值,從而計(jì)算出屏幕緩沖區(qū)的大小,并將屏幕的緩沖區(qū)映射到用戶空間;最后就可直接對屏幕緩沖區(qū)進(jìn)行圖片顯示。

    嵌入式Linux操作系統(tǒng)對幀緩沖的初始化入口在fbmem.c中的如下定義:

static struct {



 const char *name;



 int (*init)(void);



  int (*setup)(char*);



} fb_drivers[ ]__initdata = {



#ifdef CONFIG_FB_YOURCARD



   { "driver_name", xxxfb_init, xxxfb_setup },



#endif


    通過該入口可進(jìn)入幀緩沖的初始化函數(shù)。下面是對整個(gè)幀緩沖的實(shí)現(xiàn)過程。

    首先,根據(jù)所選擇的STN型LCD先初始化顯示屏幕的分辨率(640×480)、每個(gè)像素的比特?cái)?shù)(實(shí)際所選的LCD為12bpp,但在設(shè)計(jì)中可作為16bpp來設(shè)計(jì)。這是因SA1110的LCD控制器對兩者處理方式相同而只有色彩深度的比例不同的緣故)和各種時(shí)序值。隨后這些值將會(huì)被寫入LCD控制器的控制寄存器LCCR0到LCCR3內(nèi),即完成對LCD控制器內(nèi)一部分寄存器的配置。特殊的一點(diǎn),因?yàn)樗x的LCD是12bpp顯示,所以rgbt色彩的深度比值應(yīng)為4:4:4:0。

    其次對LCD進(jìn)行顯示緩沖區(qū)的分配。該過程由kmalloc函數(shù)實(shí)現(xiàn)動(dòng)態(tài)分配一片連續(xù)的空間,需要分配的緩沖區(qū)大小為600K字節(jié)。緩沖區(qū)是在SDRAM中分配大容量的地址,存儲(chǔ)器映射至SA1110內(nèi),其中上半屏起始地址保存到LCD控制器的寄存器DBAR1中,下半屏起始地址保存到DBAR2中。在此完全初始化一個(gè)fb_info結(jié)構(gòu),填充其中的各成員變量。之后進(jìn)行中斷處理請求和各種變量和調(diào)色板等的設(shè)置。然后注冊驅(qū)動(dòng)程序,通過調(diào)用register_framebuffer(&fb_info)實(shí)現(xiàn)將fb_info登記入內(nèi)核。最后,啟動(dòng)GPIO9~2和LCD控制器。

    效果

    因?yàn)樵撛O(shè)計(jì)將驅(qū)動(dòng)作為內(nèi)核的一部分,而不是模塊加載的方式,所以需重新編譯內(nèi)核,并將新編譯的Linux內(nèi)核下載到開發(fā)板內(nèi)。重新啟動(dòng)系統(tǒng)后,通過應(yīng)用程序檢測,可以使屏幕顯示任意所需圖片,表明了驅(qū)動(dòng)LCD顯示的設(shè)計(jì)已成功實(shí)現(xiàn)。

    在對嵌入式Linux系統(tǒng)進(jìn)行驅(qū)動(dòng)LCD的開發(fā)時(shí),不僅涉及到對開發(fā)板的了解(特別是微處理器和外圍接口),還要求熟練配置Linux內(nèi)核、掌握Linux的整個(gè)系統(tǒng)啟動(dòng)過程和Linux下開發(fā)設(shè)備驅(qū)動(dòng)程序過程,同時(shí)開發(fā)人員還需掌握所開發(fā)的LCD技術(shù)資料。本文具體的介紹驅(qū)動(dòng)LCD過程中驅(qū)動(dòng)幀緩沖的設(shè)計(jì)。該設(shè)計(jì)的實(shí)現(xiàn)使得此LCD可應(yīng)用在嵌入式開發(fā)的多種領(lǐng)域,因此具有實(shí)用價(jià)值


【在Linux下驅(qū)動(dòng)STN彩色LCD】相關(guān)文章:

STN-LCD彩屏模塊08-06

Linux系統(tǒng)下USB攝像頭驅(qū)動(dòng)開發(fā)08-06

新型LCD視頻驅(qū)動(dòng)器08-06

手機(jī)LCD背光驅(qū)動(dòng)電荷泵的選擇08-06

人機(jī)界面中的LCD控制驅(qū)動(dòng)與接口設(shè)計(jì)08-06

Linux下的GTK圖形界面編程08-06

于PCI9656設(shè)備驅(qū)動(dòng)程序的Linux2.6內(nèi)核研究08-19

嵌入式Linux系統(tǒng)下Microwindows的應(yīng)用08-06

VxWorks下PC/104-CAN驅(qū)動(dòng)程序設(shè)計(jì)08-06