ImageVerifierCode 换一换
格式:DOCX , 页数:56 ,大小:39.80KB ,
资源ID:13211602      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-13211602.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(关于linux的fbframebuffer 设备驱动.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

关于linux的fbframebuffer 设备驱动.docx

1、关于linux的fbframebuffer 设备驱动草稿V2.4.01framebuffer设备即帧缓冲设备(简写fb)提供了显示接口的抽象描述。他同时代表着显示接口的存储区,应用程序通过定义好的函数访问,不需要知道底层的任何操作。Framebuffer驱动使用的设备节点,通常位于/dev目录,如/dev/fb*.从用户角度看,fb设备和其他/dev下面的设备类似:普通的字符设备,主设备号29,次设备号定义fb的索引。通常,使用如下方式(前面的数字表示次设备号)0=/dev/fb0第一个fb设备1=/dev/fb1第二个fb设备考虑到向下兼容,可以创建符号链接:/dev/fb0current-

2、fb0/dev/fb1current-fb1fb也是一种普通的内存设备,可以读写其内容。例如,屏幕抓屏:cp/dev/fb0myfilefb虽然可以像内存设备(/dev/mem)一样,对其read,write,seek以及mmap。但区别在于fb使用的不是整个内存区,而是显存部分。通过ioctl可以读取或设定fb设备参数,很重要的一点,颜色表(cmap)也要通过Ioctl设定。查看就知道有多少ioctl应用以及相关数据结构。这里给出摘要:-你可以获取设备一些不变的信息,如设备名,屏幕的组织(平面,象素,.)对应内存区的长度和起始地址。-也可以获取能够改变的信息,例如位深,颜色格式,时序等。如果

3、你改变这些值,驱动程序将对值进行优化,以满足设备特性(如果你的设定,设备不支持,返回EINVAL)。-你也可以获取或设定部分颜色表。所有这些特性让应用程序十分容易的使用framebuffer设备。Xserver可以使用/dev/fb*而不需知道硬件的寄存器是如何组织的。XF68_FBDev是一个用于位映射(单色)Xserver,唯一要做的就是在应用程序在相应的位置设定是否显示。在新内核中,帧缓冲设备可以工作于模块中,允许动态加载。这类驱动必须调用register_framebuffer()在系统中注册。之所以对视频模式进行介绍,因为在后面的一些数据结构中,会出现对视频模式的参数描述。CRT显示

4、器用3个电子枪轰击磷粉完成颜色的显示。电子枪必须完成从左到草稿V2.4.02右的水平扫描和从上至下的垂直扫描。改变枪的电压,对应显示的颜色可以不同。当电子枪完成一行扫描重新回到下一行的开始,被称为“水平折回”。当一屏幕全部扫描完毕,电子枪从底部回到左上角,被称为“垂直折回”。在折回的途中电子枪是关闭的。电子枪打点的移动速度取决于点时钟。如果点时钟是28.37516MHz,打一个点需要35242ps。1/(28.37516E6Hz)=35.242E-9s如果屏幕分辨率是640x480,那么一行的时间是:640*35.242E-9s=22.555E-6s然而水平折回也是需要时间的,通常272个点时

5、钟单位,因此扫描一行需要的时间就是:(640+272)*35.242E-9s=32.141E-6s由此得到水平扫描的频率是31KHz:1/(32.141E-6s)=31.113E3Hz若屏幕有480行,加上垂直折回时间49个行时钟单位,刷新一屏所需时间:(480+49)*32.141E-6s=17.002E-3s由此得到垂直扫描的频率是59Hz:1/(17.002E-3s)=58.815Hz这意味着屏幕数据每秒钟刷新59次。为了得到稳定的图像显示效果,VESA标准规定垂直扫描频率不低于72Hz。但也因人而异,有些人在50Hz时就感觉不到闪烁,而另一些则要在80Hz以上才可。由于显示器不知道何时

6、开始新的一行扫描,因此需要为行扫描提供水平同步信号。类似的,也为每一帧显示提供垂直同步信号。图像在屏幕上点的位置取决于这些同步信号的发生时刻。下图给出了所有时序的概要。水平折回的时间就是左边空白右边空白水平同步长度。垂直折回的时间就是上空白下空白垂直同步长。+-+-+-+-+|upper_margin|?|+-#-+-+|#|left#|#right|hsync|margin#|xres#margin|len|#|#|#|#|#|#|yres#|#|#|#|#|#|#|#?#|草稿V2.4.03+-#-+-+|lower_margin|?|+-+-+-+-+|vsync_len|?|+-+-+

7、-+-+把XFree86时序变成fb时序典型的显示模式:800x600508008569761040600637643666DCFHRSH1SH2HFLVRSV1SV2VFL而帧缓冲设备使用下面的参数:-pixclock:点时钟inps(picoseconds)-left_margin:timefromsynctopicture-right_margin:timefrompicturetosync-upper_margin:timefromsynctopicture-lower_margin:timefrompicturetosync-hsync_len:lengthofhorizontals

8、ync-vsync_len:lengthofverticalsync1)Pixelclock:xfree:inMHzfb:inpicoseconds(ps)pixclock=1000000/DCF2)horizontaltimings:left_margin=HFL-SH2right_margin=SH1-HRhsync_len=SH2-SH13)verticaltimings:upper_margin=VFL-SV2lower_margin=SV1-VRvsync_len=SV2-SV112下面给出了一个framebuffer驱动例子,并添加详细注释。通过阅读该例,希望大家对framebuf

9、fer驱动初步了解。后面我们将分析用到的数据结构,以及草稿V2.4.04其中成员变量和成员函数的功能和意义。/*linux/drivers/video/anakinfb.c*Copyright(C)2001AlephOneLtd.forAcuniaN.V.*Thisprogramisfreesoftware;youcanredistributeitand/ormodify*itunderthetermsoftheGNUGeneralPublicLicenseversion2as*publishedbytheFreeSoftwareFoundation.*Changelog:23-Apr-200

10、1TTCCreated*/#include#include#include#include#include#include#include#include#includestaticu16colreg16;/颜色描述表,cmap的简化描述staticintcurrcon=0;/当前的console索引staticstructfb_infofb_info;staticstructdisplaydisplay;staticintanakinfb_getcolreg(u_intregno,u_int*red,u_int*green,u_int*blue,u_int*transp,structfb_i

11、nfo*info)if(regno15)/共有16色,故索引不大于15return1;/颜色描述的位深16位,分别是R:G:B=5:6:5;后面的补齐操作采用了左移低位补齐方式,只要和setcloreg运算相反即可,也可以使用高位补齐方式。*red=colregregno&0xf800;*green=colregregno&0x7e05;/移到高字节,凑足16位*blue=colregregno&0x1f15)return1;/根据索引,设置颜色表的颜色值colregregno=(red&0xf800)|(green&0xfc005)|(blue&0xf80011);return0;/从fb_

12、info结构获取fb_fix_screeninfo信息。由于我们在anakinfb_init中并没有设置fb_info.fix的值,所以只有在此函数内通过常值赋予。staticintanakinfb_get_fix(structfb_fix_screeninfo*fix,intcon,structfb_info*info)/fix全部为0memset(fix,0,sizeof(structfb_fix_screeninfo);/id作为字符串标识用strcpy(fix-id,AnakinFB);/显存的起始物理地址fix-smem_start=VGA_START;/显存所占的字节数fix-sm

13、em_len=VGA_SIZE;/象素显示fix-type=FB_TYPE_PACKED_PIXELS;/下面的略,参考后面fb_fix_srceeninfo结构fix-type_aux=0;fix-visual=FB_VISUAL_TRUECOLOR;fix-xpanstep=0;fix-ypanstep=0;fix-ywrapstep=0;/每行所占字节数,xres400fix-line_length=400*2;/显卡无硬件加速fix-accel=FB_ACCEL_NONE;return0;staticintanakinfb_get_var(structfb_var_screeninfo

14、*var,intcon,structfb_info*info)/var初始化为0memset(var,0,sizeof(structfb_var_screeninfo);/x方向分辨率草稿V2.4.06var-xres=400;/y方向分辨率var-yres=234;/虚拟分辨率,不支持pan,故和实际分辨率一致var-xres_virtual=400;var-yres_virtual=234;var-xoffset=0;var-yoffset=0;/色深16位,5:6:5结构var-bits_per_pixel=16;/彩色,非灰度,bppgrayscale=0;/根据R:G:B5:6:5得

15、下面数据var-red.offset=11;var-red.length=5;var-green.offset=5;var-green.length=6;var-blue.offset=0;var-blue.length=5;/不支持透明度var-transp.offset=0;var-transp.length=0;var-nonstd=0;var-activate=FB_ACTIVATE_NOW;/下面解释略var-height=-1;var-width=-1;var-pixclock=0;var-left_margin=0;var-right_margin=0;var-upper_mar

16、gin=0;var-lower_margin=0;var-hsync_len=0;var-vsync_len=0;var-sync=0;var-vmode=FB_VMODE_NONINTERLACED;return0;/此函数直接返回,表明fb_var_screeninfo是不希望被修改的,这和显示器有关。若显示模式只有400*234*16一种,则set_var没有意义。staticintanakinfb_set_var(structfb_var_screeninfo*var,intcon,structfb_info*info)草稿V2.4.07return-EINVAL;/获取颜色表stat

17、icintanakinfb_get_cmap(structfb_cmap*cmap,intkspc,intcon,structfb_info*info)if(con=currcon)/通常会成立returnfb_get_cmap(cmap,kspc,anakinfb_getcolreg,info);elseif(fb_displaycon.cmap.len)fb_copy_cmap(&fb_displaycon.cmap,cmap,kspc?0:2);elsefb_copy_cmap(fb_default_cmap(16),cmap,kspc?0:2);return0;/设置颜色表static

18、intanakinfb_set_cmap(structfb_cmap*cmap,intkspc,intcon,structfb_info*info)interr;if(!fb_displaycon.cmap.len)if(err=fb_alloc_cmap(&fb_displaycon.cmap,16,0)returnerr;if(con=currcon)/通常会成立returnfb_set_cmap(cmap,kspc,anakinfb_setcolreg,info);elsefb_copy_cmap(cmap,&fb_displaycon.cmap,kspc?0:1);return0;/c

19、onsole切换staticintanakinfb_switch_con(intcon,structfb_info*info)currcon=con;return0;/通知console更新varstaticintanakinfb_updatevar(intcon,structfb_info*info)return0;草稿V2.4.08/开关显示用staticvoidanakinfb_blank(intblank,structfb_info*info)/*TODO:useI2Ctoblank/unblankthescreen*/定义structfb_ops结构staticstructfb_op

20、sanakinfb_ops=owner:THIS_MODULE,fb_get_fix:anakinfb_get_fix,fb_get_var:anakinfb_get_var,fb_set_var:anakinfb_set_var,fb_get_cmap:anakinfb_get_cmap,fb_set_cmap:anakinfb_set_cmap,;/fb驱动初始化函数int_initanakinfb_init(void)/fb_info变量全部置0memset(&fb_info,0,sizeof(structfb_info);/对fb_info.modename赋值为”AnakinFB”s

21、trcpy(fb_info.modename,AnakinFB);/fb_info.node=-1,后面调用register_framebuffer,会重新设该值为/dev/fbx节点fb_info.node=-1;/fb_info.flags指明fb驱动的内核加载方式fb_info.flags=FBINFO_FLAG_DEFAULT;/定义fb_info的fopsfb_info.fbops=&anakinfb_ops;/fb_info.disp是提供fbcon的基础fb_info.disp=&display;/fb_info.fontname表示fbcon采用的字体为VGA8X16strcp

22、y(fb_info.fontname,VGA8x16);fb_info.changevar=NULL;/console切换时调用函数anakinfb_switch_confb_info.switch_con=&anakinfb_switch_con;/下面2个函数没有操作,直接返回fb_info.updatevar=&anakinfb_updatevar;fb_info.blank=&anakinfb_blank;/display初始化为0草稿V2.4.09memset(&display,0,sizeof(structdisplay);/对display.var赋值,参考anakinfb_ge

23、t_var函数anakinfb_get_var(&display.var,0,&fb_info);/显存的起始地址display.screen_base=ioremap(VGA_START,VGA_SIZE);/显示的颜色模式display.visual=FB_VISUAL_TRUECOLOR;/象素display.type=FB_TYPE_PACKED_PIXELS;display.type_aux=0;display.ypanstep=0;display.ywrapstep=0;/每行字节数,每行400象素,16位色深,故400*2display.line_length=400*2;dis

24、play.can_soft_blank=1;/颜色反转显示标志display.inverse=0;#ifdefFBCON_HAS_CFB16/内核配置参数/fbcon的底层操作函数display.dispsw=&fbcon_cfb16;/辅助数据,意义不大display.dispsw_data=colreg;#else/此情况基本不会发生display.dispsw=&fbcon_dummy;#endif/注册framebufferif(register_framebuffer(&fb_info)0)return-EINVAL;MOD_INC_USE_COUNT;return0;MODULE_

25、AUTHOR(Tak-ShingChan);MODULE_DESCRIPTION(Anakinframebufferdriver);MODULE_SUPPORTED_DEVICE(fb);Thefb_opsStructureThestructureishowaframebufferdriversetsupthisconnection.Thestructure,definedin,isacollectionoffunctionpointers.Eachopenfile(representedinternallybyafilestructure,whichwewillexamineshortly)

26、isassociatedwithitsownsetoffunctions(byincludingafieldcalledfb_opthatpointstoafile_operationsstructure).Theoperationsare草稿V2.4.010mostlyinchargeofimplementingthesystemcallsandaretherefore,namedopen,read,andsoon.Wecanconsiderthefiletobean“object”andthefunctionsoperatingonittobeits“methods,”usingobjec

27、t-orientedprogrammingterminologytodenoteactionsdeclaredbyanobjecttoactonitself.Thisisthefirstsignofobject-orientedprogrammingweseeintheLinuxkernel,andwellseemoreinlaterchapters.Conventionally,afile_operationsstructureorapointertooneiscalledfbops(orsomevariationthereof).Eachfieldinthestructuremustpointtothefunctioninthedriverthatimplementsaspecificoperation,orbeleftNULLforunsupportedoperations.Theexactbehavioro

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2