




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Good is good, but better carries it.精益求精,善益求善。framebuffer显卡驱动入门framebuffer驱动全篇在后续的几篇里面会详细介绍如何编写一个显卡的驱动程序。framebufferdevice在内核里面作为显卡驱动模型,许多函数和数据结构都是特定,正是这些特定的东西为我们的编程提供了方便。要开发framebufferdevice驱动,你应该阅读SourceSourceDocumentationfb下面的说明文件,三个重要文件00-INDEX,framebuffer.txt,internals.txt,其他文件都是针对具体显卡芯片的说明了。文件
2、00-INDEX译文文档/documentation/fb的索引文件。如果你对framebuffer设备有什么想法,mail:GeertUytterhoeven00-index这个文件framebuffer.txtframebuffer设备介绍internals.txtframebuffer设备内部快速浏览modedb.txt关于视频模式的资料aty128fb.txt关于ATIRage128显卡的framebuffer设备clgenfb.txt关于CirrusLogic的显卡matroxfb.txt关于Matrox的显卡pvr2fb.txt关于PowerVR2的显卡tgafb.txt关于TGA
3、(DECChip21030)显卡vesafb.txt关于VESA显卡0.介绍帧缓冲设备提供了显卡的抽象描述。他同时代表了显卡上的显存,应用程序通过定义好的接口可以访问显卡,而不需要知道底层的任何操作。该设备使用特殊的设备节点,通常位于/dev目录,如/dev/fb*.1.用户角度的/dev/fb*从用户的角度看,帧缓冲设备和其他位于/dev下面的设备类似。他是一个字符设备,通常主设备号是29,次设备号定义帧缓冲的个数。通常,使用如下方式(前面的数字代码次设备号)0=/dev/fb0Firstframebuffer1=/dev/fb1Secondframebuffer.31=/dev/fb313
4、2ndframebuffer考虑到向下兼容,你可以创建符号链接:/dev/fb0current-fb0/dev/fb1current-fb1andsoon.帧缓冲设备也是一种普通的内存设备,你可以读写其内容。例如,对屏幕抓屏:cp/dev/fb0myfile你也可以同时有多个显示设备,例如你的主板上出了内置的显卡还有另一独立的显卡。对应的帧缓冲设备(/dev/fb0and/dev/fb1etc.)可以独立工作。应用程序如Xserver一般使用/dev/fb0作为默认的显示帧缓冲区。你可以自定把某个设备作为默认的帧缓冲设备,设置$FRAMEBUFFER环境变量即可。在sh/bash:export
5、FRAMEBUFFER=/dev/fb1在csh中:setenvFRAMEBUFFER/dev/fb1设定后,Xserver将使用第二个帧缓冲区设备。2.程序员角度看/dev/fb*正如你所知,一个帧缓冲设备和内存设备类似/dev/mem,并且有许多共性。你可以read,write,seek以及mmap()。不同仅仅是帧缓冲的内存不是所有的内存区,而是显卡专用的那部分内存。/dev/fb*也允许尽心ioctl操作,通过ioctl可以读取或设定设备参数。颜色映射表也是通过Ioctl设定。查看就知道有多少ioctl应用以及相关数据结构。这里给出摘要:-你可以获取设备一些不变的信息,如设备名,屏幕的
6、组织(平面,象素,.)对应内存区的长度和起始地址。-也可以获取能够发生变化的信息,例如位深,颜色格式,时序等。如果你改变这些值,驱动程序将对值进行优化,以满足设备特性(返回EINVAL,如果你的设定,设备不支持)-你也可以获取或设定部分颜色表。所有这些特性让应用程序十分容易的使用设备。Xserver可以使用/dev/fb*而不需知道硬件的寄存器是如何组织的。XF68_FBDev是一个用于位映射(单色)Xserver,唯一要做的就是在应用程序在相应的位置设定是否显示。在新内核中,帧缓冲设备可以工作于模块中,允许动态加载。这类驱动必须调用register_framebuffer()在系统中注册。使
7、用模块更方便!3.帧缓冲分辨率设定帧缓冲的分辨率可以用工具fbset设定。他可以改变视频设备的显示模式。主要就是改变当前视频模式,如在启动过程中,在/etc/rc.*或/etc/init.d/*文件中调用,可以把视频模式从单色显示变成真彩.fbset使用存储在配置文件中的视频模式数据表,你可以在文件中增加自己需要的显示模式。4.XServerXserver(XF68_FBDev)是对帧缓冲设备的最主要应用。从XFree863.2后,Xserver就是XFree86的一部分了,有2个工作模式:-在/etc/XF86Config文件中,如果Display段关于fbdev的配置:Modesdefau
8、ltXserver将使用前面讨论的,从环境变量$FRAMEBUFFER获取当前帧缓冲设备.你也可以设定颜色位深,使用Depth关键字,使用Virtual设定虚拟分辨率。这也是默认设置。-然而你也可以通过设定/etc/XF86Config,改变分辨率。这样有很多灵活性,唯一的不足就是你必须设定刷新频率。可以用fbset-x通过fbset或xvidtune切换显示模式。5.视频模式频率CRT显示器是用3个电子枪轰击磷粉完成颜色的显示的。电子枪从左到右的水平扫描,并从上至下的垂直扫描。通过改变枪的电压,所显示的颜色可以不同。当电子枪完成一行扫描重新回到下一行的开始,被称作“水平折回”。当一屏幕全部扫
9、描完毕,电子枪将回到最左上脚,被成为“垂直折回”。在折回的途中电子枪是关闭的。电子枪打点的移动速度取决于点时钟。如果点时钟是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我们就认为水平扫描的频率是31KHz:1/(32.141E-6s)=31.113E3Hz一屏幕含有480行,加上垂直折回时间49,一屏所需
10、的时间:(480+49)*32.141E-6s=17.002E-3s我们就认为垂直扫描的频率是59Hz:1/(17.002E-3s)=58.815Hz这也意味着屏幕数据每秒钟刷新59次。为了得到稳定的图像显示效果,VESA垂直扫描频率不低于72Hz。但是也因人而异,有些人50Hz感觉不到任何问题,有些至少在80Hz以上才可以。由于显示器不知道什么时候新行开始扫描,显卡为每一行扫描提供水平同步信号。类似的,他也为每一帧显示提供垂直同步信号。图像在屏幕上点的位置取决于这些同步信号的发生时刻。下图给出了所有时序的概要。水平折回的时间就是左边空白右边空白水平同步长度。垂直折回的时间就是上空白下空白垂直
11、同步长。+|upper_margin|?|+#+|#|#|#|#|#|#|#|left#|#right|hsync|margin#|xres#margin|len|#|#|#|#|#|#|#|#|yres#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#?#|+#+|lower_margin|?|+|vsync_len|?|+6.把XFree86时序变成framebufferdevice时序典型的显示模式:800 x600508008569761040600637643666DCFHRSH1SH2HFLVRSV1SV2VFL而帧缓冲设备使用下面的参数:-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.引用获取更多关于帧缓冲设备以及应用的参考,请访问: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/帧缓冲设备的内部数据结构(internals.txt)GeertUytterhoeven,21July1998帧缓冲设备中用到的结构体以下数据结构在帧缓冲设备使用,定义。1.Outsidethekernel(userspace)-structfb_fix_screeninfo帧缓冲设备中设备无关的常值数据信息。可以通过Ioctl的FBIOGET_FSCREENINFO获
15、取。-structfb_var_screeninfo帧缓冲设备中设备无关的变量数据信息和特定的显示模式。可以通过iotcl的FBIOGET_VSCREENINFO获取,并通过ioctl的FBIOPUT_VSCREENINFO设定。还有FBIOPAN_DISPLAY可以用。-structfb_cmap设备无关的颜色表信息。你可以通过ioctl的FBIOGETCMAP和FBIOPUTCMAP读取或设定。2.Insidethekernel-structfb_info常规信息,API以及帧缓冲设备的底层信息(主板地址.).-structpar唯一指定该设备的显示模式的设备相关信息。-structdis
16、play帧缓冲设备和控制台驱动之间的接口。*常用的帧缓冲API*Monochrome(FB_VISUAL_MONO01andFB_VISUAL_MONO10)每个象素是黑或白。Pseudocolor(FB_VISUAL_PSEUDOCOLORandFB_VISUAL_STATIC_PSEUDOCOLOR)索引颜色显示Truecolor(FB_VISUAL_TRUECOLOR)真彩显示,分成红绿兰三基色Directcolor(FB_VISUAL_DIRECTCOLOR)每个象素颜色也是有红绿蓝组成,不过每个颜色值是个索引,需要查表。Grayscaledisplays灰度显示,红绿蓝的值都一样准备
17、开始写我们自己的驱动之前,请详细阅读如下文件:Documentationfb目录vesafb.txt,matroxfb.txt,sa1100fb.txtdriversvideo目录fbmem.c,fbgen.c,fbmon.c,fbcmap.cskeletonfb.cvesafb.c,sa1100fb.c,sa1100fb.hincludelinux目录fb.h最值得关注的是skeletonfb.c,该文件给出了一个fbdevice驱动的框架准备好了,就开始写自己的frambufferdevicedriver。framebuffer驱动全篇(二)还是要补充点,下面是/linux/fb.h的部分
18、注释,加粗的是常用的,红色是关键的,一般不可少。旁边没有汉字,要么很简单没必要加注,要么就用不到!注释:good02xaut#ifndef_LINUX_FB_H#define_LINUX_FB_H#include#include/*Definitionsofframebuffers*/#defineFB_MAJOR29/*主设备号*/#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*/*上面的宏定义不用关心*/*不可修改的屏幕信息,用户空间可见*/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每行的字节数*/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.*/*像素所占字节内,各个颜色的位分配比如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驱动程序模型下图会向你展示目前的framebuffer设备驱动的结构,最常用的是非标准驱动。很明显他所处的层次最高,程序编写是最容易的。理解了这个图的,你已经很轻松的去完成一个fb驱动,比如给sa1100,s2410,s2440系列的ARM的LCD控制器写驱动。framebuffer驱动全篇(三)ColorMap剖析在framebuffer驱动程序设计中,cmap
37、这个东东太晕了。现在我要把他赤裸裸的剖析给大家:)1structfb_cmap/*颜色映射表*/structfb_cmap_u32start;/*Firstentry*/_u32len;/*Numberofentries*/_u16*red;/*红色*/_u16*green;/*绿色*/_u16*blue;/*蓝色*/_u16*transp;/*透明度,允许NULL*/;该结构在fb.h文件中定义,在structfb_ops结构中有两个成员函数与其相关:/*获取颜色表*/int(*fb_get_cmap)(structfb_cmap*cmap,intkspc,intcon,structfb_i
38、nfo*info);/*设定颜色表*/int(*fb_set_cmap)(structfb_cmap*cmap,intkspc,intcon,structfb_info*info);在structfb_info结构中有变量:structfb_cmapcmap;/*Currentcmap*/在fpgen基础操作下提供: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应用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驱动全篇(四)本文介绍的设备是位于/v
41、ideo目录下面的anakinfb.c驱动程序。虽然我不清楚那个设备的特性,但是从对程序的分析中我们仍然知道如何编写一个framebuffer设备驱动。本文是个标准的fb驱动。共221行,包含函数如下: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行函数1,2是寄存器操作用。函数3,4,5,6,7是fb_ops函数函数8用于切换控制台函数9用于更新变量函数10用于闪烁屏幕函数11用于初始化设备很奇怪,对fb设备的读写函数怎么没有!值得说明的是open,release,read,write,ioctl,mmap等函数的实现是由fbmem.c文件实现了。也就是说所有的fb设备在给定了fb_info后,所有的操作都是一样的。在明确的fb_info前提下,fbmem.c中的函数可以工作的很好。这样大家应该感到非常轻松了吧,只要完成上
45、述的几个设备相关的函数,framebuffer设备的驱动就写完了:)系统的结构如图:Stifb驱动模型linux/drivers/video/stifb.c-GenericframebufferdriverforHP*workstationswithSTI(standardtextinterface)videofirmware.这个驱动程序和前面的anakin设备完全不同,因为他不是采用标准的格式,而是根据basedonskeletonfb,whichwasCreated28Dec1997byGeertUytterhoeven也就是skeletonfb.c提供的框架完成的。共230行,包含函数
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系统调用结构图:Framebuffer与consoleFramebuffer作为显卡在内核中的注册设备,为了满足应用需要,通常还要为console操作提供专用操作函数。Console是系统提供的一种特殊的文本输出终端,如图所示。常用的console已经不再是从前的单色显示,而是16色或者更多颜色显示。根据文本的代表的不同属性,显示不同的颜色。把对console的支持内嵌到fb的驱动中,或许有其自己的道
50、理,我没有看出来。不过既然要提供这种支持,我们的驱动程序就要添枝加叶了。在准fb设备设备驱动中是没有对console支持的。只有在非标准的fb驱动,也就是基于skeletonfb.c架构的程序,需要提供这部分代码。下面从各个方面介绍framebuffer对console的支持。1.各个文件中的支持fb.h文件中structfb_info结构中: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中的颜色设定该部分内容准备略掉,可以自行参考fbcon-cfb*.c文件。3.console和fb的高层理解当我们在fb中引入console后,就相当于把一张白纸变成了一个日记本。本来对于fb来说只有颜色和位置的关系,引入console后,首先就是console的描述。每个console相当于日记本的一页,不同的console可以切换。Console因为是要显示文本,又和字体联系到一起。
53、Console的管理是十分复杂的,远远超过了framebuffer本身。在RH9中,我们可以自己体验一下console和fb的协调问题。使用Init3多用户模式登陆,这里是没有Xserver支持的。所有的输入输出都是基于console的。Framebuffer就相当于你的显示器。通过ALT+CTRL+F*,我们可以切换到不同的console,而每个console的设置都可以很独立的完成。每隔console会在自己的数据区记录历史命令,在不同的console可以登陆不同的用户到系统。但是,因为只有一个屏幕,所以当前可视的console只有一个。Framebuffer驱动程序要能够根据ALT+CT
54、RL+F*切换命令去完成console的切换显示。这样大家应该明白framebuffer和console的关系了吧。后续我们会具体讲述fb对console的支持。但是对console本身不会设计太多,具体参考tty或console的设计。当完成了fb对console的支持,framebufferdevicedriver设计就完了:)framebuffer驱动全篇(五)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产生。/include/video/目录下:font.h1首先介绍font.h文件font.h文件中,定义了字体的描述结构structfbcon_font_descintidx;/字体的索引号char*name;/字体的描述intwidth,height;/字模的宽和高void*data;/字模的起始指针intpref;/额外信息,平台用;width的值不一定是8的整数倍,考虑到计算机存储的问题,即使width小于8的整数倍,存储时仍以字节为单位,不足的右补齐0。Linux内核自带了7种字体,name依次为:font_vga_8x8,font_vga_8x16,font_pearl_8x8,font_vga_6x11,font_sun_8x16,font_sun_12x22,font_acorn_8x8;根据定义na
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 品牌生产合同协议
- 品类达人合同协议
- 商业房产证合同协议
- 员工劳动协议书范本
- 商场改衣坊合同协议
- 民宿投资入股合同协议
- 商场员工聘用合同协议
- 2025年管理信息系统应用软件工程合同
- 模特服装买卖合同协议
- 楼顶大字施工合同协议
- 学校项目工程监理规划
- 第9课 两宋的政治和军事 说课课件(共19张PPT)- 人教统编版高中历史必修中外历史纲要上册
- 安徽生源化工有限公司100000吨年萘磺酸甲醛缩合物、3000吨年铸造用固化剂、2000吨年二苄胺、200吨年氯丙酰谷氨酰胺项目环境影响评价报告全本
- 湖北省高等学校教学成果奖推荐书、申请简表
- DB62∕T 25-3111-2016 建筑基坑工程技术规程
- 幼儿园三会一课制度3篇
- DB33∕T 2196-2019 水利工程标识牌设置规范
- UPS基础知识培训教材PPT(76张)课件
- (高清版)外墙外保温工程技术标准JGJ144-2019
- 几种常见林业行政处罚案件证据标准
- 内政字[2004]436号
评论
0/150
提交评论