📄 linux下framebuffer直接写屏framebuffer.htm
字号:
height=293> <!----><SPAN class=tpc_content><BR><FONT
size=2>因为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>}</FONT><BR></SPAN></TD></TR></TBODY></TABLE>
<DIV
style="BORDER-TOP: #000000 1px solid; FONT-SIZE: 12px; MARGIN: 0px auto; WIDTH: 800px; COLOR: #000000; FONT-FAMILY: '宋体'; HEIGHT: 28px; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: center"><!--上一篇--> <A
title=基于Winodws CE的嵌入式网络监控系统的设计与实现
href="http://www.armsystem.com.cn/article/ARM7-artilcle/system/20061013259.html">上一篇:基于Winodws CE的嵌入式网络监控系统的设计与实现</A> <A
title=《嵌入式LINUX教程》书下载地址.
href="http://www.armsystem.com.cn/article/ARM7-artilcle/system/20061013265.html">下一篇:《嵌入式LINUX教程》书下载地址.</A>
</DIV><!--下一篇-->
<TABLE style="BORDER-TOP: #000000 1px solid" cellSpacing=0 cellPadding=0
width=800 align=center bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD vAlign=top align=left width=400 height=124>
<TABLE style="BORDER-BOTTOM: #666666 1px solid" cellSpacing=0
cellPadding=0 width=400 border=0>
<TBODY>
<TR>
<TD style="BACKGROUND: #898888; HEIGHT: 28px" width=400
height=21> <FONT class=menufont>■
相关文章</FONT></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=400>
<TBODY>
<TR>
<TD height=8></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: #cccccc 1px dotted" vAlign=top
align=left> <IMG
src="Linux下FrameBuffer直接写屏framebuffer.files/dian3.gif"> <A
title=基于嵌入式Linux的图形界面显示系统的设计(framebuffer)
href="http://www.armsystem.com.cn/article/yejin-article/system/20061013108.html">基于嵌入式Linux的图形界面显示系统的设计(framebuffer)</A><BR></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: #cccccc 1px dotted" vAlign=top
align=left> <IMG
src="Linux下FrameBuffer直接写屏framebuffer.files/dian3.gif"> <A
title=Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
href="http://www.armsystem.com.cn/article/yejin-article/system/20061013110.html">Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构</A><BR></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: #cccccc 1px dotted" vAlign=top
align=left> <IMG
src="Linux下FrameBuffer直接写屏framebuffer.files/dian3.gif"> <A
title=基于Linux核心的汉字显示的尝试(frambuffer分析)
href="http://www.armsystem.com.cn/article/ARM9-article/system/20061013124.html">基于Linux核心的汉字显示的尝试(frambuffer分析)</A><BR></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: #cccccc 1px dotted" vAlign=top
align=left> <IMG
src="Linux下FrameBuffer直接写屏framebuffer.files/dian3.gif"> <A
title=Linux下FrameBuffer直接写屏
href="http://www.armsystem.com.cn/article/ARM7-artilcle/system/20061013261.html">Linux下FrameBuffer直接写屏</A><BR></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: #cccccc 1px dotted" vAlign=top
align=left> <IMG
src="Linux下FrameBuffer直接写屏framebuffer.files/dian3.gif"> <A
title=uClinux 的framebuffer简介/如何配置framebuffer
href="http://www.armsystem.com.cn/article/ARM7-artilcle/cphelp/20061013384.html">uClinux 的framebuffer简介/如何配置framebuffer</A><BR></TD></TR>
<TR>
<TD height=6></TD></TR></TBODY></TABLE></TD>
<TD vAlign=top align=left width=400>
<TABLE style="BORDER-BOTTOM: #666666 1px solid" cellSpacing=0
cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD style="BACKGROUND: #898888; HEIGHT: 28px" width=400
height=21> <FONT class=menufont>■
相关产品</FONT></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD height=8></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: #cccccc 1px dotted" vAlign=top
align=left> -无相关产品</TD></TR>
<TR>
<TD height=6></TD></TR></TBODY></TABLE><!-- end --></TD></TR></TBODY></TABLE>
<DIV id=center>
<DIV id=center style="CLEAR: both">
<DIV id=footer>
<DIV id=copyright>
<DIV class=COPY1 style="TEXT-ALIGN: center"><A title=关于我们
href="http://www.armsystem.com.cn/about.html" target=_blank>关于我们</A>|<A
title=网站地图 href="http://www.armsystem.com.cn/map.html" target=_blank>网站地图</A>|<A
title=ARM论坛 href="http://www.hzlitai.com.cn/bbs" target=_blank>ARM论坛</A>|<A
title=友情链接 href="http://www.armsystem.com.cn/lytlink/linkall.asp"
target=_blank>友情链接</A></DIV>版权所有-杭州立宇泰电子有限公司
<SCRIPT language=JavaScript
src="Linux下FrameBuffer直接写屏framebuffer.files/stat.htm" charset=gb2312></SCRIPT>
</DIV></DIV></DIV>
<SCRIPT language=javascript
src="Linux下FrameBuffer直接写屏framebuffer.files/blog.Js"></SCRIPT>
</DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -