framebuffer
Linux操作系统下使用FrameBuffer直接写屏 2011-03-28 11:42:08
分类:
因为Linux是工作在保护模式下,所以用户态进程是无法象Dos那样使用显卡BIOS里提供的中断调用来实现直接写屏,故Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。
在继续下面的之前,先说明几个背景知识:
- FrameBuffer主要是根据VESA标准的实现的,所以只能实现最简单的功能。
- 由于涉及内核的问题,FrameBuffer是不允许在系统起来后修改显示模式等一系列操作。(好象很多人都想要这样干,这是不被允许的,当然如果你自己与驱动的话,是可以实现的)
- 对FrameBuffer的操作,会直接影响到本机的所有控制台的输出,包括XWIN的图形界面。
好,现在可以让我们开始实现直接写屏:
- 打开一个FrameBuffer设备
- 通过mmap调用把显卡的物理内存空间映射到用户空间
- 直接写内存。
好象很简单哦~
fbtools.h
|
fbtools.c
代码:
#include<stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <asm/page.h>
#include "fbtools.h"
#define TRUE 1
#define FALSE 0
#define MAX(x,y)((x)>(y)?(x):(y))
#define MIN(x,y)((x)<(y)?(x):(y))
/* open & init a frame buffer */
int fb_open(PFBDEV pFbdev)
{
pFbdev->fb = open(pFbdev->dev, O_RDWR);
if(pFbdev->fb< 0)
{
printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev);
return FALSE;
}
if (-1== ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
{
printf("ioctl FBIOGET_VSCREENINFO\n");
return FALSE;
}
if (-1== ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
{
printf("ioctl FBIOGET_FSCREENINFO\n");
return FALSE;
}
/*map physics address to virtual address */
pFbdev->fb_mem_offset= (unsignedlong)(pFbdev->fb_fix.smem_start)& (~PAGE_MASK);
pFbdev->fb_mem = (unsignedlong int)mmap(NULL, pFbdev->fb_fix.smem_len
pFbdev->fb_mem_offset,
PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
if (-1L== (long) pFbdev->fb_mem)
{
printf("mmap error! mem:%d offset:%d\n", pFbdev->fb_mem,
pFbdev->fb_mem_offset);
return FALSE;
}
return TRUE;
}
/* close frame buffer */
int fb_close(PFBDEV pFbdev)
{
close(pFbdev->fb);
pFbdev->fb=-1;
}
/* get display depth */
int get_display_depth(PFBDEV pFbdev);
{
if(pFbdev->fb<=0)
{
printf("fb device not open, open it first\n");
return FALSE;
}
return pFbdev->fb_var.bits_per_pixel;
}
/* full screen clear */
void fb_memset (void*addr, int c, size_t len)
{
memset(addr, c, len);
}
/* use by test */
#define DEBUG
#ifdef DEBUG
main()
{
FBDEV fbdev;
memset(&fbdev, 0,sizeof(FBDEV));
strcpy(fbdev.dev,"/dev/fb0");
if(fb_open(&fbdev)==FALSE)
{
printf("open frame buffer error\n");
return;
}
fb_memset(fbdev.fb_mem fbdev.fb_mem_offset, 0, fbdev.fb_fix.smem_len);
fb_close(&fbdev);
}
framebuffer相关推荐
- Linux驱动框架之framebuffer驱动框架
1.什么是framebuffer? (1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备.帧缓冲 ...
- 以OpenGL/ES视角介绍gfx-hal(Vulkan) Framebuffer接口使用
文档列表见:Rust 移动端跨平台复杂图形渲染项目开发系列总结(目录) 草稿状态 以OpenGL/ES Framebuffer角度看,如果用gfx-hal(Vulkan)接口实现类似OpenGL/ES ...
- framebuffer的入门介绍-实现程序分析【转】
本文转载自:http://blog.csdn.net/liuzijiang1123/article/details/46972723 如想想对lcd屏进行操作(例如在lcd屏幕上画线,或者显示视频数据 ...
- Opengl编程学习笔记(五)——从FRAGMENT到PIXEL(framebuffer 帧缓存)
1.帧缓存包括颜色.scissor.alpha.stencil.depth这些缓存,所以帧缓存不是一片缓存,而是所有这些缓存的组合,帧缓存它对应了屏幕上的每一个pixel(不是真正的pixel,而是一 ...
- Android原生(Native)C开发之二 framebuffer篇
为什么80%的码农都做不了架构师?>>> Android原生(Native)C开发之二 framebuffer篇 如对Android原生(Natvie)C开发还任何疑问,请参阅 ...
- NanoPi NEO Air使用十四:FrameBuffer的理解和使用
FrameBuffer的介绍 应用程序直接通过操作显存来操作 LCD,实现在 LCD 上显示字符.图片等信息.在 Linux 中应用程序最终也是通过操作 RGB LCD 的显存来实现在 LCD 上显示 ...
- 同一AppDomain内的SharpGL的FrameBuffer会相互影响?
同一AppDomain内的SharpGL的FrameBuffer会相互影响? 今天做一个试验时,偶然发现了这样一个问题. 以SharpGL的示例项目SimpleDrawingSample为例. 给Fo ...
- Framebuffer原理、使用、测试系列文章
FROM: http://bbs.chinaunix.net/viewthread.php?tid=1932291&extra=page%3D1%26amp%3Bfilter%3Dtype%2 ...
- 使用libjpeg显示JPEG图像在framebuffer 测试(八)
2011-05-03 21:00:46 分类: 嵌入式 本文的copyright归yuweixian4230@163.com 所有,使用GPL发布,可以自由拷贝,转载.但转载请保持文档的完整性,注明原 ...
- framebuffer显示JPEG图片
framebuffer显示JPEG图片 2011-05-03 20:14:45 分类: 嵌入式 转自http://www.linuxsense.org/archives/281.html http:/ ...
最新文章
- 人人网 6.0 版申请页面随着滚动条拖动背景图片滚动出现的原理
- Codeforces Round #649 (Div.2)题解
- 独家 | 文本数据探索性数据分析结合可视化和NLP产生见解(附代码)
- HDU 3397 Sequence operation
- html期末网页设计,求网页设计的期末作业一份 HTML的
- php怎么求最小公倍数,C++_详解C语言求两个数的最大公约数及最小公倍数的方法,求两个正整数的最大公约数nbs - phpStudy...
- oracle 修索引改空间_oracle 修改索引现有表空间
- MyBitis(iBitis)系列随笔之四:多表(多对一查询操作)
- win10系统怎么改奇摩输入法_Yahoo!奇摩輸入法 1.1.2535 for Windows (32-bit) : 軟體王 2020 - 軟體資訊...
- 如何批量将多个 Txt、Json、Html 以及记事本等文本文档快速合并成一个文档
- 大学计算机基础vfp程序设计课程试验报告簿,VF程序设计实验报告册(实践教程).doc...
- 云服务器常见的几种防护方法
- 倒闭潮之后 快消B2B要如何做才能实现盈利
- 发改委指导意见保障大豆产业安全
- Tkinter 组件详解(十):Scale
- ADO/ADO.NET
- 【数据库】MySQL入门
- 媒介查询_2016年最主要的网络攻击媒介
- mysql查询上班打卡sql怎么写_sql查询一段时期里每一天所有员工的打卡记录
- 内网穿透(ngrok服务器搭建)