男女午夜激情_www.天堂av.com_亚洲综合小说区_亚洲欧美自拍视频_成年精品_久久www免费人成—看片_激情综合五月天_久久高潮视频_最新国产成人ab网站_国产精品卡一

機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
嵌入式系統(tǒng)中LCD驅(qū)動(dòng)的實(shí)現(xiàn)原理
嵌入式系統(tǒng)中LCD驅(qū)動(dòng)的實(shí)現(xiàn)原理
 更新時(shí)間:2008-8-4 5:16:07  點(diǎn)擊數(shù):15
【字體: 字體顏色
: fb_write, /*寫(xiě)操作*/

ioct1: fb_ioct1, /*I/O操作*/

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

open: fb_open, /*打開(kāi)操作*/

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

}

 

其成員函數(shù)都在linux/driver/video/fbmem.c中定義,其中的函數(shù)對(duì)具體的硬件進(jìn)行操作,對(duì)寄存器進(jìn)行設(shè)置,對(duì)顯示緩沖進(jìn)行映射。主要結(jié)構(gòu)體還有以下幾個(gè)。

 

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

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

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

 

LCD驅(qū)動(dòng)開(kāi)發(fā)的主要工作

 

1 編寫(xiě)初始化函數(shù)

 

初始化函數(shù)首先初始化LCD控制器,通過(guò)寫(xiě)寄存器設(shè)置顯示模式和顏色數(shù),然后分配LCD顯示緩沖區(qū)。在Linux中可以用kmalloc()函數(shù)分配一段連續(xù)的空間。緩沖區(qū)大小為:點(diǎn)陣行數(shù)×點(diǎn)陣列數(shù)×用于表示一個(gè)像素的比特?cái)?shù)/8。緩沖區(qū)通常分配在大容量的片外SDRAM中,起始地址保存在LCD控制寄存器中。本文采用的LCD顯示方式為640×480,16位彩色,則需要分配的顯示緩沖區(qū)為640×480×2=600kb。最后是初始化一個(gè)fb_info結(jié)構(gòu),填充其中的成員變量,并調(diào)用register_framebuffer(&fb_info),將fb_info登記入內(nèi)核。

 

2 編寫(xiě)成員函數(shù)

 

編寫(xiě)結(jié)構(gòu)fb_info中函數(shù)指針fb_ops對(duì)應(yīng)的成員函數(shù),對(duì)于嵌入式系統(tǒng)的簡(jiǎn)單實(shí)現(xiàn),只需要下列三個(gè)函數(shù)就可以了。

struct fb_ops{

……

int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info);

int (*fb_get_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info);

int (*fb_set_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info);

……

}

Struct fb_ops在include/linux/fb.h中定義。這些函數(shù)都是用來(lái)設(shè)置/獲取fb_info結(jié)構(gòu)中的成員變量的。當(dāng)應(yīng)用程序?qū)υO(shè)備文件進(jìn)行ioctl操作時(shí)候會(huì)調(diào)用它們。對(duì)于fb_get_fix(),應(yīng)用程序傳入的是fb_fix_screeninfo結(jié)構(gòu),在函數(shù)中對(duì)其成員變量賦值,主要是smem_start(緩沖區(qū)起始地址)和smem_len(緩沖區(qū)長(zhǎng)度),最終返回給應(yīng)用程序。而fb_set_var()函數(shù)的傳入?yún)?shù)是fb_var_screeninfo,函數(shù)中需要對(duì)xres、yres和bits_per_pixel賦值。

對(duì)于/dev/fb,對(duì)顯示設(shè)備的操作主要有以下幾種。

 

● 讀/寫(xiě)(read/write)/dev/fb:相當(dāng)于讀/寫(xiě)屏幕緩沖區(qū)。

● 映射(map)操作:由于Linux工作在保護(hù)模式,每個(gè)應(yīng)用程序都有自己的虛擬地址空間,在應(yīng)用程序中是不能直接訪問(wèn)物理緩沖區(qū)地址的。為此,Linux在文件操作 file_operations結(jié)構(gòu)中提供了mmap函數(shù),可將文件的內(nèi)容映射到用戶空間。對(duì)于幀緩沖設(shè)備,則可通過(guò)映射操作,可將屏幕緩沖區(qū)的物理地址映射到用戶空間的一段虛擬地址中,之后用戶就可以通過(guò)讀寫(xiě)這段虛擬地址訪問(wèn)屏幕緩沖區(qū),在屏幕上繪圖了。

I/O控制:對(duì)于幀緩沖設(shè)備,對(duì)設(shè)備文件的ioctl操作可讀取/設(shè)置顯示設(shè)備及屏幕的參數(shù),如分辨率、顯示顏色數(shù)和屏幕大小等。ioctl的操作是由底層的驅(qū)動(dòng)程序來(lái)完成的。在應(yīng)用程序中,操作/dev/fb的一般步驟如下:打開(kāi)/dev/fb設(shè)備文件;用ioctrl操作取得當(dāng)前顯示屏幕的參數(shù),如屏幕分辨率和每個(gè)像素的比特?cái)?shù),根據(jù)屏幕參數(shù)可計(jì)算屏幕緩沖區(qū)的大小;將屏幕緩沖區(qū)映射到用戶空間;映射后即可直接讀寫(xiě)屏幕緩沖區(qū),進(jìn)行繪圖和圖片顯示了。

 

LCD模塊化驅(qū)動(dòng)

 

在對(duì)S3C2410的LCD編寫(xiě)模塊化驅(qū)動(dòng)程序時(shí),首先要從內(nèi)核中去除LCD驅(qū)動(dòng)。這里需要做一些改動(dòng),系統(tǒng)調(diào)用被加在以下文件中,需去除:/root/usr/src/arm/linux/kernel/sys.c;/root/usr/src/arm/linux/include/arm-arm下的unistd.h和lcd.h;/root/usr/src/arm/linux/arch/arm/kernel下的calls.s。

編寫(xiě)模塊化驅(qū)動(dòng)程序,有以下幾個(gè)關(guān)鍵的函數(shù)。

lcd_kernel_init(void)//當(dāng)模塊被載入時(shí)執(zhí)行

lcd_kernel_exit(void)//當(dāng)模塊被移出內(nèi)核空間時(shí)被執(zhí)行

lcd_kernel1_ioctl(struct*inode, struct*file, unsigned int cmd, unsigned longarg) //其他功能

每當(dāng)裝配設(shè)備驅(qū)動(dòng)程序時(shí),系統(tǒng)自動(dòng)調(diào)用初始化模塊lcd_kernel_init(void)。

另一個(gè)必須提供的函數(shù)是lcd_kernel_exit(void),它在模塊被卸載時(shí)調(diào)用,負(fù)責(zé)進(jìn)行設(shè)備驅(qū)動(dòng)程序的工作。

執(zhí)行insmod lcd.o命令即可將LCD驅(qū)動(dòng)添加到內(nèi)核中,執(zhí)行rmmod lcd命令即可從內(nèi)核中刪除LCD驅(qū)動(dòng)。

 

靜態(tài)加載LCD驅(qū)動(dòng)

 

將寫(xiě)好的lcd驅(qū)動(dòng)程序lcd.c放到arm/linux/drivers/char目錄下,修改arm/linux/drivers/char/config.in文件,加上一行:Bool'LCD driver support'CONFIG_LCD;修改arm/linux/drivers/char/Makefile文件,加上一行:obj-$(CONFIG_LCD)+=lcd.o。

 

這樣,當(dāng)再進(jìn)行make xconfig時(shí),就會(huì)選擇是否將LCD驅(qū)動(dòng)編譯進(jìn)內(nèi)核。同樣的辦法也可用在其他設(shè)備上。

<!--開(kāi)始插入圖片--><!----><!--結(jié)束插入圖片-->

  • 上一篇: MC33991型二相步進(jìn)電機(jī)驅(qū)動(dòng)器
  • 下一篇: 二級(jí)數(shù)據(jù)矩陣碼在飛機(jī)發(fā)動(dòng)機(jī)上的應(yīng)用
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1
    主站蜘蛛池模板: 新宁县| 长兴县| 涞源县| 沾化县| 伊宁县| 健康| 威远县| 金溪县| 洛宁县| 贡山| 乌海市| 分宜县| 江永县| 恩平市| 白玉县| 华亭县| 东丽区| 苏尼特右旗| 简阳市| 尉犁县| 荔波县| 田阳县| 建宁县| 宁武县| 略阳县| 高要市| 秀山| 耒阳市| 厦门市| 盈江县| 连云港市| 阿鲁科尔沁旗| 柏乡县| 新巴尔虎右旗| 绵阳市| 蒲城县| 仲巴县| 南宁市| 且末县| 永泰县| 丹棱县|