版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。framebuffer顯卡驅(qū)動入門framebuffer驅(qū)動全篇在后續(xù)的幾篇里面會詳細(xì)介紹如何編寫一個顯卡的驅(qū)動程序。framebufferdevice在內(nèi)核里面作為顯卡驅(qū)動模型,許多函數(shù)和數(shù)據(jù)結(jié)構(gòu)都是特定,正是這些特定的東西為我們的編程提供了方便。要開發(fā)framebufferdevice驅(qū)動,你應(yīng)該閱讀SourceSourceDocumentationfb下面的說明文件,三個重要文件00-INDEX,framebuffer.txt,internals.txt,其他文件都是針對具體顯卡芯片的說明了。文件
2、00-INDEX譯文文檔/documentation/fb的索引文件。如果你對framebuffer設(shè)備有什么想法,mail:GeertUytterhoeven00-index這個文件framebuffer.txtframebuffer設(shè)備介紹internals.txtframebuffer設(shè)備內(nèi)部快速瀏覽modedb.txt關(guān)于視頻模式的資料aty128fb.txt關(guān)于ATIRage128顯卡的framebuffer設(shè)備clgenfb.txt關(guān)于CirrusLogic的顯卡matroxfb.txt關(guān)于Matrox的顯卡pvr2fb.txt關(guān)于PowerVR2的顯卡tgafb.txt關(guān)于TGA
3、(DECChip21030)顯卡vesafb.txt關(guān)于VESA顯卡0.介紹幀緩沖設(shè)備提供了顯卡的抽象描述。他同時代表了顯卡上的顯存,應(yīng)用程序通過定義好的接口可以訪問顯卡,而不需要知道底層的任何操作。該設(shè)備使用特殊的設(shè)備節(jié)點,通常位于/dev目錄,如/dev/fb*.1.用戶角度的/dev/fb*從用戶的角度看,幀緩沖設(shè)備和其他位于/dev下面的設(shè)備類似。他是一個字符設(shè)備,通常主設(shè)備號是29,次設(shè)備號定義幀緩沖的個數(shù)。通常,使用如下方式(前面的數(shù)字代碼次設(shè)備號)0=/dev/fb0Firstframebuffer1=/dev/fb1Secondframebuffer.31=/dev/fb313
4、2ndframebuffer考慮到向下兼容,你可以創(chuàng)建符號鏈接:/dev/fb0current-fb0/dev/fb1current-fb1andsoon.幀緩沖設(shè)備也是一種普通的內(nèi)存設(shè)備,你可以讀寫其內(nèi)容。例如,對屏幕抓屏:cp/dev/fb0myfile你也可以同時有多個顯示設(shè)備,例如你的主板上出了內(nèi)置的顯卡還有另一獨立的顯卡。對應(yīng)的幀緩沖設(shè)備(/dev/fb0and/dev/fb1etc.)可以獨立工作。應(yīng)用程序如Xserver一般使用/dev/fb0作為默認(rèn)的顯示幀緩沖區(qū)。你可以自定把某個設(shè)備作為默認(rèn)的幀緩沖設(shè)備,設(shè)置$FRAMEBUFFER環(huán)境變量即可。在sh/bash:export
5、FRAMEBUFFER=/dev/fb1在csh中:setenvFRAMEBUFFER/dev/fb1設(shè)定后,Xserver將使用第二個幀緩沖區(qū)設(shè)備。2.程序員角度看/dev/fb*正如你所知,一個幀緩沖設(shè)備和內(nèi)存設(shè)備類似/dev/mem,并且有許多共性。你可以read,write,seek以及mmap()。不同僅僅是幀緩沖的內(nèi)存不是所有的內(nèi)存區(qū),而是顯卡專用的那部分內(nèi)存。/dev/fb*也允許盡心ioctl操作,通過ioctl可以讀取或設(shè)定設(shè)備參數(shù)。顏色映射表也是通過Ioctl設(shè)定。查看就知道有多少ioctl應(yīng)用以及相關(guān)數(shù)據(jù)結(jié)構(gòu)。這里給出摘要:-你可以獲取設(shè)備一些不變的信息,如設(shè)備名,屏幕的
6、組織(平面,象素,.)對應(yīng)內(nèi)存區(qū)的長度和起始地址。-也可以獲取能夠發(fā)生變化的信息,例如位深,顏色格式,時序等。如果你改變這些值,驅(qū)動程序?qū)χ颠M(jìn)行優(yōu)化,以滿足設(shè)備特性(返回EINVAL,如果你的設(shè)定,設(shè)備不支持)-你也可以獲取或設(shè)定部分顏色表。所有這些特性讓應(yīng)用程序十分容易的使用設(shè)備。Xserver可以使用/dev/fb*而不需知道硬件的寄存器是如何組織的。XF68_FBDev是一個用于位映射(單色)Xserver,唯一要做的就是在應(yīng)用程序在相應(yīng)的位置設(shè)定是否顯示。在新內(nèi)核中,幀緩沖設(shè)備可以工作于模塊中,允許動態(tài)加載。這類驅(qū)動必須調(diào)用register_framebuffer()在系統(tǒng)中注冊。使
7、用模塊更方便!3.幀緩沖分辨率設(shè)定幀緩沖的分辨率可以用工具fbset設(shè)定。他可以改變視頻設(shè)備的顯示模式。主要就是改變當(dāng)前視頻模式,如在啟動過程中,在/etc/rc.*或/etc/init.d/*文件中調(diào)用,可以把視頻模式從單色顯示變成真彩.fbset使用存儲在配置文件中的視頻模式數(shù)據(jù)表,你可以在文件中增加自己需要的顯示模式。4.XServerXserver(XF68_FBDev)是對幀緩沖設(shè)備的最主要應(yīng)用。從XFree863.2后,Xserver就是XFree86的一部分了,有2個工作模式:-在/etc/XF86Config文件中,如果Display段關(guān)于fbdev的配置:Modesdefau
8、ltXserver將使用前面討論的,從環(huán)境變量$FRAMEBUFFER獲取當(dāng)前幀緩沖設(shè)備.你也可以設(shè)定顏色位深,使用Depth關(guān)鍵字,使用Virtual設(shè)定虛擬分辨率。這也是默認(rèn)設(shè)置。-然而你也可以通過設(shè)定/etc/XF86Config,改變分辨率。這樣有很多靈活性,唯一的不足就是你必須設(shè)定刷新頻率??梢杂胒bset-x通過fbset或xvidtune切換顯示模式。5.視頻模式頻率CRT顯示器是用3個電子槍轟擊磷粉完成顏色的顯示的。電子槍從左到右的水平掃描,并從上至下的垂直掃描。通過改變槍的電壓,所顯示的顏色可以不同。當(dāng)電子槍完成一行掃描重新回到下一行的開始,被稱作“水平折回”。當(dāng)一屏幕全部掃
9、描完畢,電子槍將回到最左上腳,被成為“垂直折回”。在折回的途中電子槍是關(guān)閉的。電子槍打點的移動速度取決于點時鐘。如果點時鐘是28.37516MHz,打一個點需要35242ps。1/(28.37516E6Hz)=35.242E-9s如果屏幕分辨率是640 x480,那么一行的時間是:640*35.242E-9s=22.555E-6s然而水平折回也是需要時間的,通常272個打點時間,因此一行總共需要:(640+272)*35.242E-9s=32.141E-6s我們就認(rèn)為水平掃描的頻率是31KHz:1/(32.141E-6s)=31.113E3Hz一屏幕含有480行,加上垂直折回時間49,一屏所需
10、的時間:(480+49)*32.141E-6s=17.002E-3s我們就認(rèn)為垂直掃描的頻率是59Hz:1/(17.002E-3s)=58.815Hz這也意味著屏幕數(shù)據(jù)每秒鐘刷新59次。為了得到穩(wěn)定的圖像顯示效果,VESA垂直掃描頻率不低于72Hz。但是也因人而異,有些人50Hz感覺不到任何問題,有些至少在80Hz以上才可以。由于顯示器不知道什么時候新行開始掃描,顯卡為每一行掃描提供水平同步信號。類似的,他也為每一幀顯示提供垂直同步信號。圖像在屏幕上點的位置取決于這些同步信號的發(fā)生時刻。下圖給出了所有時序的概要。水平折回的時間就是左邊空白右邊空白水平同步長度。垂直折回的時間就是上空白下空白垂直
11、同步長。+|upper_margin|?|+#+|#|#|#|#|#|#|#|left#|#right|hsync|margin#|xres#margin|len|#|#|#|#|#|#|#|#|yres#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#?#|+#+|lower_margin|?|+|vsync_len|?|+6.把XFree86時序變成framebufferdevice時序典型的顯示模式:800 x600508008569761040600637643666DCFHRSH1SH2HFLVRSV1SV2VFL而幀緩沖設(shè)備使用下面的參數(shù):-pixclock:點
12、時鐘inps(picoseconds)-left_margin:timefromsynctopicture-right_margin:timefrompicturetosync-upper_margin:timefromsynctopicture-lower_margin:timefrompicturetosync-hsync_len:lengthofhorizontalsync-vsync_len:lengthofverticalsync1)Pixelclock:xfree:inMHzfb:inpicoseconds(ps)pixclock=1000000/DCF2)horizontalti
13、mings:left_margin=HFL-SH2right_margin=SH1-HRhsync_len=SH2-SH13)verticaltimings:upper_margin=VFL-SV2lower_margin=SV1-VRvsync_len=SV2-SV1xc/programs/Xserver/hw/xfree86/doc/modeDB.txt.7.引用獲取更多關(guān)于幀緩沖設(shè)備以及應(yīng)用的參考,請訪問:http:/或者查閱下面的文檔:-Themanualpagesforfbset:fbset(8),fb.modes(5)-ThemanualpagesforXFree86:XF68_F
14、BDev(1),XF86Config(4/5)-Themightykernelsources:olinux/drivers/video/olinux/include/linux/fb.holinux/include/video/幀緩沖設(shè)備的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(internals.txt)GeertUytterhoeven,21July1998幀緩沖設(shè)備中用到的結(jié)構(gòu)體以下數(shù)據(jù)結(jié)構(gòu)在幀緩沖設(shè)備使用,定義。1.Outsidethekernel(userspace)-structfb_fix_screeninfo幀緩沖設(shè)備中設(shè)備無關(guān)的常值數(shù)據(jù)信息。可以通過Ioctl的FBIOGET_FSCREENINFO獲
15、取。-structfb_var_screeninfo幀緩沖設(shè)備中設(shè)備無關(guān)的變量數(shù)據(jù)信息和特定的顯示模式??梢酝ㄟ^iotcl的FBIOGET_VSCREENINFO獲取,并通過ioctl的FBIOPUT_VSCREENINFO設(shè)定。還有FBIOPAN_DISPLAY可以用。-structfb_cmap設(shè)備無關(guān)的顏色表信息。你可以通過ioctl的FBIOGETCMAP和FBIOPUTCMAP讀取或設(shè)定。2.Insidethekernel-structfb_info常規(guī)信息,API以及幀緩沖設(shè)備的底層信息(主板地址.).-structpar唯一指定該設(shè)備的顯示模式的設(shè)備相關(guān)信息。-structdis
16、play幀緩沖設(shè)備和控制臺驅(qū)動之間的接口。*常用的幀緩沖API*Monochrome(FB_VISUAL_MONO01andFB_VISUAL_MONO10)每個象素是黑或白。Pseudocolor(FB_VISUAL_PSEUDOCOLORandFB_VISUAL_STATIC_PSEUDOCOLOR)索引顏色顯示Truecolor(FB_VISUAL_TRUECOLOR)真彩顯示,分成紅綠蘭三基色Directcolor(FB_VISUAL_DIRECTCOLOR)每個象素顏色也是有紅綠藍(lán)組成,不過每個顏色值是個索引,需要查表。Grayscaledisplays灰度顯示,紅綠藍(lán)的值都一樣準(zhǔn)備
17、開始寫我們自己的驅(qū)動之前,請詳細(xì)閱讀如下文件:Documentationfb目錄vesafb.txt,matroxfb.txt,sa1100fb.txtdriversvideo目錄fbmem.c,fbgen.c,fbmon.c,fbcmap.cskeletonfb.cvesafb.c,sa1100fb.c,sa1100fb.hincludelinux目錄fb.h最值得關(guān)注的是skeletonfb.c,該文件給出了一個fbdevice驅(qū)動的框架準(zhǔn)備好了,就開始寫自己的frambufferdevicedriver。framebuffer驅(qū)動全篇(二)還是要補(bǔ)充點,下面是/linux/fb.h的部分
18、注釋,加粗的是常用的,紅色是關(guān)鍵的,一般不可少。旁邊沒有漢字,要么很簡單沒必要加注,要么就用不到!注釋:good02xaut#ifndef_LINUX_FB_H#define_LINUX_FB_H#include#include/*Definitionsofframebuffers*/#defineFB_MAJOR29/*主設(shè)備號*/#defineFB_MAX32/*sufficientfornow*/*ioctls0 x46isF*/#defineFBIOGET_VSCREENINFO0 x4600#defineFBIOPUT_VSCREENINFO0 x4601#defineFBIOGET
19、_FSCREENINFO0 x4602#defineFBIOGETCMAP0 x4604#defineFBIOPUTCMAP0 x4605#defineFBIOPAN_DISPLAY0 x4606/*0 x4607-0 x460Baredefinedbelow*/*#defineFBIOGET_MONITORSPEC0 x460C*/*#defineFBIOPUT_MONITORSPEC0 x460D*/*#defineFBIOSWITCH_MONIBIT0 x460E*/#defineFBIOGET_CON2FBMAP0 x460F#defineFBIOPUT_CON2FBMAP0 x461
20、0#defineFBIOBLANK0 x4611/*arg:0orvesalevel+1*/#defineFBIOGET_VBLANK_IOR(F,0 x12,structfb_vblank)#defineFBIO_ALLOC0 x4613#defineFBIO_FREE0 x4614#defineFBIOGET_GLYPH0 x4615#defineFBIOGET_HWCINFO0 x4616#defineFBIOPUT_MODEINFO0 x4617#defineFBIOGET_DISPINFO0 x4618#defineFB_TYPE_PACKED_PIXELS0/*PackedPixe
21、ls*/#defineFB_TYPE_PLANES1/*Noninterleavedplanes*/#defineFB_TYPE_INTERLEAVED_PLANES2/*Interleavedplanes*/#defineFB_TYPE_TEXT3/*Text/attributes*/#defineFB_TYPE_VGA_PLANES4/*EGA/VGAplanes*/#defineFB_AUX_TEXT_MDA0/*Monochrometext*/#defineFB_AUX_TEXT_CGA1/*CGA/EGA/VGAColortext*/#defineFB_AUX_TEXT_S3_MMI
22、O2/*S3MMIOfasttext*/#defineFB_AUX_TEXT_MGA_STEP163/*MGAMilleniumI:text,attr,14reservedbytes*/#defineFB_AUX_TEXT_MGA_STEP84/*otherMGAs:text,attr,6reservedbytes*/#defineFB_AUX_VGA_PLANES_VGA40/*16colorplanes(EGA/VGA)*/#defineFB_AUX_VGA_PLANES_CFB41/*CFB4inplanes(VGA)*/#defineFB_AUX_VGA_PLANES_CFB82/*C
23、FB8inplanes(VGA)*/#defineFB_VISUAL_MONO010/*Monochr.1=Black0=White*/#defineFB_VISUAL_MONO101/*Monochr.1=White0=Black*/#defineFB_VISUAL_TRUECOLOR2/*Truecolor*/#defineFB_VISUAL_PSEUDOCOLOR3/*Pseudocolor(likeatari)*/#defineFB_VISUAL_DIRECTCOLOR4/*Directcolor*/#defineFB_VISUAL_STATIC_PSEUDOCOLOR5/*Pseud
24、ocolorreadonly*/#defineFB_ACCEL_NONE0/*nohardwareaccelerator*/#defineFB_ACCEL_ATARIBLITT1/*AtariBlitter*/#defineFB_ACCEL_AMIGABLITT2/*AmigaBlitter*/#defineFB_ACCEL_S3_TRIO643/*Cybervision64(S3Trio64)*/#defineFB_ACCEL_NCR_77C32BLT4/*RetinaZ3(NCR77C32BLT)*/#defineFB_ACCEL_S3_VIRGE5/*Cybervision64/3D(S
25、3ViRGE)*/#defineFB_ACCEL_ATI_MACH64GX6/*ATIMach64GXfamily*/#defineFB_ACCEL_DEC_TGA7/*DEC21030TGA*/#defineFB_ACCEL_ATI_MACH64CT8/*ATIMach64CTfamily*/#defineFB_ACCEL_ATI_MACH64VT9/*ATIMach64CTfamilyVTclass*/#defineFB_ACCEL_ATI_MACH64GT10/*ATIMach64CTfamilyGTclass*/#defineFB_ACCEL_SUN_CREATOR11/*SunCre
26、ator/Creator3D*/#defineFB_ACCEL_SUN_CGSIX12/*Suncg6*/#defineFB_ACCEL_SUN_LEO13/*Sunleo/zx*/#defineFB_ACCEL_IMS_TWINTURBO14/*IMSTwinTurbo*/#defineFB_ACCEL_3DLABS_PERMEDIA215/*3DlabsPermedia2*/#defineFB_ACCEL_MATROX_MGA2064W16/*MatroxMGA2064W(Millenium)*/#defineFB_ACCEL_MATROX_MGA1064SG17/*MatroxMGA10
27、64SG(Mystique)*/#defineFB_ACCEL_MATROX_MGA2164W18/*MatroxMGA2164W(MilleniumII)*/#defineFB_ACCEL_MATROX_MGA2164W_AGP19/*MatroxMGA2164W(MilleniumII)*/#defineFB_ACCEL_MATROX_MGAG10020/*MatroxG100(ProductivaG100)*/#defineFB_ACCEL_MATROX_MGAG20021/*MatroxG200(Myst,Mill,.)*/#defineFB_ACCEL_SUN_CG1422/*Sun
28、cgfourteen*/#defineFB_ACCEL_SUN_BWTWO23/*Sunbwtwo*/#defineFB_ACCEL_SUN_CGTHREE24/*Suncgthree*/#defineFB_ACCEL_SUN_TCX25/*Suntcx*/#defineFB_ACCEL_MATROX_MGAG40026/*MatroxG400*/#defineFB_ACCEL_NV327/*nVidiaRIVA128*/#defineFB_ACCEL_NV428/*nVidiaRIVATNT*/#defineFB_ACCEL_NV529/*nVidiaRIVATNT2*/#defineFB_
29、ACCEL_CT_6555x30/*C&T6555x*/#defineFB_ACCEL_3DFX_BANSHEE31/*3DfxBanshee*/#defineFB_ACCEL_ATI_RAGE12832/*ATIRage128family*/#defineFB_ACCEL_IGS_CYBER200033/*CyberPro2000*/#defineFB_ACCEL_IGS_CYBER201034/*CyberPro2010*/#defineFB_ACCEL_IGS_CYBER500035/*CyberPro5000*/#defineFB_ACCEL_SIS_GLAMOUR36/*SiS300
30、/630/540*/#defineFB_ACCEL_3DLABS_PERMEDIA337/*3DlabsPermedia3*/*上面的宏定義不用關(guān)心*/*不可修改的屏幕信息,用戶空間可見*/structfb_fix_screeninfocharid16;/*identificationstringegTTBuiltin*/unsignedlongsmem_start;/*Startofframebuffermem顯存的起始地址*/*(physicaladdress)*/_u32smem_len;/*Lengthofframebuffermem顯存的大小*/_u32type;/*seeFB_TY
31、PE_*/_u32type_aux;/*InterleaveforinterleavedPlanes*/_u32visual;/*seeFB_VISUAL_*/_u16xpanstep;/*zeroifnohardwarepanning*/_u16ypanstep;/*zeroifnohardwarepanning*/_u16ywrapstep;/*zeroifnohardwareywrap*/_u32line_length;/*lengthofalineinbytes每行的字節(jié)數(shù)*/unsignedlongmmio_start;/*StartofMemoryMappedI/O*/*(phys
32、icaladdress)*/_u32mmio_len;/*LengthofMemoryMappedI/O*/_u32accel;/*Typeofaccelerationavailable*/_u16reserved3;/*Reservedforfuturecompatibility*/;/*Interpretationofoffsetforcolorfields:Alloffsetsarefromtheright,*insideapixelvalue,whichisexactlybits_per_pixelwide(means:you*canusetheoffsetasrightargumen
33、tto).Apixelafterwardsisabit*streamandiswrittentovideomemoryasthatunmodified.Thisimplies*big-endianbyteorderifbits_per_pixelisgreaterthan8.*/*像素所占字節(jié)內(nèi),各個顏色的位分配比如RGB=888,565,555等等,*/structfb_bitfield_u32offset;/*beginningofbitfield*/_u32length;/*lengthofbitfield*/_u32msb_right;/*!=0:Mostsignificantbiti
34、s*/*right*/;/*下面的宏也不常用*/#defineFB_NONSTD_HAM1/*Hold-And-Modify(HAM)*/#defineFB_ACTIVATE_NOW0/*setvaluesimmediately(orvbl)*/#defineFB_ACTIVATE_NXTOPEN1/*activateonnextopen*/#defineFB_ACTIVATE_TEST2/*dontset,roundupimpossible*/#defineFB_ACTIVATE_MASK15/*values*/#defineFB_ACTIVATE_VBL16/*activatevalues
35、onnextvbl*/#defineFB_CHANGE_CMAP_VBL32/*changecolormaponvbl*/#defineFB_ACTIVATE_ALL64/*changeallVCsonthisfb*/#defineFB_ACCELF_TEXT1/*textmodeacceleration*/#defineFB_SYNC_HOR_HIGH_ACT1/*horizontalsynchighactive*/#defineFB_SYNC_VERT_HIGH_ACT2/*verticalsynchighactive*/#defineFB_SYNC_EXT4/*externalsync*
36、/#defineFB_SYNC_COMP_HIGH_ACT8/*compositesynchighactive*/#defineFB_SYNC_BROADCAST16/*broadcastvideotimingsFramebuffer驅(qū)動程序模型下圖會向你展示目前的framebuffer設(shè)備驅(qū)動的結(jié)構(gòu),最常用的是非標(biāo)準(zhǔn)驅(qū)動。很明顯他所處的層次最高,程序編寫是最容易的。理解了這個圖的,你已經(jīng)很輕松的去完成一個fb驅(qū)動,比如給sa1100,s2410,s2440系列的ARM的LCD控制器寫驅(qū)動。framebuffer驅(qū)動全篇(三)ColorMap剖析在framebuffer驅(qū)動程序設(shè)計中,cmap
37、這個東東太暈了。現(xiàn)在我要把他赤裸裸的剖析給大家:)1structfb_cmap/*顏色映射表*/structfb_cmap_u32start;/*Firstentry*/_u32len;/*Numberofentries*/_u16*red;/*紅色*/_u16*green;/*綠色*/_u16*blue;/*藍(lán)色*/_u16*transp;/*透明度,允許NULL*/;該結(jié)構(gòu)在fb.h文件中定義,在structfb_ops結(jié)構(gòu)中有兩個成員函數(shù)與其相關(guān):/*獲取顏色表*/int(*fb_get_cmap)(structfb_cmap*cmap,intkspc,intcon,structfb_i
38、nfo*info);/*設(shè)定顏色表*/int(*fb_set_cmap)(structfb_cmap*cmap,intkspc,intcon,structfb_info*info);在structfb_info結(jié)構(gòu)中有變量:structfb_cmapcmap;/*Currentcmap*/在fpgen基礎(chǔ)操作下提供:externintfbgen_get_cmap(structfb_cmap*cmap,intkspc,intcon,structfb_info*info);externintfbgen_set_cmap(structfb_cmap*cmap,intkspc,intcon,struc
39、tfb_info*info);在文件/*drivers/video/fbcmap.c*/中提供更多的cmap應(yīng)用externintfb_alloc_cmap(structfb_cmap*cmap,intlen,inttransp);externvoidfb_copy_cmap(structfb_cmap*from,structfb_cmap*to,intfsfromto);externintfb_get_cmap(structfb_cmap*cmap,intkspc,int(*getcolreg)(u_int,u_int*,u_int*,u_int*,u_int*,structfb_info*
40、),structfb_info*fb_info);externintfb_set_cmap(structfb_cmap*cmap,intkspc,int(*setcolreg)(u_int,u_int,u_int,u_int,u_int,structfb_info*),structfb_info*fb_info);externstructfb_cmap*fb_default_cmap(intlen);externvoidfb_invert_cmaps(void);2通過文件解析在anakinfb.c文件中,cmap如圖在stifb.cframebuffer驅(qū)動全篇(四)本文介紹的設(shè)備是位于/v
41、ideo目錄下面的anakinfb.c驅(qū)動程序。雖然我不清楚那個設(shè)備的特性,但是從對程序的分析中我們?nèi)匀恢廊绾尉帉懸粋€framebuffer設(shè)備驅(qū)動。本文是個標(biāo)準(zhǔn)的fb驅(qū)動。共221行,包含函數(shù)如下:1.staticintanakinfb_getcolreg(u_intregno,u_int*red,u_int*green,u_int*blue,u_int*transp,structfb_info*info)31行2.staticintanakinfb_setcolreg(u_intregno,u_intred,u_intgreen,u_intblue,u_inttransp,structf
42、b_info*info)45行3.staticintanakinfb_get_fix(structfb_fix_screeninfo*fix,intcon,structfb_info*info)57行4.staticintanakinfb_get_var(structfb_var_screeninfo*var,intcon,structfb_info*info)75行5.staticintanakinfb_set_var(structfb_var_screeninfo*var,intcon,structfb_info*info)111行6.staticintanakinfb_get_cmap(
43、structfb_cmap*cmap,intkspc,intcon,structfb_info*info)117行7.staticintanakinfb_set_cmap(structfb_cmap*cmap,intkspc,intcon,structfb_info*info)130行8.staticintanakinfb_switch_con(intcon,structfb_info*info)147行9.staticintanakinfb_updatevar(intcon,structfb_info*info)155行10.staticvoidanakinfb_blank(intblank
44、,structfb_info*info)161行11.int_initanakinfb_init(void)178行函數(shù)1,2是寄存器操作用。函數(shù)3,4,5,6,7是fb_ops函數(shù)函數(shù)8用于切換控制臺函數(shù)9用于更新變量函數(shù)10用于閃爍屏幕函數(shù)11用于初始化設(shè)備很奇怪,對fb設(shè)備的讀寫函數(shù)怎么沒有!值得說明的是open,release,read,write,ioctl,mmap等函數(shù)的實現(xiàn)是由fbmem.c文件實現(xiàn)了。也就是說所有的fb設(shè)備在給定了fb_info后,所有的操作都是一樣的。在明確的fb_info前提下,fbmem.c中的函數(shù)可以工作的很好。這樣大家應(yīng)該感到非常輕松了吧,只要完成上
45、述的幾個設(shè)備相關(guān)的函數(shù),framebuffer設(shè)備的驅(qū)動就寫完了:)系統(tǒng)的結(jié)構(gòu)如圖:Stifb驅(qū)動模型linux/drivers/video/stifb.c-GenericframebufferdriverforHP*workstationswithSTI(standardtextinterface)videofirmware.這個驅(qū)動程序和前面的anakin設(shè)備完全不同,因為他不是采用標(biāo)準(zhǔn)的格式,而是根據(jù)basedonskeletonfb,whichwasCreated28Dec1997byGeertUytterhoeven也就是skeletonfb.c提供的框架完成的。共230行,包含函數(shù)
46、如下:1.staticintsti_encode_fix(structfb_fix_screeninfo*fix,constvoid*par,structfb_info_gen*info)60行2.staticintsti_decode_var(conststructfb_var_screeninfo*var,void*par,structfb_info_gen*info)71行3.staticintsti_encode_var(structfb_var_screeninfo*var,constvoid*par,structfb_info_gen*info)78行4.staticvoidsti
47、_get_par(void*par,structfb_info_gen*info)94行5.staticvoidsti_set_par(constvoid*par,structfb_info_gen*info)99行6.staticintsti_getcolreg(unsignedregno,unsigned*red,unsigned*green,unsigned*blue,unsigned*transp,structfb_info*info)104行7.staticintsti_setcolreg(unsignedregno,unsignedred,unsignedgreen,unsigne
48、dblue,unsignedtransp,structfb_info*info)111行8.staticvoidsti_set_disp(constvoid*par,structdisplay*disp,structfb_info_gen*info)118行9.staticvoidsti_detect(void)127行10.staticintsti_blank(intblank_mode,conststructfb_info*info)132行11.int_initstifb_init(void)161行12.voidstifb_cleanup(structfb_info*info)201行
49、13.int_initstifb_setup(char*options)208行其中1到10是必須的,參考下面的圖。11是初始化代碼1213沒有完成具體功能再給出fb_fix_screeninfo系統(tǒng)調(diào)用結(jié)構(gòu)圖:Framebuffer與consoleFramebuffer作為顯卡在內(nèi)核中的注冊設(shè)備,為了滿足應(yīng)用需要,通常還要為console操作提供專用操作函數(shù)。Console是系統(tǒng)提供的一種特殊的文本輸出終端,如圖所示。常用的console已經(jīng)不再是從前的單色顯示,而是16色或者更多顏色顯示。根據(jù)文本的代表的不同屬性,顯示不同的顏色。把對console的支持內(nèi)嵌到fb的驅(qū)動中,或許有其自己的道
50、理,我沒有看出來。不過既然要提供這種支持,我們的驅(qū)動程序就要添枝加葉了。在準(zhǔn)fb設(shè)備設(shè)備驅(qū)動中是沒有對console支持的。只有在非標(biāo)準(zhǔn)的fb驅(qū)動,也就是基于skeletonfb.c架構(gòu)的程序,需要提供這部分代碼。下面從各個方面介紹framebuffer對console的支持。1.各個文件中的支持fb.h文件中structfb_info結(jié)構(gòu)中:structdisplay*disp;/*initialdisplayvariable*/structvc_data*display_fg;/*Consolevisibleonthisdisplay*/int(*changevar)(int);/*tel
51、lconsolevarhaschanged*/int(*switch_con)(int,structfb_info*);/*tellfbtoswitchconsoles*/fbgen.c文件中:voidfbgen_set_disp(intcon,structfb_info_gen*info)intfbgen_update_var(intcon,structfb_info*info)intfbgen_switch(intcon,structfb_info*info)新增加文件fbcon.cstructdisplayfb_displayMAX_NR_CONSOLES;charcon2fb_mapM
52、AX_NR_CONSOLES;.新增加文件fbcon.h:structdisplay_switchstructdisplay新增文件console_struct.h:structvc_data2.console中的顏色設(shè)定該部分內(nèi)容準(zhǔn)備略掉,可以自行參考fbcon-cfb*.c文件。3.console和fb的高層理解當(dāng)我們在fb中引入console后,就相當(dāng)于把一張白紙變成了一個日記本。本來對于fb來說只有顏色和位置的關(guān)系,引入console后,首先就是console的描述。每個console相當(dāng)于日記本的一頁,不同的console可以切換。Console因為是要顯示文本,又和字體聯(lián)系到一起。
53、Console的管理是十分復(fù)雜的,遠(yuǎn)遠(yuǎn)超過了framebuffer本身。在RH9中,我們可以自己體驗一下console和fb的協(xié)調(diào)問題。使用Init3多用戶模式登陸,這里是沒有Xserver支持的。所有的輸入輸出都是基于console的。Framebuffer就相當(dāng)于你的顯示器。通過ALT+CTRL+F*,我們可以切換到不同的console,而每個console的設(shè)置都可以很獨立的完成。每隔console會在自己的數(shù)據(jù)區(qū)記錄歷史命令,在不同的console可以登陸不同的用戶到系統(tǒng)。但是,因為只有一個屏幕,所以當(dāng)前可視的console只有一個。Framebuffer驅(qū)動程序要能夠根據(jù)ALT+CT
54、RL+F*切換命令去完成console的切換顯示。這樣大家應(yīng)該明白framebuffer和console的關(guān)系了吧。后續(xù)我們會具體講述fb對console的支持。但是對console本身不會設(shè)計太多,具體參考tty或console的設(shè)計。當(dāng)完成了fb對console的支持,framebufferdevicedriver設(shè)計就完了:)framebuffer驅(qū)動全篇(五)Fbconsole中的字體/driver/video目錄下:font_6x11.c,font_8x8.c,font_8x16.cfont_acorn_8x8.c,font_pearl_8x8.c,font_sun8x16.c,fo
55、nt_sun12x22.cfonts.c這些文件都是用來處理在fbcon中的字體顯示問題。其中除最后一個文件fonts.c外,其他都是字模文件由cpi2fnt產(chǎn)生。/include/video/目錄下:font.h1首先介紹font.h文件font.h文件中,定義了字體的描述結(jié)構(gòu)structfbcon_font_descintidx;/字體的索引號char*name;/字體的描述intwidth,height;/字模的寬和高void*data;/字模的起始指針intpref;/額外信息,平臺用;width的值不一定是8的整數(shù)倍,考慮到計算機(jī)存儲的問題,即使width小于8的整數(shù)倍,存儲時仍以字節(jié)為單位,不足的右補(bǔ)齊0。Linux內(nèi)核自帶了7種字體,name依次為:font_vga_8x8,font_vga_8x16,font_pearl_8x8,font_vga_6x11,font_sun_8x16,font_sun_12x22,font_acorn_8x8;根據(jù)定義na
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度租車行業(yè)信用體系建設(shè)合同2篇
- 二零二五年度餐廳裝修與品牌推廣合作合同3篇
- 二零二五年度電子產(chǎn)品組裝加工合同范本3篇
- 二零二五版電商平臺法律風(fēng)險防范與合規(guī)管理合同3篇
- 二零二五版城市核心區(qū)二手房交易中介合同2篇
- 封窗合同范本(2篇)
- 展會參展商培訓(xùn)合同(2篇)
- 二零二五版高新技術(shù)產(chǎn)業(yè)勞動合同標(biāo)準(zhǔn)文本3篇
- 二零二五版建筑工程合同管理與索賠爭議調(diào)解服務(wù)協(xié)議3篇
- 二零二五版房地產(chǎn)項目股權(quán)出資轉(zhuǎn)讓合同樣本3篇
- 2025年生產(chǎn)主管年度工作計劃
- 2025年急診科護(hù)理工作計劃
- 高中家長會 高二寒假線上家長會課件
- 2024-2025學(xué)年山東省聊城市高一上學(xué)期期末數(shù)學(xué)教學(xué)質(zhì)量檢測試題(附解析)
- 違規(guī)行為與處罰管理制度
- 個人教師述職報告錦集10篇
- 四川省等八省2025年普通高中學(xué)業(yè)水平選擇性考試適應(yīng)性演練歷史試題(含答案)
- 《內(nèi)部培訓(xùn)師培訓(xùn)》課件
- 《雷達(dá)原理》課件-3.3.3教學(xué)課件:相控陣?yán)走_(dá)
- 西方史學(xué)史課件3教學(xué)
- 2024年中國醫(yī)藥研發(fā)藍(lán)皮書
評論
0/150
提交評論