📄 关于framebuffer的一些文章_ - 我的文章 - t_t.htm
字号:
style="FONT-FAMILY: 宋体">的应用</SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 宋体">(一)、一个使用</SPAN><SPAN
lang=EN-US>FrameBuffer</SPAN><SPAN
style="FONT-FAMILY: 宋体">的例子</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>1</SPAN><SPAN
style="FONT-FAMILY: 宋体">、</SPAN><SPAN
lang=EN-US>FrameBuffer</SPAN><SPAN
style="FONT-FAMILY: 宋体">主要是根据</SPAN><SPAN
lang=EN-US>VESA</SPAN><SPAN
style="FONT-FAMILY: 宋体">标准的实现的,所以只能实现最简单的功能。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>2</SPAN><SPAN
style="FONT-FAMILY: 宋体">、由于涉及内核的问题,</SPAN><SPAN
lang=EN-US>FrameBuffer</SPAN><SPAN
style="FONT-FAMILY: 宋体">是不允许在系统起来后修改显示模式等一系列操作。(好象很多人都想要这样干,这是不被允许的,当然如果你自己写驱动的话,是可以实现的)</SPAN><SPAN
lang=EN-US>.</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>3</SPAN><SPAN
style="FONT-FAMILY: 宋体">、对</SPAN><SPAN
lang=EN-US>FrameBuffer</SPAN><SPAN
style="FONT-FAMILY: 宋体">的操作,会直接影响到本机的所有控制台的输出,包括</SPAN><SPAN
lang=EN-US>XWIN</SPAN><SPAN
style="FONT-FAMILY: 宋体">的图形界面。</SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 宋体">好,现在可以让我们开始实现直接写屏:</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>1</SPAN><SPAN
style="FONT-FAMILY: 宋体">、打开一个</SPAN><SPAN
lang=EN-US>FrameBuffer</SPAN><SPAN
style="FONT-FAMILY: 宋体">设备</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>2</SPAN><SPAN
style="FONT-FAMILY: 宋体">、通过</SPAN><SPAN lang=EN-US>mmap</SPAN><SPAN
style="FONT-FAMILY: 宋体">调用把显卡的物理内存空间映射到用户空间</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>3</SPAN><SPAN
style="FONT-FAMILY: 宋体">、直接写内存。</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US>/********************************</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>File name : fbtools.h</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>*/</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#ifndef _FBTOOLS_H_</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#define _FBTOOLS_H_</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#i nclude
<linux/fb.h></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//a framebuffer device
structure;</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>typedef struct fbdev{</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN> </SPAN>int
fb;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>unsigned long fb_mem_offset;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>unsigned long fb_mem;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN> </SPAN>struct
fb_fix_screeninfo fb_fix;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN> </SPAN>struct
fb_var_screeninfo fb_var;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN> </SPAN>char
dev[20];</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>} FBDEV, *PFBDEV;</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//open & init a frame
buffer</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//to use this
function,</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//you must set
FBDEV.dev="/dev/fb0"</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//or "/dev/fbX"</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//it's your frame
buffer.</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>int fb_open(PFBDEV
pFbdev);</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//close a frame
buffer</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>int fb_close(PFBDEV
pFbdev);</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//get display depth</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>int get_display_depth(PFBDEV
pFbdev);</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//full screen clear</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>void fb_memset(void *addr, int
c, size_t len);</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#endif</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><!--[if
!supportEmptyParas]--> <!--[endif]--><O:P></O:P></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>/******************</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>File name : fbtools.c</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>*/</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#i nclude
<stdio.h></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#i nclude
<stdlib.h></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#i nclude
<fcntl.h></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#i nclude
<unistd.h></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#i nclude
<string.h></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#i nclude
<sys/ioctl.h></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#i nclude
<sys/mman.h></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#i nclude
<asm/page.h></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#i nclude "fbtools.h"</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#define TRUE
<SPAN> </SPAN>1</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#define
FALSE<SPAN> </SPAN>0</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#define
MAX(x,y)<SPAN>
</SPAN>((x)>(y)?(x)y))</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#define
MIN(x,y)<SPAN>
</SPAN>((x)<(y)?(x)y))</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//open & init a frame
buffer</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>int fb_open(PFBDEV
pFbdev)</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>{</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>pFbdev->fb = open(pFbdev->dev, O_RDWR);</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>if(pFbdev->fb < 0)</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>{</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN><SPAN>
</SPAN>printf("Error opening %s: %m. Check kernel config\n",
pFbdev->dev);</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>return FALSE;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>}</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN> </SPAN>if (-1
==
ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>{</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN><SPAN>
</SPAN>printf("ioctl FBIOGET_VSCREENINFO\n");</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>return FALSE;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>}</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN> </SPAN>if (-1
==
ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>{</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN><SPAN>
</SPAN>printf("ioctl FBIOGET_FSCREENINFO\n");</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>return FALSE;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>}</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN> </SPAN>//map
physics address to virtual address</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>pFbdev->fb_mem_offset = (unsigned
long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>pFbdev->fb_mem = (unsigned long int)mmap(NULL,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -