📄 关于frambuffer--狼牙月.htm
字号:
请稍候...</DIV></DIV></TD></TR></TBODY></TABLE><!-- BEGIN: last_followups -->
<TABLE class=table3 cellSpacing=0 cellPadding=0 width="100%"
align=center border=0>
<TBODY>
<TR>
<TD class=b2 align=middle height=43>最 新 评 论</TD></TR><!-- BEGIN: followups_row -->
<TR>
<TD>
<DIV class=content4>
<DIV id=comment>MCU博客数据载入中, 请稍候...</DIV></DIV></TD></TR><!-- END: followups_row --></TBODY></TABLE><!-- END: last_followups -->
<TABLE class=table3 cellSpacing=0 cellPadding=0 width="100%"
align=center border=0>
<TBODY>
<TR>
<TD class=b2 align=middle height=43>专 题 分 类</TD></TR>
<TR>
<TD>
<DIV class=content4>
<DIV id=subject>MCU博客数据载入中,
请稍候...</DIV></DIV></TD></TR></TBODY></TABLE><!-- BEGIN: last_tb -->
<TABLE class=table3 cellSpacing=0 cellPadding=0 width="100%"
align=center border=0>
<TBODY>
<TR>
<TD class=b2 align=middle height=43>最 新 日 志</TD></TR>
<TR>
<TD>
<DIV class=content4><!-- BEGIN: tb -->
<DIV id=newblog>MCU博客数据载入中,
请稍候...</DIV><!-- END: tb --></DIV></TD></TR></TBODY></TABLE><!-- END: last_tb -->
<TABLE class=table3 cellSpacing=0 cellPadding=0 width="100%"
align=center border=0>
<TBODY>
<TR>
<TD class=b2 align=middle height=43>最 新 留 言</TD></TR>
<TR>
<TD>
<DIV class=content4>
<DIV id=newmessage>MCU博客数据载入中,
请稍候...</DIV></DIV></TD></TR></TBODY></TABLE>
<TABLE class=table3 cellSpacing=0 cellPadding=0 width="100%"
align=center border=0>
<TBODY>
<TR>
<TD class=b2 align=middle height=43>搜 索</TD></TR>
<TR>
<TD>
<DIV class=content4>
<DIV id=search>MCU博客数据载入中,
请稍候...</DIV></DIV></TD></TR></TBODY></TABLE>
<TABLE class=table3 cellSpacing=0 cellPadding=0 width="100%"
align=center border=0>
<TBODY>
<TR>
<TD class=b2 align=middle height=43>用 户 登 录</TD></TR>
<TR>
<TD align=middle>
<DIV class=content4>
<DIV id=ob_login></DIV></DIV></TD></TR></TBODY></TABLE><!-- BEGIN: link -->
<TABLE class=table3 cellSpacing=0 cellPadding=0 width="100%"
align=center border=0>
<TBODY>
<TR>
<TD class=b2 align=middle height=43>友 情 连 接</TD></TR>
<TR>
<TD>
<TABLE style="TABLE-LAYOUT: fixed; OVERFLOW: hidden"
cellSpacing=0 cellPadding=0 width="87%" align=center
border=0><TBODY>
<TR>
<TD class=b1>
<DIV id=links>MCU博客数据载入中, 请稍候...</DIV>
<SCRIPT src=""></SCRIPT>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE class=table3 cellSpacing=0 cellPadding=0 width="100%"
align=center border=0>
<TBODY>
<TR>
<TD class=b2 align=middle height=43>博 客 信 息</TD></TR>
<TR>
<TD>
<TABLE class=b1 cellSpacing=5 cellPadding=2 width="100%"
align=right border=0>
<TBODY>
<TR>
<TD class=b1 align=left>
<DIV id=info>MCU博客数据载入中, 请稍候...</DIV></TD></TR>
<TR>
<TD class=b1 align=left>
<DIV id=xml><SPAN id=txml></SPAN><BR><BR><A
href="http://feeds.feedsky.com/mcublog.com/user1/9450"
target=_blank><IMG
src="关于frambuffer--狼牙月.files/icon_sub_c1s5.gif"></A></DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- END: link --></TD></TR></TBODY></TABLE></TD>
<TD vAlign=top>
<DIV id=content>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD>
<TABLE class=seyle4 cellSpacing=0 cellPadding=0 width="100%"
border=0>
<TBODY>
<TR>
<TD> </TD></TR>
<TR>
<TD id=content9><STRONG>关于frambuffer</STRONG></TD></TR>
<TR>
<TD>
<DIV align=right><SPAN class=textbox-label>[ 2006-12-12
13:40:00 | By: <SPAN class=style3>糯米</SPAN>
]</SPAN></DIV></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD height=3> </TD></TR></TBODY></TABLE>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 cellPadding=0
width="100%" align=center border=0>
<TBODY>
<TR>
<TD><SPAN class=oblog_text>
<DIV id=art style="MARGIN: 15px" width="560">
<P>FrameBuffer的原理</P>
<P>FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。</P>
<P>Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。</P>
<P>但Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池.CPU将运算后的结果放到这个水池,水池再将结果流到显示器.中间不会对数据做处理.
应用程序也可以直接读写这个水池的内容.在这种机制下,尽管Framebuffer需要真正的显卡驱动的支持,但所有显示任务都有CPU完成,因此CPU负担很重.</P>
<P>framebuffer的设备文件一般是 /dev/fb0、/dev/fb1 等等。</P>
<P>可以用命令: #dd if=/dev/zero of=/dev/fb 清空屏幕.</P>
<P>如果显示模式是 1024x768-8 位色,用命令:$ dd if=/dev/zero
of=/dev/fb0 bs=1024 count=768 清空屏幕</P>
<P>用命令: #dd if=/dev/fb of=fbfile
可以将fb中的内容保存下来;</P>
<P>可以重新写回屏幕: #dd if=fbfile of=/dev/fb</P>
<P>在使用Framebuffer时,Linux是将显卡置于图形模式下的.</P>
<P>在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开
/dev/fb0 设备,并通过 mmap 系统调用进行地址映射,随后用 memset
将屏幕清空(这里假设显示模式是 1024x768-8 位色模式,线性内存模式):</P>
<P>int fb;</P>
<P>unsigned char* fb_mem;</P>
<P>fb = open ("/dev/fb0", O_RDWR);</P>
<P>fb_mem = mmap (NULL, 1024*768,
PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);</P>
<P>memset (fb_mem, 0, 1024*768);</P>
<P>FrameBuffer 设备还提供了若干 ioctl
命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。</P>
<P>通过 FrameBuffer
设备,还可以获得当前内核所支持的加速显示卡的类型(通过固定信息得到),这种类型通常是和特定显示芯片相关的。比如目前最新的内核(2.4.9)中,就包含有对
S3、Matrox、nVidia、3Dfx
等等流行显示芯片的加速支持。在获得了加速芯片类型之后,应用程序就可以将 PCI
设备的内存I/O(memio)映射到进程的地址空间。这些 memio
一般是用来控制显示卡的寄存器,通过对这些寄存器的操作,应用程序就可以控制特定显卡的加速功能。</P>
<P>PCI
设备可以将自己的控制寄存器映射到物理内存空间,而后,对这些控制寄存器的访问,给变成了对物理内存的访问。因此,这些寄存器又被称为"memio"。一旦被映射到物理内存,Linux
的普通进程就可以通过 mmap 将这些内存 I/O 映射到进程地址空间,这样就可以直接访问这些寄存器了。</P>
<P>当然,因为不同的显示芯片具有不同的加速能力,对memio
的使用和定义也各自不同,这时,就需要针对加速芯片的不同类型来编写实现不同的加速功能。比如大多数芯片都提供了对矩形填充的硬件加速支持,但不同的芯片实现方式不同,这时,就需要针对不同的芯片类型编写不同的用来完成填充矩形的函数。</P>
<P>FrameBuffer
只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在
FrameBuffer 之上进行图形编程,还需要自己动手完成其他许多工作。</P>
<P><!--[if !supportEmptyParas]-->
<!--[endif]--></P>
<P><!--[if
!supportLists]-->二、<!--[endif]-->FrameBuffer在LINUX中实现和机制</P>
<P>Framebuffer对应的源文件在linux/drivers/video/目录下。总的抽象设备文件为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。</P>
<P>(一)、分析Framebuffer设备驱动</P>
<P> 需要特别提出的是在INTEL平台上,老式的VESA 1.2
卡,如CGA/EGA卡,是不能支持Framebuffer的,因为Framebuffer要求显卡支持线性帧缓冲,即CPU可以访问显缓冲中的每一位,但是VESA
1.2 卡只能允许CPU一次访问64K的地址空间。</P>
<P>FrameBuffer设备驱动基于如下两个文件:</P>
<P>1) linux/include/linux/fb.h<BR>2)
linux/drivers/video/fbmem.c</P>
<P>下面分析这两个文件。</P>
<P>1、fb.h</P>
<P> 几乎主要的结构都是在这个中文件定义的。这些结构包括:</P>
<P>1)fb_var_screeninfo</P>
<P> 这个结构描述了显示卡的特性:</P>
<P>struct fb_var_screeninfo </P>
<P>{<BR>__u32 xres; /* visible resolution */<BR>__u32
yres;<BR>__u32 xres_virtual; /* virtual resolution
*/<BR>__u32 yres_virtual;<BR>__u32 xoffset; /* offset
from virtual to visible resolution */<BR>__u32 yoffset;
</P>
<P>__u32 bits_per_pixel; /* guess what */<BR>__u32
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -