⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux下framebuffer直接写屏framebuffer.htm

📁 本人收集的framebuffer资料
💻 HTM
📖 第 1 页 / 共 2 页
字号:
      height=293>&nbsp;&nbsp; <!----><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 
      &lt;linux/fb.h&gt;<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 &amp; 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 
      &lt;stdio.h&gt;<BR>#include &lt;stdlib.h&gt;<BR>#include 
      &lt;fcntl.h&gt;<BR>#include &lt;unistd.h&gt;<BR>#include 
      &lt;string.h&gt;<BR>#include &lt;sys/ioctl.h&gt;<BR>#include 
      &lt;sys/mman.h&gt;<BR>#include &lt;asm/page.h&gt;<BR><BR>#include 
      \"fbtools.h\"<BR><BR>#define TRUE 1<BR>#define FALSE 0<BR>#define MAX(x,y) 
      ((x)&gt;(y)?(x):(y))<BR>#define MIN(x,y) ((x)&lt;(y)?(x):(y))<BR><BR>/open 
      &amp; init a frame buffer<BR>int fb_open(PFBDEV 
      pFbdev)<BR>{<BR>pFbdev-&gt;fb = open(pFbdev-&gt;dev, 
      O_RDWR);<BR>if(pFbdev-&gt;fb &lt; 0)<BR>{<BR>printf(\"Error opening %s: 
      %m. Check kernel config\\n\", pFbdev-&gt;dev);<BR>return FALSE;<BR>}<BR>if 
      (-1 == 
      ioctl(pFbdev-&gt;fb,FBIOGET_VSCREENINFO,&amp;(pFbdev-&gt;fb_var)))<BR>{<BR>printf(\"ioctl 
      FBIOGET_VSCREENINFO\\n\");<BR>return FALSE;<BR>}<BR>if (-1 == 
      ioctl(pFbdev-&gt;fb,FBIOGET_FSCREENINFO,&amp;(pFbdev-&gt;fb_fix)))<BR>{<BR>printf(\"ioctl 
      FBIOGET_FSCREENINFO\\n\");<BR>return FALSE;<BR>}<BR><BR>/map physics 
      address to virtual address<BR>pFbdev-&gt;fb_mem_offset = (unsigned 
      long)(pFbdev-&gt;fb_fix.smem_start) &amp; 
      (~PAGE_MASK);<BR>pFbdev-&gt;fb_mem = (unsigned long int)mmap(NULL, 
      pFbdev-&gt;fb_fix.smem_len + <BR>pFbdev-&gt;fb_mem_offset,<BR>PROT_READ | 
      PROT_WRITE, MAP_SHARED, pFbdev-&gt;fb, 0);<BR>if (-1L == (long) 
      pFbdev-&gt;fb_mem) <BR>{<BR>printf(\"mmap error! mem:%d offset:%d\\n\", 
      pFbdev-&gt;fb_mem, <BR>pFbdev-&gt;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-&gt;fb);<BR>pFbdev-&gt;fb=-1;<BR>}<BR><BR>/get 
      display depth<BR>int get_display_depth(PFBDEV 
      pFbdev);<BR>{<BR>if(pFbdev-&gt;fb&lt;=0)<BR>{<BR>printf(\"fb device not 
      open, open it first\\n\");<BR>return FALSE;<BR>}<BR>return 
      pFbdev-&gt;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(&amp;fbdev, 0, 
      sizeof(FBDEV));<BR>strcpy(fbdev.dev, 
      \"/dev/fb0\");<BR>if(fb_open(&amp;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(&amp;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"><!--上一篇-->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
title=基于Winodws&nbsp;CE的嵌入式网络监控系统的设计与实现 
href="http://www.armsystem.com.cn/article/ARM7-artilcle/system/20061013259.html">上一篇:基于Winodws&nbsp;CE的嵌入式网络监控系统的设计与实现</A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;&nbsp;<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>&nbsp;<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>&nbsp;<IMG 
            src="Linux下FrameBuffer直接写屏framebuffer.files/dian3.gif"> <A 
            title=Writing&nbsp;Linux&nbsp;LCD&nbsp;drivers—深入分析framebuffer设备驱动的结构 
            href="http://www.armsystem.com.cn/article/yejin-article/system/20061013110.html">Writing&nbsp;Linux&nbsp;LCD&nbsp;drivers—深入分析framebuffer设备驱动的结构</A><BR></TD></TR>
        <TR>
          <TD style="BORDER-BOTTOM: #cccccc 1px dotted" vAlign=top 
            align=left>&nbsp;<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>&nbsp;<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>&nbsp;<IMG 
            src="Linux下FrameBuffer直接写屏framebuffer.files/dian3.gif"> <A 
            title=uClinux&nbsp;的framebuffer简介/如何配置framebuffer 
            href="http://www.armsystem.com.cn/article/ARM7-artilcle/cphelp/20061013384.html">uClinux&nbsp;的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>&nbsp;&nbsp;<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-无相关产品</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 + -