Linux操作系统下使用FrameBuffer直接写屏 2011-03-28 11:42:08

分类:

因为Linux是工作在保护模式下,所以用户态进程是无法象Dos那样使用显卡BIOS里提供的中断调用来实现直接写屏,故Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。

在继续下面的之前,先说明几个背景知识:

  1. FrameBuffer主要是根据VESA标准的实现的,所以只能实现最简单的功能。
  2. 由于涉及内核的问题,FrameBuffer是不允许在系统起来后修改显示模式等一系列操作。(好象很多人都想要这样干,这是不被允许的,当然如果你自己与驱动的话,是可以实现的)
  3. 对FrameBuffer的操作,会直接影响到本机的所有控制台的输出,包括XWIN的图形界面。

  好,现在可以让我们开始实现直接写屏:

  1. 打开一个FrameBuffer设备
  2. 通过mmap调用把显卡的物理内存空间映射到用户空间
  3. 直接写内存。

  好象很简单哦~
  fbtools.h

#ifndef _FBTOOLS_H_
#define _FBTOOLS_H_

#include <linux/fb.h>

/* a framebuffer device structure */
typedef struct fbdev{
int fb;
unsigned long fb_mem_offset;
unsigned long fb_mem;
struct fb_fix_screeninfo fb_fix;
struct fb_var_screeninfo fb_var;
char dev[20];
} FBDEV, *PFBDEV;

/* open & init a frame buffer */
/* to use this function,
you must set FBDEV.dev="/dev/fb0"
or "/dev/fbX" */
/* it's your frame buffer. */
int fb_open(PFBDEV pFbdev);

/*close a frame buffer*/
int fb_close(PFBDEV pFbdev);

/*get display depth*/
int get_display_depth(PFBDEV pFbdev);

/*full screen clear */
void fb_memset(void*addr, int c, size_t len);

#endif

  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相关推荐

  1. Linux驱动框架之framebuffer驱动框架

    1.什么是framebuffer? (1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备.帧缓冲 ...

  2. 以OpenGL/ES视角介绍gfx-hal(Vulkan) Framebuffer接口使用

    文档列表见:Rust 移动端跨平台复杂图形渲染项目开发系列总结(目录) 草稿状态 以OpenGL/ES Framebuffer角度看,如果用gfx-hal(Vulkan)接口实现类似OpenGL/ES ...

  3. framebuffer的入门介绍-实现程序分析【转】

    本文转载自:http://blog.csdn.net/liuzijiang1123/article/details/46972723 如想想对lcd屏进行操作(例如在lcd屏幕上画线,或者显示视频数据 ...

  4. Opengl编程学习笔记(五)——从FRAGMENT到PIXEL(framebuffer 帧缓存)

    1.帧缓存包括颜色.scissor.alpha.stencil.depth这些缓存,所以帧缓存不是一片缓存,而是所有这些缓存的组合,帧缓存它对应了屏幕上的每一个pixel(不是真正的pixel,而是一 ...

  5. Android原生(Native)C开发之二 framebuffer篇

    为什么80%的码农都做不了架构师?>>>    Android原生(Native)C开发之二 framebuffer篇 如对Android原生(Natvie)C开发还任何疑问,请参阅 ...

  6. NanoPi NEO Air使用十四:FrameBuffer的理解和使用

    FrameBuffer的介绍 应用程序直接通过操作显存来操作 LCD,实现在 LCD 上显示字符.图片等信息.在 Linux 中应用程序最终也是通过操作 RGB LCD 的显存来实现在 LCD 上显示 ...

  7. 同一AppDomain内的SharpGL的FrameBuffer会相互影响?

    同一AppDomain内的SharpGL的FrameBuffer会相互影响? 今天做一个试验时,偶然发现了这样一个问题. 以SharpGL的示例项目SimpleDrawingSample为例. 给Fo ...

  8. Framebuffer原理、使用、测试系列文章

    FROM: http://bbs.chinaunix.net/viewthread.php?tid=1932291&extra=page%3D1%26amp%3Bfilter%3Dtype%2 ...

  9. 使用libjpeg显示JPEG图像在framebuffer 测试(八)

    2011-05-03 21:00:46 分类: 嵌入式 本文的copyright归yuweixian4230@163.com 所有,使用GPL发布,可以自由拷贝,转载.但转载请保持文档的完整性,注明原 ...

  10. framebuffer显示JPEG图片

    framebuffer显示JPEG图片 2011-05-03 20:14:45 分类: 嵌入式 转自http://www.linuxsense.org/archives/281.html http:/ ...

最新文章

  1. 人人网 6.0 版申请页面随着滚动条拖动背景图片滚动出现的原理
  2. Codeforces Round #649 (Div.2)题解
  3. 独家 | 文本数据探索性数据分析结合可视化和NLP产生见解(附代码)
  4. HDU 3397 Sequence operation
  5. html期末网页设计,求网页设计的期末作业一份 HTML的
  6. php怎么求最小公倍数,C++_详解C语言求两个数的最大公约数及最小公倍数的方法,求两个正整数的最大公约数nbs - phpStudy...
  7. oracle 修索引改空间_oracle 修改索引现有表空间
  8. MyBitis(iBitis)系列随笔之四:多表(多对一查询操作)
  9. win10系统怎么改奇摩输入法_Yahoo!奇摩輸入法 1.1.2535 for Windows (32-bit) : 軟體王 2020 - 軟體資訊...
  10. 如何批量将多个 Txt、Json、Html 以及记事本等文本文档快速合并成一个文档
  11. 大学计算机基础vfp程序设计课程试验报告簿,VF程序设计实验报告册(实践教程).doc...
  12. 云服务器常见的几种防护方法
  13. 倒闭潮之后 快消B2B要如何做才能实现盈利
  14. 发改委指导意见保障大豆产业安全
  15. Tkinter 组件详解(十):Scale
  16. ADO/ADO.NET
  17. 【数据库】MySQL入门
  18. 媒介查询_2016年最主要的网络攻击媒介
  19. mysql查询上班打卡sql怎么写_sql查询一段时期里每一天所有员工的打卡记录
  20. 内网穿透(ngrok服务器搭建)

热门文章

  1. 服务发布或重启,发生抖动怎么办?
  2. 皮一皮:原来骑骆驼要求这么高。。
  3. 阿里 P7 内功修炼法则
  4. Spring Boot中使用自定义Annotation来实现接口自动幂等
  5. Containers vs Serverless
  6. 使用Redis实现在线点赞系统
  7. 检测跟踪 DeepSOCIAL:基于YOLOv4的人群距离监测 集检测、跟踪以及逆透视映射一体的系统
  8. c++智能指针 示例讲解
  9. OpenglES2.0 Android:画矩形
  10. OCtaveResNet 测试