[ZLG-ARM] FrameBuffer的原理

[复制链接]
 楼主| armpc 发表于 2009-6-2 13:25 | 显示全部楼层 |阅读模式
一、FrameBuffer的原理<br />&nbsp;&nbsp;&nbsp;&nbsp;FrameBuffer&nbsp;是出现在&nbsp;2.2.xx&nbsp;内核当中的一种驱动程序接口。<br />&nbsp;&nbsp;&nbsp;&nbsp;Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出&nbsp;FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过&nbsp;Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由&nbsp;Framebuffer设备驱动来完成的。<br />&nbsp;&nbsp;&nbsp;&nbsp;但Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池.CPU将运算后的结果放到这个水池,水池再将结果流到显示器.&nbsp;中间不会对数据做处理.&nbsp;应用程序也可以直接读写这个水池的内容.在这种机制下,尽管Framebuffer需要真正的显卡驱动的支持,但所有显示任务都有CPU完成,因此CPU&nbsp;负担很重<br />framebuffer的设备文件一般是&nbsp;/dev/fb0、/dev/fb1&nbsp;等等。<br />可以用命令:&nbsp;#dd&nbsp;if=/dev/zero&nbsp;of=/dev/fb&nbsp;清空屏幕.<br />如果显示模式是&nbsp;1024x768-8&nbsp;位色,用命令:$&nbsp;dd&nbsp;if=/dev/zero&nbsp;of=/dev/fb0&nbsp;bs=1024&nbsp;count=768&nbsp;清空屏幕;<br />用命令:&nbsp;#dd&nbsp;if=/dev/fb&nbsp;of=fbfile&nbsp;&nbsp;可以将fb中的内容保存下来;<br />可以重新写回屏幕:&nbsp;#dd&nbsp;if=fbfile&nbsp;of=/dev/fb;<br />在使用Framebuffer时,Linux是将显卡置于图形模式下的.<br />&nbsp;&nbsp;&nbsp;&nbsp;在应用程序中,一般通过将&nbsp;FrameBuffer&nbsp;设备映射到进程地址空间的方式使用,比如下面的程序就打开&nbsp;/dev/fb0&nbsp;设备,并通过&nbsp;mmap&nbsp;系统调用进行地址映射,随后用&nbsp;memset&nbsp;将屏幕清空(这里假设显示模式是&nbsp;1024x768-8&nbsp;位色模式,线性内存模式):<br />int&nbsp;fb;<br />unsigned&nbsp;char*&nbsp;fb_mem;<br />fb&nbsp;=&nbsp;open&nbsp;('/dev/fb0',&nbsp;O_RDWR);<br />fb_mem&nbsp;=&nbsp;mmap&nbsp;(NULL,&nbsp;1024*768,&nbsp;PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);<br />memset&nbsp;(fb_mem,&nbsp;0,&nbsp;1024*768);&nbsp;//这个命令应该只有在root可以执行<br />&nbsp;&nbsp;&nbsp;&nbsp;FrameBuffer&nbsp;设备还提供了若干&nbsp;ioctl&nbsp;命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。<br />&nbsp;&nbsp;&nbsp;&nbsp;通过&nbsp;FrameBuffer&nbsp;设备,还可以获得当前内核所支持的加速显示卡的类型(通过固定信息得到),这种类型通常是和特定显示芯片相关的。比如目前最新的内核(2.4.9)中,就包含有对&nbsp;S3、Matrox、nVidia、3Dfx&nbsp;等等流行显示芯片的加速支持。在获得了加速芯片类型之后,应用程序就可以将&nbsp;PCI&nbsp;设备的内存I/O(memio)映射到进程的地址空间。这些&nbsp;memio&nbsp;一般是用来控制显示卡的寄存器,通过对这些寄存器的操作,应用程序就可以控制特定显卡的加速功能。<br />&nbsp;&nbsp;&nbsp;&nbsp;PCI&nbsp;设备可以将自己的控制寄存器映射到物理内存空间,而后,对这些控制寄存器的访问,给变成了对物理内存的访问。因此,这些寄存器又被称为'memio'。一旦被映射到物理内存,Linux&nbsp;的普通进程就可以通过&nbsp;mmap&nbsp;将这些内存&nbsp;I/O&nbsp;映射到进程地址空间,这样就可以直接访问这些寄存器了。<br />&nbsp;&nbsp;&nbsp;&nbsp;当然,因为不同的显示芯片具有不同的加速能力,对memio&nbsp;的使用和定义也各自不同,这时,就需要针对加速芯片的不同类型来编写实现不同的加速功能。比如大多数芯片都提供了对矩形填充的硬件加速支持,但不同的芯片实现方式不同,这时,就需要针对不同的芯片类型编写不同的用来完成填充矩形的函数。<br />&nbsp;&nbsp;&nbsp;&nbsp;FrameBuffer&nbsp;只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在&nbsp;FrameBuffer&nbsp;之上进行图形编程,还需要自己动手完成其他许多工作。<br />二、FrameBuffer在Linux中的实现和机制<br />Framebuffer对应的源文件在linux/drivers/video/目录下。总的抽象设备文件为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。&nbsp;&nbsp;&nbsp;//这个文件要好好看看<br />(一)、分析Framebuffer设备驱动<br />&nbsp;&nbsp;&nbsp;&nbsp;需要特别提出的是在INTEL平台上,老式的VESA&nbsp;1.2&nbsp;卡,如CGA/EGA卡,是不能支持Framebuffer的,因为Framebuffer要求显卡支持线性帧缓冲,即CPU可以访问显缓冲中的每一位,但是VESA&nbsp;1.2&nbsp;卡只能允许CPU一次访问64K的地址空间。<br />FrameBuffer设备驱动基于如下两个文件:<br />1)&nbsp;linux/include/linux/fb.h<br />2)&nbsp;linux/drivers/video/fbmem.c<br />下面分析这两个文件。<br />1、fb.h<br />&nbsp;&nbsp;&nbsp;几乎主要的结构都是在这个中文件定义的。这些结构包括:<br />1)fb_var_screeninfo<br />&nbsp;&nbsp;&nbsp;这个结构描述了显示卡的特性:<br />NOTE::::&nbsp;&nbsp;&nbsp;__u32&nbsp;是表示&nbsp;unsigned&nbsp;不带符号的&nbsp;32&nbsp;bits&nbsp;的数据类型,其余类推。这是&nbsp;Linux&nbsp;内核中所用到的数据类型,如果是开发用户空间(user-space)的程序,可以根据具体计算机平台的情况,用&nbsp;unsigned&nbsp;long&nbsp;等等来代替<br />struct&nbsp;fb_var_screeninfo<br />{<br />__u32&nbsp;xres;&nbsp;/*&nbsp;visible&nbsp;resolution&nbsp;*/&nbsp;&nbsp;&nbsp;//可视区域<br />__u32&nbsp;yres;<br />__u32&nbsp;xres_virtual;&nbsp;/*&nbsp;virtual&nbsp;resolution&nbsp;*/&nbsp;&nbsp;//可视区域<br />__u32&nbsp;yres_virtual;<br />__u32&nbsp;xoffset;&nbsp;/*&nbsp;offset&nbsp;from&nbsp;virtual&nbsp;to&nbsp;visible&nbsp;resolution&nbsp;*/&nbsp;//可视区域的偏移<br />__u32&nbsp;yoffset;<br />__u32&nbsp;bits_per_pixel;&nbsp;/*&nbsp;guess&nbsp;what&nbsp;*/&nbsp;&nbsp;//每一象素的bit数<br />__u32&nbsp;grayscale;&nbsp;/*&nbsp;!=&nbsp;0&nbsp;Gray&nbsp;levels&nbsp;instead&nbsp;of&nbsp;colors&nbsp;*///等于零就成黑白<br />struct&nbsp;fb_bitfield&nbsp;red;&nbsp;/*&nbsp;bitfield&nbsp;in&nbsp;fb&nbsp;mem&nbsp;if&nbsp;true&nbsp;color,&nbsp;*/真彩的bit机构<br />struct&nbsp;fb_bitfield&nbsp;green;&nbsp;/*&nbsp;else&nbsp;only&nbsp;length&nbsp;is&nbsp;significant&nbsp;*/<br />struct&nbsp;fb_bitfield&nbsp;blue;&nbsp;&nbsp;&nbsp;<br />struct&nbsp;fb_bitfield&nbsp;transp;&nbsp;/*&nbsp;transparency&nbsp;*/&nbsp;&nbsp;透明<br />__u32&nbsp;nonstd;&nbsp;/*&nbsp;!=&nbsp;0&nbsp;Non&nbsp;standard&nbsp;pixel&nbsp;format&nbsp;*/&nbsp;不是标准格式<br />__u32&nbsp;activate;&nbsp;/*&nbsp;see&nbsp;FB_ACTIVATE_*&nbsp;*/&nbsp;<br />__u32&nbsp;height;&nbsp;/*&nbsp;height&nbsp;of&nbsp;picture&nbsp;in&nbsp;mm&nbsp;*/&nbsp;内存中的图像高度<br />__u32&nbsp;width;&nbsp;/*&nbsp;width&nbsp;of&nbsp;picture&nbsp;in&nbsp;mm&nbsp;*/&nbsp;内存中的图像宽度<br />__u32&nbsp;accel_flags;&nbsp;/*&nbsp;acceleration&nbsp;flags&nbsp;(hints)&nbsp;*/&nbsp;加速标志<br />/*&nbsp;Timing:&nbsp;All&nbsp;values&nbsp;in&nbsp;pixclocks,&nbsp;except&nbsp;pixclock&nbsp;(of&nbsp;course)&nbsp;*/<br />时序-_-这些部分就是显示器的显示方法了,可以找相关的资料看看<br />__u32&nbsp;pixclock;&nbsp;/*&nbsp;pixel&nbsp;clock&nbsp;in&nbsp;ps&nbsp;(pico&nbsp;seconds)&nbsp;*/<br />__u32&nbsp;left_margin;&nbsp;/*&nbsp;time&nbsp;from&nbsp;sync&nbsp;to&nbsp;picture&nbsp;*/<br />__u32&nbsp;right_margin;&nbsp;/*&nbsp;time&nbsp;from&nbsp;picture&nbsp;to&nbsp;sync&nbsp;*/<br />__u32&nbsp;upper_margin;&nbsp;/*&nbsp;time&nbsp;from&nbsp;sync&nbsp;to&nbsp;picture&nbsp;*/<br />__u32&nbsp;lower_margin;<br />__u32&nbsp;hsync_len;&nbsp;/*&nbsp;length&nbsp;of&nbsp;horizontal&nbsp;sync&nbsp;*/&nbsp;&nbsp;水平可视区域<br />__u32&nbsp;vsync_len;&nbsp;/*&nbsp;length&nbsp;of&nbsp;vertical&nbsp;sync&nbsp;*/&nbsp;&nbsp;&nbsp;垂直可视区域<br />__u32&nbsp;sync;&nbsp;/*&nbsp;see&nbsp;FB_SYNC_*&nbsp;*/<br />__u32&nbsp;vmode;&nbsp;/*&nbsp;see&nbsp;FB_VMODE_*&nbsp;*/<br />__u32&nbsp;reserved[6];&nbsp;/*&nbsp;Reserved&nbsp;for&nbsp;future&nbsp;compatibility&nbsp;*/&nbsp;备用-以后开发<br />};<br />2)&nbsp;fb_fix_screeninfon<br />这个结构在显卡被设定模式后创建,它描述显示卡的属性,并且系统运行时不能被修改;比如FrameBuffer内存的起始地址。它依赖于被设定的模式,当一个模式被设定后,内存信息由显示卡硬件给出,内存的位置等信息就不可以修改。<br />struct&nbsp;fb_fix_screeninfo&nbsp;{<br />char&nbsp;id[16];&nbsp;/*&nbsp;identification&nbsp;string&nbsp;eg&nbsp;'TT&nbsp;Builtin'&nbsp;*/ID<br />unsigned&nbsp;long&nbsp;smem_start;&nbsp;/*&nbsp;Start&nbsp;of&nbsp;frame&nbsp;buffer&nbsp;mem&nbsp;*/&nbsp;内存起始<br />/*&nbsp;(physical&nbsp;address)&nbsp;*/&nbsp;物理地址<br />__u32&nbsp;smem_len;&nbsp;/*&nbsp;Length&nbsp;of&nbsp;frame&nbsp;buffer&nbsp;mem&nbsp;*/&nbsp;内存大小<br />__u32&nbsp;type;&nbsp;/*&nbsp;see&nbsp;FB_TYPE_*&nbsp;*/&nbsp;<br />__u32&nbsp;type_aux;&nbsp;/*&nbsp;Interleave&nbsp;for&nbsp;interleaved&nbsp;Planes&nbsp;*/插入区域?<br />__u32&nbsp;visual;&nbsp;/*&nbsp;see&nbsp;FB_VISUAL_*&nbsp;*/<br />__u16&nbsp;xpanstep;&nbsp;/*&nbsp;zero&nbsp;if&nbsp;no&nbsp;hardware&nbsp;panning&nbsp;*/没有硬件设备就为零<br />__u16&nbsp;ypanstep;&nbsp;/*&nbsp;zero&nbsp;if&nbsp;no&nbsp;hardware&nbsp;panning&nbsp;*/<br />__u16&nbsp;ywrapstep;&nbsp;/*&nbsp;zero&nbsp;if&nbsp;no&nbsp;hardware&nbsp;ywrap&nbsp;*/<br />__u32&nbsp;line_length;&nbsp;/*&nbsp;length&nbsp;of&nbsp;a&nbsp;line&nbsp;in&nbsp;bytes&nbsp;*/&nbsp;一行的字节表示<br />unsigned&nbsp;long&nbsp;mmio_start;&nbsp;/*&nbsp;Start&nbsp;of&nbsp;Memory&nbsp;Mapped&nbsp;I/O&nbsp;*/内存映射的I/O起始<br />/*&nbsp;(physical&nbsp;address)&nbsp;*/&nbsp;<br />__u32&nbsp;mmio_len;&nbsp;/*&nbsp;Length&nbsp;of&nbsp;Memory&nbsp;Mapped&nbsp;I/O&nbsp;*/&nbsp;I/O的大小<br />__u32&nbsp;accel;&nbsp;/*&nbsp;Type&nbsp;of&nbsp;acceleration&nbsp;available&nbsp;*/&nbsp;可用的加速类型<br />__u16&nbsp;reserved[3];&nbsp;/*&nbsp;Reserved&nbsp;for&nbsp;future&nbsp;compatibility&nbsp;*/<br />};<br />3)&nbsp;fb_cmap<br />描述设备无关的颜色映射信息。可以通过FBIOGETCMAP&nbsp;和&nbsp;FBIOPUTCMAP&nbsp;对应的ioctl操作设定或获取颜色映射信息.<br />struct&nbsp;fb_cmap&nbsp;{<br />__u32&nbsp;start;&nbsp;/*&nbsp;First&nbsp;entry&nbsp;*/&nbsp;第一个入口<br />__u32&nbsp;len;&nbsp;/*&nbsp;Number&nbsp;of&nbsp;entries&nbsp;*/&nbsp;入口的数字<br />__u16&nbsp;*red;&nbsp;/*&nbsp;Red&nbsp;values&nbsp;*/&nbsp;红<br />__u16&nbsp;*green;<br />__u16&nbsp;*blue;<br />__u16&nbsp;*transp;&nbsp;/*&nbsp;transparency,&nbsp;can&nbsp;be&nbsp;NULL&nbsp;*/&nbsp;透明,可以为零<br />};<br />4)&nbsp;fb_info<br />定义当显卡的当前状态;fb_info结构仅在内核中可见,在这个结构中有一个fb_ops指针,&nbsp;指向驱动设备工作所需的函数集。<br />struct&nbsp;fb_info&nbsp;{<br />char&nbsp;modename[40];&nbsp;/*&nbsp;default&nbsp;video&nbsp;mode&nbsp;*/&nbsp;默认的视频卡类型<br />kdev_t&nbsp;node;<br />int&nbsp;flags;<br />int&nbsp;open;&nbsp;/*&nbsp;Has&nbsp;this&nbsp;been&nbsp;open&nbsp;already&nbsp;?&nbsp;*/&nbsp;被打开过么?<br />#define&nbsp;FBINFO_FLAG_MODULE&nbsp;1&nbsp;/*&nbsp;Low-level&nbsp;driver&nbsp;is&nbsp;a&nbsp;module&nbsp;*/&nbsp;<br />struct&nbsp;fb_var_screeninfo&nbsp;var;&nbsp;/*&nbsp;Current&nbsp;var&nbsp;*/&nbsp;现在的视频信息<br />struct&nbsp;fb_fix_screeninfo&nbsp;fix;&nbsp;/*&nbsp;Current&nbsp;fix&nbsp;*/&nbsp;修正的信息<br />struct&nbsp;fb_monspecs&nbsp;monspecs;&nbsp;/*&nbsp;Current&nbsp;Monitor&nbsp;specs&nbsp;*/&nbsp;现在的显示器模式<br />struct&nbsp;fb_cmap&nbsp;cmap;&nbsp;/*&nbsp;Current&nbsp;cmap&nbsp;*/&nbsp;当前优先级<br />struct&nbsp;fb_ops&nbsp;*fbops;<br />char&nbsp;*screen_base;&nbsp;/*&nbsp;Virtual&nbsp;address&nbsp;*/&nbsp;物理基址<br />struct&nbsp;display&nbsp;*disp;&nbsp;/*&nbsp;initial&nbsp;display&nbsp;variable&nbsp;*/初始化<br />struct&nbsp;vc_data&nbsp;*display_fg;&nbsp;/*&nbsp;Console&nbsp;visible&nbsp;on&nbsp;this&nbsp;display&nbsp;*/<br />char&nbsp;fontname[40];&nbsp;/*&nbsp;default&nbsp;font&nbsp;name&nbsp;*/默认的字体<br />devfs_handle_t&nbsp;devfs_handle;&nbsp;/*&nbsp;Devfs&nbsp;handle&nbsp;for&nbsp;new&nbsp;name&nbsp;*/<br />devfs_handle_t&nbsp;devfs_lhandle;&nbsp;/*&nbsp;Devfs&nbsp;handle&nbsp;for&nbsp;compat.&nbsp;symlink&nbsp;*/兼容<br />int&nbsp;(*changevar)(int);&nbsp;/*&nbsp;tell&nbsp;console&nbsp;var&nbsp;has&nbsp;changed&nbsp;*/&nbsp;告诉console变量修改了<br />int&nbsp;(*switch_con)(int,&nbsp;struct&nbsp;fb_info*);<br />/*&nbsp;tell&nbsp;fb&nbsp;to&nbsp;switch&nbsp;consoles&nbsp;*/&nbsp;告诉fb选择consoles<br />int&nbsp;(*updatevar)(int,&nbsp;struct&nbsp;fb_info*);<br />/*&nbsp;tell&nbsp;fb&nbsp;to&nbsp;update&nbsp;the&nbsp;vars&nbsp;*/&nbsp;告诉fb更新变量<br />void&nbsp;(*blank)(int,&nbsp;struct&nbsp;fb_info*);&nbsp;/*&nbsp;tell&nbsp;fb&nbsp;to&nbsp;(un)blank&nbsp;the&nbsp;screen&nbsp;*/告诉fb使用黑白模式(或者不黑)<br />/*&nbsp;arg&nbsp;=&nbsp;0:&nbsp;unblank&nbsp;*/arg=0的时候黑白模式<br />/*&nbsp;arg&nbsp;&gt&nbsp;0:&nbsp;VESA&nbsp;level&nbsp;(arg-1)&nbsp;*/&nbsp;arg&gt0时候选择VESA模式<br />void&nbsp;*pseudo_palette;&nbsp;/*&nbsp;Fake&nbsp;palette&nbsp;of&nbsp;16&nbsp;colors&nbsp;and<br />the&nbsp;cursor's&nbsp;color&nbsp;for&nbsp;non<br />palette&nbsp;mode&nbsp;*/&nbsp;&nbsp;修正调色板<br />/*&nbsp;From&nbsp;here&nbsp;on&nbsp;everything&nbsp;is&nbsp;device&nbsp;dependent&nbsp;*/&nbsp;现在就可以使用了<br />void&nbsp;*par;<br />};<br />5)&nbsp;struct&nbsp;fb_ops<br />用户应用可以使用ioctl()系统调用来操作设备,这个结构就是用一支持ioctl()的这些操作的。<br />struct&nbsp;fb_ops&nbsp;{<br />/*&nbsp;open/release&nbsp;and&nbsp;usage&nbsp;marking&nbsp;*/<br />struct&nbsp;module&nbsp;*owner;<br />int&nbsp;(*fb_open)(struct&nbsp;fb_info&nbsp;*info,&nbsp;int&nbsp;user);<br />int&nbsp;(*fb_release)(struct&nbsp;fb_info&nbsp;*info,&nbsp;int&nbsp;user);<br />/*&nbsp;get&nbsp;non&nbsp;settable&nbsp;parameters&nbsp;*/<br />int&nbsp;(*fb_get_fix)(struct&nbsp;fb_fix_screeninfo&nbsp;*fix,&nbsp;int&nbsp;con,<br />struct&nbsp;fb_info&nbsp;*info);<br />/*&nbsp;get&nbsp;settable&nbsp;parameters&nbsp;*/<br />int&nbsp;(*fb_get_var)(struct&nbsp;fb_var_screeninfo&nbsp;*var,&nbsp;int&nbsp;con,<br />struct&nbsp;fb_info&nbsp;*info);<br />/*&nbsp;set&nbsp;settable&nbsp;parameters&nbsp;*/<br />int&nbsp;(*fb_set_var)(struct&nbsp;fb_var_screeninfo&nbsp;*var,&nbsp;int&nbsp;con,<br />struct&nbsp;fb_info&nbsp;*info);<br />/*&nbsp;get&nbsp;colormap&nbsp;*/<br />int&nbsp;(*fb_get_cmap)(struct&nbsp;fb_cmap&nbsp;*cmap,&nbsp;int&nbsp;kspc,&nbsp;int&nbsp;con,<br />struct&nbsp;fb_info&nbsp;*info);<br />/*&nbsp;set&nbsp;colormap&nbsp;*/<br />int&nbsp;(*fb_set_cmap)(struct&nbsp;fb_cmap&nbsp;*cmap,&nbsp;int&nbsp;kspc,&nbsp;int&nbsp;con,<br />struct&nbsp;fb_info&nbsp;*info);<br />/*&nbsp;pan&nbsp;display&nbsp;(optional)&nbsp;*/<br />int&nbsp;(*fb_pan_display)(struct&nbsp;fb_var_screeninfo&nbsp;*var,&nbsp;int&nbsp;con,<br />struct&nbsp;fb_info&nbsp;*info);<br />/*&nbsp;perform&nbsp;fb&nbsp;specific&nbsp;ioctl&nbsp;(optional)&nbsp;*/<br />int&nbsp;(*fb_ioctl)(struct&nbsp;inode&nbsp;*inode,&nbsp;struct&nbsp;file&nbsp;*file,&nbsp;unsigned&nbsp;int&nbsp;cmd,<br />unsigned&nbsp;long&nbsp;arg,&nbsp;int&nbsp;con,&nbsp;struct&nbsp;fb_info&nbsp;*info);<br />/*&nbsp;perform&nbsp;fb&nbsp;specific&nbsp;mmap&nbsp;*/<br />int&nbsp;(*fb_mmap)(struct&nbsp;fb_info&nbsp;*info,&nbsp;struct&nbsp;file&nbsp;*file,&nbsp;struct&nbsp;vm_area_struct&nbsp;*vma);<br />/*&nbsp;switch&nbsp;to/from&nbsp;raster&nbsp;image&nbsp;mode&nbsp;*/<br />int&nbsp;(*fb_rasterimg)(struct&nbsp;fb_info&nbsp;*info,&nbsp;int&nbsp;start);<br />};<br />6)&nbsp;structure&nbsp;map<br />struct&nbsp;fb_info_gen&nbsp;|&nbsp;struct&nbsp;fb_info&nbsp;|&nbsp;fb_var_screeninfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;fb_fix_screeninfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;fb_cmap<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;modename[40]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;fb_ops&nbsp;---|---&gtops&nbsp;on&nbsp;var<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;fb_open<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;fb_release<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;fb_ioctl<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;fb_mmap<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;struct&nbsp;fbgen_hwswitch&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----|-&gt&nbsp;detect<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;encode_fix<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;encode_var<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;decode_fix<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;decode_var<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;get_var<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;set_var<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;getcolreg<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;setcolreg<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;pan_display<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;blank<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;set_disp<br /><br />[编排有点困难,第一行的第一条竖线和下面的第一列竖线对齐,第一行的第二条竖线和下面的第二列竖线对齐就可以了]<br />这个结构&nbsp;fbgen_hwswitch抽象了硬件的操作.虽然它不是必需的,但有时候很有用.<br />&nbsp;<br /> &nbsp;&nbsp;<br />
xamic 发表于 2009-6-3 13:18 | 显示全部楼层

好帖,顶一个

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

55

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

6

主题

55

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部