嵌入式課程第講嵌入式LINUX設(shè)備驅(qū)動(dòng)程序_第1頁
嵌入式課程第講嵌入式LINUX設(shè)備驅(qū)動(dòng)程序_第2頁
嵌入式課程第講嵌入式LINUX設(shè)備驅(qū)動(dòng)程序_第3頁
嵌入式課程第講嵌入式LINUX設(shè)備驅(qū)動(dòng)程序_第4頁
嵌入式課程第講嵌入式LINUX設(shè)備驅(qū)動(dòng)程序_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

嵌入式LINUX設(shè)備驅(qū)動(dòng)程序

本講主要內(nèi)容嵌入式linux設(shè)備驅(qū)動(dòng)的基本框架與實(shí)現(xiàn)數(shù)碼管顯示驅(qū)動(dòng)程序分析幀緩沖顯示驅(qū)動(dòng)實(shí)現(xiàn)方法。Linux系統(tǒng)中的設(shè)備文件Linux將所有外部設(shè)備看成是一類特殊文件,稱之為“設(shè)備文件”。如果說系統(tǒng)調(diào)用是Linux內(nèi)核和應(yīng)用程序之間的接口,那么設(shè)備驅(qū)動(dòng)程序則可以看成是Linux內(nèi)核與外部設(shè)備之間的接口。設(shè)備驅(qū)動(dòng)程序向應(yīng)用程序屏蔽了硬件在實(shí)現(xiàn)上的細(xì)節(jié),使得應(yīng)用程序可以像操作普通文件一樣來操作外部設(shè)備Linux設(shè)備驅(qū)動(dòng)在系統(tǒng)中的層次設(shè)備驅(qū)動(dòng)的作用設(shè)備驅(qū)動(dòng)是位于應(yīng)用和物理設(shè)備之間的軟件層,負(fù)責(zé)完成二者間的I/O操作;在LINUX系統(tǒng)里,對用戶程序,設(shè)備驅(qū)動(dòng)隱藏了設(shè)備的具體細(xì)節(jié),為不同設(shè)備提供了一致的接口;設(shè)備驅(qū)動(dòng)是嵌入式系統(tǒng)開發(fā)的重要內(nèi)容之一設(shè)備驅(qū)動(dòng)完成的主要功能對設(shè)備的初始化和釋放;將數(shù)據(jù)從內(nèi)核傳遞到硬件設(shè)備,以及從硬件讀取數(shù)據(jù);讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù),并回送應(yīng)用程序請求的數(shù)據(jù)。這需要在用戶空間、內(nèi)核空間、總線以及外設(shè)之間傳輸數(shù)據(jù);檢查和處理設(shè)備出現(xiàn)的錯(cuò)誤。設(shè)備驅(qū)動(dòng)的分類Linux支持3種不同類型的設(shè)備字符設(shè)備塊設(shè)備網(wǎng)絡(luò)接口字符設(shè)備能夠像字節(jié)流一樣被訪問的設(shè)備,一般不需要緩存技術(shù),也不支持隨機(jī)訪問。典型的字符設(shè)備有:鼠標(biāo)、鍵盤、I/O設(shè)備等。設(shè)備驅(qū)動(dòng)的分類塊設(shè)備支持面向塊訪問的設(shè)備,每塊包含2的N次冪字節(jié)數(shù)據(jù),典型的塊大小為512或1024B;大多數(shù)塊設(shè)備允許隨機(jī)訪問,而且常常采用buffer、cache等緩存技術(shù);塊設(shè)備的訪問常常通過文件系統(tǒng)來進(jìn)行;典型的塊設(shè)備有:如磁盤、硬盤、光盤驅(qū)動(dòng)器等。設(shè)備驅(qū)動(dòng)的分類網(wǎng)絡(luò)接口能夠和其他主機(jī)交換數(shù)據(jù)的設(shè)備接口。網(wǎng)絡(luò)接口只是面向數(shù)據(jù)包而不是數(shù)據(jù)流,它沒有被映射為任何設(shè)備文件,其訪問要通過BSD套接口進(jìn)行。設(shè)備驅(qū)動(dòng)的的分類主設(shè)備號與與次設(shè)備號號LINUX系統(tǒng)中,,設(shè)備由一一個(gè)主設(shè)備號和一個(gè)次設(shè)備號來唯一標(biāo)識;主設(shè)備號唯一標(biāo)識了了設(shè)備類型型,即設(shè)備備驅(qū)動(dòng)程序序類型,它它是塊設(shè)備備表或字符符設(shè)備表中中設(shè)備表項(xiàng)項(xiàng)的索引。。一些典型設(shè)設(shè)備的主設(shè)設(shè)備號已經(jīng)經(jīng)基本固定定下來,例例如,軟驅(qū)驅(qū)的主設(shè)備備號為2,IDE硬盤的主設(shè)設(shè)備號為3等等。設(shè)備宏操作作MAJOR()可可以獲取主主設(shè)備號。。主設(shè)備號與與次設(shè)備號號次設(shè)備號用于標(biāo)識使使用同一設(shè)設(shè)備驅(qū)動(dòng)程程序的不同同硬件,并并僅由設(shè)備備驅(qū)動(dòng)程序序解釋當(dāng)應(yīng)用程序序操作某個(gè)個(gè)設(shè)備文件件時(shí),Linux內(nèi)核根據(jù)其其主設(shè)備號號調(diào)用相應(yīng)應(yīng)的驅(qū)動(dòng)程程序,并從從用戶態(tài)進(jìn)入入內(nèi)核態(tài)驅(qū)動(dòng)程序判判斷次設(shè)備備號,并完完成相應(yīng)的的硬件操作作。用戶空間和和內(nèi)核空間間Linux運(yùn)行在2種模式下下內(nèi)核模式用戶模式內(nèi)核模式對對應(yīng)內(nèi)核空空間,而用用戶模式對對應(yīng)用戶空空間。驅(qū)動(dòng)程序作作為內(nèi)核的的一部分,,它對應(yīng)內(nèi)內(nèi)核空間,,應(yīng)用程序序不能直接接訪問其數(shù)數(shù)據(jù),用戶空間和和內(nèi)核空間間用戶空間和和內(nèi)核空間間的數(shù)據(jù)傳傳遞:copy_to_user(void*to,constvoid*from,unsignedlongcount);copy_from_user(void*to,constvoid*from,unsignedlongcount);__copy_to_user()__copy_from_user()第一種方法法在復(fù)制數(shù)數(shù)據(jù)的同時(shí)時(shí),會(huì)進(jìn)行行地址空間間的有效性性檢查。內(nèi)核設(shè)備驅(qū)驅(qū)動(dòng)模塊設(shè)備驅(qū)動(dòng)程程序以兩種種方式添加加到內(nèi)核::Buildin直接把驅(qū)動(dòng)動(dòng)程序編譯譯到內(nèi)核代代碼中Module以模塊的方方式加載驅(qū)驅(qū)動(dòng)程序加載:insmoddriver.o卸載:rmmoddriver查看:lsmodLinux設(shè)備節(jié)點(diǎn)點(diǎn)的添加設(shè)備節(jié)點(diǎn)位位于/dev路徑下下可用如下命命令添加dev節(jié)點(diǎn)點(diǎn),b代代表塊設(shè)備備,C表示示字符設(shè)備備mknod/dev/hda1b(/c)1271塊設(shè)備,主主設(shè)備號127,次次設(shè)備號1Linux設(shè)備驅(qū)動(dòng)代代碼的分布布/char:字符設(shè)設(shè)備驅(qū)動(dòng)源碼;/block:塊設(shè)設(shè)備驅(qū)動(dòng)源碼;/cdrom:LinuxCDROM驅(qū)動(dòng)源碼。這里可以找找到某些特特殊的CDROM設(shè)設(shè)備(如SoundblasterCDROM)。IDE接口的的CD驅(qū)動(dòng)動(dòng)位于drivers/ide/ide-cd.c中而而SCSICD驅(qū)動(dòng)動(dòng)位于drivers/scsi/scsi.c中。/pci::它包含了了PCI偽偽設(shè)備驅(qū)動(dòng)動(dòng)源碼。這這里可以找找到關(guān)于PCI子系系統(tǒng)映射與與初始化的的代碼。Linux設(shè)備驅(qū)動(dòng)代代碼的分布布/scsi:所有的的SCSI代碼以及及Linux支持的的SCSI設(shè)備的設(shè)設(shè)備驅(qū)動(dòng)。。/net::包含網(wǎng)絡(luò)絡(luò)驅(qū)動(dòng)源碼碼。/sound:所有有的聲卡驅(qū)驅(qū)動(dòng)源碼。。/video:所有有的視頻卡卡驅(qū)動(dòng)源碼碼。Linux設(shè)備驅(qū)動(dòng)的的代碼結(jié)構(gòu)構(gòu)驅(qū)動(dòng)程序的的注冊與注注銷設(shè)備的打開開與釋放設(shè)備的讀寫寫操作設(shè)備的控制制操作設(shè)備的中斷斷和輪詢處處理等19設(shè)備驅(qū)動(dòng)的的注冊方法1result=devfs_register_chrdev(0,MOD_NAME,&keypad_fops)if(result<0){return-ENODEV;}devfs_handle=devfs_register(NULL,MOD_NAME,,result,0,,&keypad_fops,NULL);MOD_NAME:設(shè)備驅(qū)動(dòng)動(dòng)的名稱;;keypad_fops::文件操作作指針。優(yōu)點(diǎn):無需需手動(dòng)創(chuàng)建建設(shè)備節(jié)點(diǎn)點(diǎn),由系統(tǒng)統(tǒng)自動(dòng)完成成。對于塊設(shè)備備的注冊,,具有類似似函數(shù):devfs_register_blkdev以及操作作過程。設(shè)備驅(qū)動(dòng)的的注冊方法2result=register_chrdev(0,MOD_NAME,&keypad_fops);或者result=register_blkdev(0,MOD_NAME,&keypad_fops);if(result<0){ return-ENODEV; }mknod/dev/MOD_NAMECMAJORMINOR設(shè)備驅(qū)動(dòng)的的注銷方法1devfs_unregister_chrdev(MAJOR,MOD_NAME);或者devfs_unregister_blkdev(MAJOR,MOD_NAME);devfs_unregister(devfs_handle);方法2unregister_chrdev(Major,MOD_NAME);或者unregister_blkdev(Major,MOD_NAME);rm/dev/MOD_NAME設(shè)備備的的打打開開與與釋釋放放設(shè)備備的的打打開開與與釋釋放放要要通通過過文文件件操操作作結(jié)結(jié)構(gòu)構(gòu)體體中中定定義義的的相相關(guān)關(guān)函函數(shù)數(shù)open()和和release()來來完完成成;;主要要完完成成設(shè)設(shè)備備的的初初始始化化工工作作以以及及設(shè)設(shè)備備的的釋釋放放。。文件件操操作作結(jié)結(jié)構(gòu)構(gòu)體體的的定定義義structfile_operations{structmodule*owner;ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar*,size_t,loff_t*);unsignedint(*poll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);文件件操操作作結(jié)結(jié)構(gòu)構(gòu)體體的的定定義義int(*open)(structinode*,structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*,intdatasync);};文件件操操作作結(jié)結(jié)構(gòu)構(gòu)體體的的主主要要函函數(shù)數(shù)open:用用于于打打開開文文件件設(shè)設(shè)備備release:在在關(guān)關(guān)閉閉文文件件的的調(diào)調(diào)用用read:用用于于從從設(shè)設(shè)備備中中讀讀取取數(shù)數(shù)據(jù)據(jù)write:向向設(shè)設(shè)備備發(fā)發(fā)送送數(shù)數(shù)據(jù)據(jù)poll:查查詢詢設(shè)設(shè)備備是是否否可可讀讀或或可可寫寫ioctl:提提供供執(zhí)執(zhí)行行設(shè)設(shè)備備特特定定命命令令的的方方法法fasync:用于設(shè)設(shè)備的異步通通知操作設(shè)備的讀寫字符設(shè)備的讀讀寫操作可以以直接使用read()和write()函數(shù)數(shù)來完成,塊設(shè)備的讀寫寫,需要調(diào)用用block_read()和block_write()函數(shù),這這2個(gè)函數(shù)向向設(shè)備請求表表中增加讀寫寫請求;塊設(shè)備的讀寫寫是對內(nèi)存緩緩沖區(qū)進(jìn)行操操作,如果內(nèi)內(nèi)存緩沖區(qū)中中沒有要讀入入的數(shù)據(jù),或或者緩沖區(qū)中中的數(shù)據(jù)需要要寫入設(shè)備,,可以通過調(diào)用用數(shù)據(jù)結(jié)構(gòu)blk_dev_struct中的的函數(shù)request_fn()完完成。設(shè)備的控制操操作對設(shè)備的控制制操作可通過過文件操作數(shù)數(shù)據(jù)結(jié)構(gòu)中的的ioctl()函數(shù)來來完成??刂撇僮髋c具具體的設(shè)備有有密切關(guān)系,,需要根據(jù)設(shè)設(shè)備實(shí)際情況況進(jìn)行具體分分析。設(shè)備的輪詢和和中斷處理輪詢方式對于不支持中中斷的硬件設(shè)設(shè)備,讀寫時(shí)時(shí)需要輪流查查詢設(shè)備的狀狀態(tài),以便決決定隨后的數(shù)數(shù)據(jù)操作。如果輪詢處理理方式的驅(qū)動(dòng)動(dòng)程序被鏈接接到內(nèi)核,則則意味著查詢詢過程中,內(nèi)內(nèi)核一直處于于閑置狀態(tài)。。解決辦法是使使用內(nèi)核定時(shí)時(shí)器,進(jìn)行定定期查詢。設(shè)備的輪詢和和中斷處理中斷處理方式式硬件在需要的的時(shí)候,向內(nèi)內(nèi)核發(fā)出中斷斷請求信號,,而內(nèi)核則負(fù)負(fù)責(zé)把中斷信信號傳遞給相相應(yīng)的設(shè)備驅(qū)驅(qū)動(dòng)。驅(qū)動(dòng)程序必須須在設(shè)備驅(qū)動(dòng)動(dòng)的初始化時(shí)時(shí)申請中斷資資源,并注冊冊中斷處理函函數(shù):申請:request_irq(irq,irq_handler,flag,dev_name,dev_id);釋放:free_irq(irq,dev_id);其中irq為為申請的中斷斷線號,irq_handler為為注冊的中斷斷處理函數(shù),,dev_id用于共共享中斷信號號線。典型字符驅(qū)動(dòng)動(dòng)程序框架staticstructfile_operationsdemo_fops={read:demo_readwrite: demo_writeopen:demo_open……};intinit_module(void){ returndemo_init();}用于注注冊設(shè)備驅(qū)動(dòng)動(dòng)、申請中斷斷線,初始化化等voidcleanup_module(void){ demo_cleanup();}用于注注銷設(shè)備驅(qū)動(dòng)動(dòng)、釋放中斷斷線等接口函數(shù)的實(shí)實(shí)現(xiàn)……Example1PXA270開發(fā)系統(tǒng)的的按鍵驅(qū)動(dòng)程程序與數(shù)碼顯顯示驅(qū)動(dòng)數(shù)碼顯示源代代碼按鍵驅(qū)動(dòng)源代代碼調(diào)試驅(qū)動(dòng)程序序,使用printk輸輸出信息,信信息的優(yōu)先級級依次為:KERN_EMERGKERN_ALERTKERN_CRITKERN_ERRKERN_WARNINGKERN_NOTICEKERN_INFOKERN_DEBUG如果要在終端端輸出信息,,編譯選項(xiàng)::-Wall–O2根據(jù)/kernel/printk.c的不同同設(shè)置,不顯顯示的信息會(huì)會(huì)出現(xiàn)在/var/log/messages中驅(qū)動(dòng)調(diào)試方法法參見LinuxDeviceDriverschapter3幀緩沖設(shè)備驅(qū)驅(qū)動(dòng)程序LCD分類LCD可由為為液晶照明的的方式有兩種種:傳送式和和反射式傳送式屏幕要要使用外加光光源照明,稱稱為背光(backlight),,照明光源要要安裝在LCD的背后。。傳送式LCD在正常光光線及暗光線線下,顯示效效果都很好,,但在戶外,,尤其在日光光下,很難辯辯清顯示內(nèi)容容。反射式屏幕,,則不需要外外加照明電源源,使用周圍圍環(huán)境的光線線(或在某些些筆記本中,,使用前部照照明系統(tǒng)的光光線)。這樣樣,反射式屏屏幕就沒有背背光,所以,,此種屏幕在在戶外或光線線充足的室內(nèi)內(nèi),才會(huì)有出出色的顯示效效果,但在一一般室內(nèi)光線線下,這種顯顯示屏的顯示示效果就不及及背光傳送式式的。幀緩沖(Framebuffer)幀緩沖(framebuffer)-顯示緩沖沖區(qū)是Linux為顯示設(shè)備備提供的一個(gè)個(gè)接口,是把把顯存抽象后后的一種設(shè)備備,他允許上上層應(yīng)用程序序在圖形模式式下直接對顯顯示緩沖區(qū)進(jìn)進(jìn)行讀寫操作作。Xwindow繪制窗口口,顯示漢字字都是通過fb幀緩沖設(shè)備Linux可可支持最多32個(gè)/dev/fb0~/dev/fb31缺省是/dev/fb0可以直接拷貝貝位圖到fb來顯示到屏屏幕cp/bitmap/penguin.bin/dev/fb0幀緩沖設(shè)備驅(qū)驅(qū)動(dòng)原理幀緩沖設(shè)備屬屬于字符設(shè)備備,其目的就是通通過配置PXA270的的寄存器,在在一段指定的的內(nèi)存與LCD之間建立立一個(gè)自動(dòng)傳傳輸?shù)耐ǖ?。這樣,任何何程序只要修修改這段內(nèi)存存中的數(shù)據(jù),,就可以改變變LCD上的的顯示內(nèi)容。。幀緩沖設(shè)備的的文件操作層層接口staticstructfile_operationsfb_fops={

owner:THIS_MODULE,

read:fb_read,/*讀操作*/write:fb_write,/*寫寫操作*/ioctl:fb_ioctl,/*控控制操作*/mmap:fb_mmap,/*映射操操作*/open:fb_open,/*打開操操作*/release:fb_release,/*關(guān)關(guān)閉操作*/

};其其中的成成員函數(shù)都在在文件linux/driver/video/fbmem.c中定定義幀緩沖設(shè)備的的文件操作層層接口控制操作函數(shù)數(shù)fb_ioctl通過以下參數(shù)數(shù)來傳遞控制制命令FBIOGET_VSCREENINFOFBIOPUT_VSCREENINFOFBIOGET_FSCREENINFO映射操作函數(shù)數(shù)fb_mmap將顯示緩存映映射到用戶空空間幀緩沖設(shè)備的的驅(qū)動(dòng)層接口口—fb_infostructfb_info{charmodename;/*defaultvideomode*/charfontname;/*defaultfontname*/……structfb_var_screeninfovar;/*Currentvar*/structfb_fix_screeninfofix;/*Currentfix*/……structfb_ops*fbops;char*screen_base;/*Virtualaddress*/……};幀緩沖沖設(shè)備備的驅(qū)驅(qū)動(dòng)層層接口口—fb_infoModename::設(shè)備備名稱稱;Fontname::顯示示字體體;fb_var_screeninfo:記記錄用用戶可可修改改的顯顯示控控制器器參數(shù)數(shù),包包括屏屏幕分分辨率率和每每個(gè)像像素點(diǎn)點(diǎn)的比比特?cái)?shù)數(shù),其其中的的xres定義義屏幕幕一行行有多多少個(gè)個(gè)象素素點(diǎn),yres定定義屏屏幕一一列有有多少少個(gè)象象素點(diǎn)點(diǎn),bits_per_pixel定定義每每個(gè)象象素點(diǎn)點(diǎn)用多多少個(gè)個(gè)字節(jié)節(jié)表示示;幀緩沖沖設(shè)備備的驅(qū)驅(qū)動(dòng)層層接口口—fb_infofb_fix_screeninfo:記記錄用用戶不不能修修改的的顯示示控制制器的的參數(shù)數(shù),如如屏幕幕緩沖沖區(qū)的的物理理地址址,長長度。。當(dāng)對對幀緩緩沖設(shè)設(shè)備進(jìn)進(jìn)行映映射操操作的的時(shí)候候,就就是從從fb_fix_screeninfo中中取得得緩沖沖區(qū)物物理地地址的的。Fb_ops::指向向底層層操作作的函函數(shù)的的指針針;結(jié)構(gòu)體體fb_info的的定義義如何寫寫幀緩緩沖設(shè)設(shè)備驅(qū)驅(qū)動(dòng)遵循設(shè)設(shè)備驅(qū)驅(qū)動(dòng)程程序的的結(jié)構(gòu)構(gòu),設(shè)設(shè)備注注冊、、定義義file_operations接口、、初始始化LCDC寄寄存器器初始化化一個(gè)個(gè)fb_info結(jié)構(gòu),,填充充其中中的成成員變變量,,并調(diào)調(diào)用register_framebuffer(&fb_info),將fb_info登記入入內(nèi)核核。實(shí)現(xiàn)定定義的的各個(gè)個(gè)接口口函數(shù)數(shù)幀緩沖沖驅(qū)動(dòng)動(dòng)程序序—初始化化函數(shù)數(shù)新的FB驅(qū)驅(qū)動(dòng)程程序,,需要要向fbmem.c(drivers/video)中中的結(jié)結(jié)構(gòu)體體fb_drivers中添添加相相應(yīng)的的參數(shù)數(shù)來給給出初初始化化函數(shù)數(shù)的入入口。。staticstruct{constchar*name;int(*init)(void);int(*setup)(char*);}fb_drivers[]__initdata={#ifdefCONFIG_FB_PXA……{"pxa",pxafb_init,pxafb_setup},#endif……}幀緩沖沖驅(qū)動(dòng)動(dòng)程序序—初始化化函數(shù)數(shù)dbmx1fb_init的的主要要操作作初始化化相關(guān)關(guān)的寄寄存器器初始化化一個(gè)個(gè)fb_info結(jié)結(jié)構(gòu),,填充充其中中的成成員變變量利用register_framebuffer()向向內(nèi)核核注冊冊該設(shè)設(shè)備。。如何寫寫幀緩緩沖的的應(yīng)用用程序序在應(yīng)用用程序序中,,操作作幀緩緩沖設(shè)設(shè)備的的一般般步驟驟如下下:1.打開/dev/fb設(shè)備文文件。。2.用ioctrl操作取取得當(dāng)當(dāng)前顯顯示屏屏幕的的參數(shù)數(shù),如如屏幕幕分辨辨率,,每個(gè)個(gè)像素素點(diǎn)的的比特特?cái)?shù)。。根據(jù)據(jù)屏幕幕參數(shù)數(shù)可計(jì)計(jì)算屏屏幕緩緩沖區(qū)區(qū)的大大小。。3.將屏幕幕緩沖沖區(qū)映映射到到用戶戶空間間。4.映射后后就可可以直直接讀讀寫屏屏幕緩緩沖區(qū)區(qū),進(jìn)進(jìn)行繪繪圖和和圖片片顯示示典型應(yīng)應(yīng)用的的代碼碼結(jié)構(gòu)構(gòu)(1)intmain(){intfbfd=0;structfb_var_screeninfovinfo;structfb_fix_screeninfofinfo;longintscreensize=0;/*打開設(shè)設(shè)備文文件*/fbfd=open("/dev/fb0",O_RDWR);典型應(yīng)應(yīng)用的的代碼碼結(jié)構(gòu)構(gòu)(2)/*取得屏屏幕相相關(guān)參參數(shù)*/ioctl(fbfd,FBIOGET_FSCREENINFO,&finfo);ioctl(fbfd,FBIOGET_VSCREENINFO,&vinfo);/*計(jì)算屏屏幕緩緩沖區(qū)區(qū)大小小*/screensize=vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;/*映射屏屏幕緩緩沖區(qū)區(qū)到用用戶地地址空空間*/fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fbfd,0);/*下面可可通過過fbp指針讀讀寫緩緩沖區(qū)區(qū)*/……}幀緩沖沖設(shè)備備的映映射mmapFb設(shè)設(shè)備驅(qū)驅(qū)動(dòng)工工作在在內(nèi)核核空間間,不不允許許用戶戶應(yīng)用用程序序直接接訪問問fb物理理地址址Linux在fb設(shè)設(shè)備驅(qū)驅(qū)動(dòng)的的file_operations結(jié)構(gòu)構(gòu)中提提供了了mmap函數(shù)數(shù),將屏幕幕緩沖沖區(qū)的的物理理地址址映射射到用用戶空空間的的一段段虛擬擬地址址,用戶就就可以以通過過讀寫寫這段段虛擬擬地址址訪問問屏幕幕緩沖沖區(qū),,在屏屏幕上上繪圖圖fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fbfd,0);幀緩沖沖設(shè)備備的ioctl幀緩沖設(shè)設(shè)備,對對設(shè)備文文件的ioctl操作作可讀取取/設(shè)置置顯示設(shè)設(shè)備及屏屏幕的參參數(shù),如如分辨率率、顏色色數(shù)、幕幕大小等等。ioctl的操作作是由底底層的幀幀緩沖驅(qū)驅(qū)動(dòng)程序序來完成成的。/*取得得屏幕相相關(guān)參數(shù)數(shù)*/ioctl(fbfd,FBIOGET_FSCREENINFO,&finfo);ioctl(fbfd,FBIOGET_VSCREENINFO,&vinfo);一個(gè)幀緩緩沖應(yīng)用用例子Fb_test:利用用幀緩沖沖設(shè)備畫畫點(diǎn),畫畫線,填填充區(qū)域域,顯示示ascii字字符,顯顯示漢字字FB_TestExampleCode9、靜夜夜四無無鄰,,荒居居舊業(yè)業(yè)貧。。。12月月-2212月月-22Thursday,December29,202210、雨雨中中黃黃葉葉樹樹,,燈燈下下白白頭頭人人。。。。12:55:4512:55:4512:5512/29/202212:55:45PM11、以我獨(dú)沈沈久,愧君君相見頻。。。12月-2212:55:4512:55Dec-2229-Dec-2212、故人江海海別,幾度度隔山川。。。12:55:4612:55:4612:55Thursday,December29,202213、乍見見翻疑疑夢,,相悲悲各問問年。。。12月月-2212月月-2212:55:4612:55:46December29,202214、他鄉(xiāng)生生白發(fā),,舊國見見青山。。。29十十二月202212:55:46下下午12:55:4612月-2215、比比不不了了得得就就不不比比,,得得不不到到的的就就不不要要。。。。。十二二月月2212:55下下午午12月月-2212:55December29,202216、行動(dòng)動(dòng)出成成果,,工作作出財(cái)財(cái)富。。。2022/12/2912:55:4612:55:4629December202217、做前,,能夠環(huán)環(huán)視四周周;做時(shí)時(shí),你只只能或者者最好沿沿著以腳腳為起點(diǎn)點(diǎn)的射線線向前。。。12:55:46下下午12:55下下午12:55:4612月-229、沒有失失敗,只只有暫時(shí)時(shí)停止成成功!。。12月-2212月-22Thursday,December29,202210、很多多事情情努力力了未未必有有結(jié)果果,但但是不不努力力卻什什么改改變也也沒有有。。。12:55:4612:55:4612:5512/29/202212:55:46PM11、成功就是日日復(fù)一日那一一點(diǎn)點(diǎn)小小努努力的積累。。。12月-2212:55:4612:55Dec-2229-Dec-2212、世世間間成成事事,,不不求求其其絕絕對對圓圓滿滿,,留留一一份份不不足足,,可可得得無無限限完完美美。。。。12:55:4612:55:4612:55Thursday,December29,202213、不知知香積積寺,,數(shù)里里入云云峰。。。12月月-2212月月-2212:55:4612:55:46December29,202214、意志堅(jiān)堅(jiān)強(qiáng)的人人能把世世界放在在手中像像泥塊一一樣任意意揉捏

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論