简单描述一下framebuffer的使用,它其实就相当于将屏幕上的像素映射到内存中,改变内存中的内容后屏幕自动就变颜色了。

  首先要调用open("/dev/fb0", O_RDWR);打开帧缓冲设备文件,获得文件描述符,然后使用mmap将文件内容映射到内存中,具体映大小取决于屏幕大小,初始化程序如下:

 typedef unsigned short color_t;                /* 根据实际情况修改,此处为unsigned short是565的屏 */

 static struct fb_var_screeninfo __g_vinfo;    /* 显示信息 */
static color_t *__gp_frame; /* 虚拟屏幕首地址 */ int framebuffer_init (void)
{
int fd = ; fd = open("/dev/fb0", O_RDWR);
if (fd == -) {
perror("fail to open /dev/fb0\n");
return -;
} ioctl(fd, FBIOGET_VSCREENINFO, &__g_vinfo); /* 获取显示信息 */
printf("bits_per_pixel = %d\n", __g_vinfo.bits_per_pixel); /* 得到一个像素点对应的位数 */ __gp_frame = mmap(NULL, /* 映射区的开始地址,为NULL表示由系统决定映射区的起始地址 */
__g_vinfo.xres_virtual * __g_vinfo.yres_virtual * __g_vinfo.bits_per_pixel / , /* 映射区大小 */
PROT_WRITE | PROT_READ, /* 内存保护标志(可读可写) */
MAP_SHARED, /* 映射对象类型(与其他进程共享) */
fd, /* 有效的文件描述符 */
); /* 被映射内容的偏移量 */
if (__gp_frame == NULL) {
perror("fail to mmap\n");
return -;
} return ;
}

初始化成功后对__gp_frame指针操作就相当于对屏幕进行操作了。附上完整测试程序:

 #include <stdio.h>
#include <linux/fb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h> typedef unsigned short color_t; /* 根据实际情况修改,此处为unsigned short是565的屏 */ static struct fb_var_screeninfo __g_vinfo; /* 显示信息 */
static color_t *__gp_frame; /* 虚拟屏幕首地址 */
static color_t __g_pen_color; /* 画笔颜色 */ int framebuffer_init (void)
{
int fd = ; fd = open("/dev/fb0", O_RDWR);
if (fd == -) {
perror("fail to open /dev/fb0\n");
return -;
} ioctl(fd, FBIOGET_VSCREENINFO, &__g_vinfo); /* 获取显示信息 */
printf("bits_per_pixel = %d\n", __g_vinfo.bits_per_pixel); /* 得到一个像素点对应的位数 */ __gp_frame = mmap(NULL, /* 映射区的开始地址,为NULL表示由系统决定映射区的起始地址 */
__g_vinfo.xres_virtual * __g_vinfo.yres_virtual * __g_vinfo.bits_per_pixel / , /* 映射区大小 */
PROT_WRITE | PROT_READ, /* 内存保护标志(可读可写) */
MAP_SHARED, /* 映射对象类型(与其他进程共享) */
fd, /* 有效的文件描述符 */
); /* 被映射内容的偏移量 */
if (__gp_frame == NULL) {
perror("fail to mmap\n");
return -;
} return ;
} /**
* \brief 填充整屏
*/
void full_screen (color_t color)
{
int i;
color_t *p = __gp_frame; for (i = ; i < __g_vinfo.xres_virtual * __g_vinfo.yres_virtual; i++) {
*p++ = color;
}
} int main(int argc, const char *argv[])
{
int i = ; if (framebuffer_init()) {
return ;
} while () {
if (i % == )
full_screen(0x001F);
else if (i % == )
full_screen(0x07E0);
else if (i % == )
full_screen(0xF800); sleep();
i++;
} return ;
}

执行程序后屏幕交替显示红绿蓝三种颜色。

十四、使用framebuffer填充纯色的更多相关文章

  1. 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)

    解剖SQLSERVER 第十四篇    Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究 ...

  2. NeHe OpenGL教程 第十四课:图形字体

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)

    本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...

  4. 实验十四 第九组 张燕~杨蓉庆~杨玲 Swing图形界面组件

    实验十四  Swing图形界面组件 8-11-29 理论知识 Swing和MVC设计模式 (1)设计模式(Design pattern)是设计者一种流行的 思考设计问题的方法,是一套被反复使用,多数人 ...

  5. 第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制

    第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制 用命令创建自动爬虫文件 创建爬虫文件是根据scrap ...

  6. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  7. 如鹏网学习笔记(十四)ASP.NET

    Asp.net笔记 一.Socket类 进行网络编程的类,可以在两台计算机之间进行网络通讯 过程: 向服务器发送指令: GET /index.html HTTP/1.1 Host:127.0.0.1: ...

  8. 条目十四《使用reserve来避免不必要的重新分配》

    条目十四<使用reserve来避免不必要的重新分配> 使用vector和string的插入元素的时候,我们是不用担心内存问题的(只要不超过容器的max_size).因为底层有分配子管理内存 ...

  9. Java编程思想之十四 类型信息

    第十四章 类型信息 运行时类型信息使得你可以在程序运行时发现和使用类型信息 14.1 为什么需要RTTI 面向对象编程中基本的目的是:让代码只操作对基类的引用. 多态: import java.uti ...

随机推荐

  1. fiddler抓不到chrome浏览器的请求

    今天遇到一个非常尴尬的问题,接口在某种情况下会报错,此时前端会展示NAN之类的东西,由于复现不了,接口现在一直不报 错了,所以就让前端做了个友好提示, 当接口报错时,给个提示“请稍后重试” ,我要测试 ...

  2. 【官方下载】EasyCMDB官方基础版免费下载使用!

    链接

  3. sunset

    may there be enough clouds in your life to make a beautiful sunset

  4. yii2部署nginx

    页面全部提示404,nginx平台下需要额外配置yii rewrite规则,配置如下: 在nginx 的配置文件nginx.conf //增加部分 location / { # Redirect ev ...

  5. ZJOI2019Day1AFO记

    先去看了看T3,发现暴力DP就是n^3的,于是不妨先写一个,写完n^3就9:30多了..有点慌去看看T1,太鬼畜了,还是先写个n=5压压惊...写了一年,在11:00写完并检查(?)了n=5.然后去看 ...

  6. python之路——博客目录

    博客目录 python基础部分 函数 初识函数 函数进阶 装饰器函数 迭代器和生成器 内置函数和匿名函数 递归函数 常用模块 常用模块 模块和包 面向对象 初识面向对象 面向对象进阶 网络编程 网络编 ...

  7. python爬虫-入门-了解爬虫

    作为一个爬虫新手,我觉得首先要了解爬虫是的作用以及应用. 作用:通过爬虫获取网页内的信息.包括:标题(title)图片(image)链接(url)等等 应用:抽取所需信息,进行数据汇总及分析(从事网页 ...

  8. 通过P3P头实现跨域设置cookie

    PHP的setcookie函数可以设置域,但是只能在当前域内,如果出现多域可由如下办法处理:实现原理:www.b.com/set_cookie.php   在b域名下设置a域名的cookie < ...

  9. ckeditor文本对齐方式添加,图片上传

    最近用的AdminBSBMaterialDesign-master模板,里边用到了ckeditor编辑器 但发现里边没有基本的文本对齐方式,找了好一会,好多方法都不管用,最后在config.js中添加 ...

  10. 15、TypeScript-函数

    1.参数和返回值可以指定类型 2.可选参数:在参数上加上?,表示可选的,可传可不传 3.默认参数:如果你不传参数,默认为20,如果你传参,就是你传的参数 4.剩余参数:会把传进来的实参变成一个数组,可 ...