📄 linux宝库 - linux下framebuffer直接写屏.htm
字号:
title="Linux 环境下 Makefile 文件制作浅谈(一)"
href="http://www.linuxmine.com/3690.html">Linux 环境下 Makefile
文件制作浅谈(一)</A><BR>·<A title=Linux下FrameBuffer直接写屏
href="http://www.linuxmine.com/3787.html">Linux下FrameBuffer直接写屏</A><BR>·<A
title="GCC 安装手册[中文版]" href="http://www.linuxmine.com/3707.html">GCC
安装手册[中文版]</A><BR>·<A title="如何在 linux 下检测内存泄漏"
href="http://www.linuxmine.com/3694.html">如何在 linux
下检测内存泄漏</A><BR>·<A title=生成静态连接库
href="http://www.linuxmine.com/1024.html">生成静态连接库</A><BR>·<A
title=请高手讲讲C语言函数strtok()和memcpy()
href="http://www.linuxmine.com/978.html">请高手讲讲C语言函数strtok()和memcpy()</A><BR>·<A
title="C 编程最佳实践" href="http://www.linuxmine.com/3679.html">C
编程最佳实践</A><BR>·<A title="./configure make make install分别是什么意思呀"
href="http://www.linuxmine.com/1000.html">./configure make make
install分别是什么意思呀</A><BR>·<A title=网络字节序的问题
href="http://www.linuxmine.com/1047.html">网络字节序的问题</A><BR>·<A
title=gdb使用
href="http://www.linuxmine.com/1028.html">gdb使用</A><BR>·<A
title="Linux 环境下 Makefile 文件制作浅谈(二)"
href="http://www.linuxmine.com/3691.html">Linux 环境下 Makefile
文件制作浅谈(二)</A><BR>·<A title="GCC 使用指南及gcc最佳编译参数"
href="http://www.linuxmine.com/3771.html">GCC
使用指南及gcc最佳编译参数</A><BR>·<A title=linux的c编程技巧
href="http://www.linuxmine.com/5630.html">linux的c编程技巧</A><BR>·<A
title=C语言中的位运算
href="http://www.linuxmine.com/4458.html">C语言中的位运算</A><BR>·<A
title=linux2.6内核epoll用法举例说明
href="http://www.linuxmine.com/741.html">linux2.6内核epoll用法举例说明</A><BR></FONT></TD>
<TD></TD></TR></TBODY></TABLE></TD>
<TD width=1 bgColor=#ff8a00 height=5></TD>
<TD bgColor=#ff8a00 colSpan=6 height=25 rowSpan=2><IMG height=3
src="Linux宝库 - Linux下FrameBuffer直接写屏.files/spacer.gif" width=1><BR><SPAN
class=text_white> 您现在的位置: <A class=white_text
href="http://www.linuxmine.com/">Linux宝库</A> >> <A class=white_text
href="http://www.linuxmine.com/channel52.html">Linux</A> >> <A
class=white_text href="http://www.linuxmine.com/type1063.html">编程技术</A>
>> 文章正文</SPAN></TD></TR>
<TR>
<TD bgColor=#333333 height=15></TD>
<TD bgColor=#333333></TD></TR>
<TR>
<TD style="BACKGROUND-REPEAT: repeat-x"
background="Linux宝库 - Linux下FrameBuffer直接写屏.files/top_bg2.gif"></TD>
<TD width=1 bgColor=#333333></TD>
<TD width=1 bgColor=#333333></TD>
<TD style="BACKGROUND-REPEAT: repeat-x" vAlign=top width=15
background="Linux宝库 - Linux下FrameBuffer直接写屏.files/top_bg2.gif"><IMG
height=174 src="Linux宝库 - Linux下FrameBuffer直接写屏.files/yinying.gif"
width=12></TD>
<TD style="BACKGROUND-REPEAT: repeat-x" vAlign=top width=559
background="Linux宝库 - Linux下FrameBuffer直接写屏.files/top_bg2.gif">
<TABLE cellSpacing=0 cellPadding=0 width=559 border=0>
<TBODY>
<TR>
<TD vAlign=center align=middle colSpan=2 height=70><FONT
style="FONT-SIZE: 16px"><B>Linux下FrameBuffer直接写屏</B></FONT></TD></TR>
<TR>
<TD align=middle colSpan=2 height=20>Linux宝库 收集整理 作者:linux宝库
时间:2007-02-09 <A
onclick="myAddPanel('Linux宝库 - 全球中文Linux门户','http://www.linuxmine.com/','Linux宝库-全球中文Linux门户');"
href="http://www.linuxmine.com/3787.html#"
target=_self>收藏本站</A></TD></TR>
<TR>
<TD width=556 bgColor=#969594 height=1></TD>
<TD width=3 rowSpan=3></TD></TR>
<TR>
<TD height=1></TD></TR>
<TR>
<TD bgColor=#ededec height=5></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=559 border=0>
<TBODY>
<TR>
<TD colSpan=5 height=15></TD></TR>
<TR>
<TD width=5 rowSpan=3></TD>
<TD vAlign=top colSpan=3><FONT style="LINE-HEIGHT: 18px"
color=#333333>
<TABLE cellSpacing=0 cellPadding=1 border=0>
<TBODY>
<TR>
<TD>来自:linux宝库</TD></TR>
<TR>
<TD>联系:linuxmine#gmail.com</FONT></TD></TR>
<TR>
<TD>分类:<A
href="http://www.linuxmine.com/type1063.html">[编程技术]</A></FONT></TD></TR></TBODY></TABLE><BR><SPAN
class=title_js_lan>·上一篇:</SPAN><A class=link_js_lan
title=Linux下的音频采集与回放
href="http://www.linuxmine.com/3786.html">Linux下的音频采集与回放</A><BR><SPAN
class=title_js_lan>·下一篇:</SPAN><A class=link_js_lan
title="MVC 设计模式带来更好的软件结构和代码重用"
href="http://www.linuxmine.com/3788.html">MVC
设计模式带来更好的软件结构和代码重用</A><BR><BR>
<SCRIPT type=text/javascript>
var arrBaiduCproConfig=new Array();
arrBaiduCproConfig['uid'] =353007;
arrBaiduCproConfig['n'] ='linuxmine_cpr';
arrBaiduCproConfig['tm'] =20;
arrBaiduCproConfig['cm'] =76;
arrBaiduCproConfig['um'] =26;
arrBaiduCproConfig['w'] =559;
arrBaiduCproConfig['h'] =120;
arrBaiduCproConfig['wn'] =1;
arrBaiduCproConfig['hn'] =4;
arrBaiduCproConfig['ta'] ='right';
arrBaiduCproConfig['tl'] ='bottom';
arrBaiduCproConfig['bu'] =0;
arrBaiduCproConfig['bd'] ='#ffffff';
arrBaiduCproConfig['bg'] ='#ffffff';
arrBaiduCproConfig['tt'] ='#0000cc';
arrBaiduCproConfig['ct'] ='#000000';
arrBaiduCproConfig['url'] ='#0000cc';
arrBaiduCproConfig['bdl'] ='#ffffff';
arrBaiduCproConfig['rad'] =1;
</SCRIPT>
<SCRIPT src="Linux宝库 - Linux下FrameBuffer直接写屏.files/ui.js"
type=text/javascript>
</SCRIPT>
<SCRIPT type=text/javascript>
<!--
document.write(baiduCproIFrame());
-->
</SCRIPT>
<BR>作者:hotfire [文章出自:
www.phpx.com]<BR><BR>因为Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里<BR>提供的中断调用来实现直接写屏,故Linux抽象出FrameBuffer这个设备来供用户态<BR>进程实现直接写屏。<BR><BR>在继续下面的之前,先说明几个背景知识:<BR>1、FrameBuffer主要是根据VESA标准的实现的,所以只能实现最简单的功能。<BR>2、由于涉及内核的问题,FrameBuffer是不允许在系统起来后修改显示模式等一系<BR>列操作。(好象很多人都想要这样干,这是不被允许的,当然如果你自己与驱动<BR>的话,是可以实现的)<BR>3、对FrameBuffer的操作,会直接影响到本机的所有控制台的输出,包括XWIN的图<BR>形界面。<BR><BR>好,现在可以让我们开始实现直接写屏:<BR>1、打开一个FrameBuffer设备<BR>2、通过mmap调用把显卡的物理内存空间映射到用户空间<BR>3、直接写内存。<BR><BR>好象很简单哦~<BR>fbtools.h<BR><BR>代码:<BR>#ifndef
_FBTOOLS_H_<BR>#define _FBTOOLS_H_<BR><BR>#include
<linux/fb.h><BR><BR>//a framebuffer device
structure;<BR>typedef struct fbdev{<BR>int fb;<BR>unsigned long
fb_mem_offset;<BR>unsigned long fb_mem;<BR>struct fb_fix_screeninfo
fb_fix;<BR>struct fb_var_screeninfo fb_var;<BR>char dev[20];<BR>}
FBDEV, *PFBDEV;<BR><BR>//open & init a frame buffer<BR>//to use
this function,<BR>//you must set FBDEV.dev="/dev/fb0"<BR>//or
"/dev/fbX"<BR>//it's your frame buffer.<BR>int fb_open(PFBDEV
pFbdev);<BR><BR>//close a frame buffer<BR>int fb_close(PFBDEV
pFbdev);<BR><BR>//get display depth<BR>int get_display_depth(PFBDEV
pFbdev);<BR><BR><BR>//full screen clear<BR>void fb_memset(void
*addr, int c, size_t
len);<BR><BR>#endif<BR><BR><BR><BR>fbtools.c<BR><BR>代码:<BR>#include
<stdio.h><BR>#include <stdlib.h><BR>#include
<fcntl.h><BR>#include <unistd.h><BR>#include
<string.h><BR>#include <sys/ioctl.h><BR>#include
<sys/mman.h><BR>#include <asm/page.h><BR><BR>#include
"fbtools.h"<BR><BR>#define TRUE 1<BR>#define FALSE 0<BR>#define
MAX(x,y) ((x)>(y)?(x):(y))<BR>#define MIN(x,y)
((x)<(y)?(x):(y))<BR><BR>//open & init a frame buffer<BR>int
fb_open(PFBDEV pFbdev)<BR>{<BR>pFbdev->fb = open(pFbdev->dev,
O_RDWR);<BR>if(pFbdev->fb < 0)<BR>{<BR>printf("Error opening
%s: %m. Check kernel config\\n", pFbdev->dev);<BR>return
FALSE;<BR>}<BR>if (-1 ==
ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))<BR>{<BR>printf("ioctl
FBIOGET_VSCREENINFO\\n");<BR>return FALSE;<BR>}<BR>if (-1 ==
ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))<BR>{<BR>printf("ioctl
FBIOGET_FSCREENINFO\\n");<BR>return FALSE;<BR>}<BR><BR>//map physics
address to virtual address<BR>pFbdev->fb_mem_offset = (unsigned
long)(pFbdev->fb_fix.smem_start) &
(~PAGE_MASK);<BR>pFbdev->fb_mem = (unsigned long int)mmap(NULL,
pFbdev->fb_fix.smem_len +
<BR>pFbdev->fb_mem_offset,<BR>PROT_READ | PROT_WRITE, MAP_SHARED,
pFbdev->fb, 0);<BR>if (-1L == (long) pFbdev->fb_mem)
<BR>{<BR>printf("mmap error! mem:%d offset:%d\\n",
pFbdev->fb_mem, <BR>pFbdev->fb_mem_offset);<BR>return
FALSE;<BR>}<BR><BR>return TRUE;<BR>}<BR><BR>//close frame
buffer<BR>int fb_close(PFBDEV
pFbdev)<BR>{<BR>close(pFbdev->fb);<BR>pFbdev->fb=-1;<BR>}<BR><BR>//get
display depth<BR>int get_display_depth(PFBDEV
pFbdev);<BR>{<BR>if(pFbdev->fb<=0)<BR>{<BR>printf("fb device
not open, open it first\\n");<BR>return FALSE;<BR>}<BR>return
pFbdev->fb_var.bits_per_pixel;<BR>}<BR><BR>//full screen
clear<BR>void fb_memset (void *addr, int c, size_t
len)<BR>{<BR>memset(addr, c, len);<BR>}<BR><BR>//use by
test<BR>#define DEBUG<BR>#ifdef DEBUG<BR>main()<BR>{<BR>FBDEV
fbdev;<BR>memset(&fbdev, 0, sizeof(FBDEV));<BR>strcpy(fbdev.dev,
"/dev/fb0");<BR>if(fb_open(&fbdev)==FALSE)<BR>{<BR>printf("open
frame buffer
error\\n");<BR>return;<BR>}<BR><BR>fb_memset(fbdev.fb_mem +
fbdev.fb_mem_offset, 0,
fbdev.fb_fix.smem_len);<BR><BR>fb_close(&fbdev);<BR>}<BR><BR><BR><BR><BR><A
href="http://bbs.linuxmine.com/" target=_blank><FONT
style="FONT-SIZE: 24px; COLOR: red">-->进入linux电子图书免费下载基地</A></FONT><BR><BR><BR><SPAN
class=title_js_lan>·上一篇:</SPAN><A class=link_js_lan
title=Linux下的音频采集与回放
href="http://www.linuxmine.com/3786.html">Linux下的音频采集与回放</A><BR><SPAN
class=title_js_lan>·下一篇:</SPAN><A class=link_js_lan
title="MVC 设计模式带来更好的软件结构和代码重用"
href="http://www.linuxmine.com/3788.html">MVC
设计模式带来更好的软件结构和代码重用</A><BR><BR></FONT></TD>
<TD width=5 rowSpan=3></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=559 border=0>
<TBODY>
<TR>
<TD width=5 rowSpan=5></TD>
<TD colSpan=10 height=15> </TD>
<TD width=5 rowSpan=5></TD></TR></TBODY></TABLE></TD>
<TD width=1 bgColor=#9e9e9e></TD>
<TD style="BACKGROUND-REPEAT: repeat-x" vAlign=top width=190
background="Linux宝库 - Linux下FrameBuffer直接写屏.files/top_bg2.gif">
<TABLE cellSpacing=0 cellPadding=0 width=190 border=0>
<TBODY>
<TR>
<TD vAlign=bottom
background="Linux宝库 - Linux下FrameBuffer直接写屏.files/right.gif" colSpan=3
height=22> <FONT
color=#ffffff><B>最新更新</B></FONT></TD></TR>
<TR>
<TD width=5 rowSpan=3></TD>
<TD height=8></TD>
<TD width=5 rowSpan=3></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 18px">·<A title=autoconf手册(四)
href="http://www.linuxmine.com/3736.html">autoconf手册(四)</A><FONT
color=#c0c0c0><I>(2007-2-9)</I></FONT><BR>·<A
title="Linux 环境下 Makefile 文件制作浅谈(二)"
href="http://www.linuxmine.com/3691.html">Linux 环境下 Makefile
文件制作浅谈(二)</A><FONT color=#c0c0c0><I>(2007-2-9)</I></FONT><BR>·<A
title=字节对齐 href="http://www.linuxmine.com/6047.html">字节对齐</A><FONT
color=#c0c0c0><I>(2007-2-9)</I></FONT><BR>·<A
title=TCP/IP通信程序设计的丰富多样性
href="http://www.linuxmine.com/3681.html">TCP/IP通信程序设计的丰富多样性</A><FONT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -