帧缓冲设备应用开发

通过/dev/fbn,应用程序可进行的针对帧缓冲设备的操作主要有如下几种:

  • 读写/dev/fbn:相当于读写屏幕缓冲区。例如cp /dev/fb0 tmp命令可将当前屏幕的内容复制到一个文件中,而命令cp tmp > /dev/fb0则将图形文件tmp显示在屏幕上。
  • 映射操作:对于帧缓冲设备,可通过mmap()映射操作将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。
  • I/O控制:对于帧缓冲设备,对设备文件的ioctl()操作可读取/设置显示设备及屏幕的参数,如分辨率、显示颜色数、屏幕大小等。

在应用程序中,操作/dev/fbn的一般步骤如下:

  • 打开/dev/fbn设备文件。
  • 用ioctl()操作取得当前显示屏幕的参数,如屏幕分辨率、每个像素点的比特数和偏移。根据屏幕参数可计算屏幕缓冲区的大小。
  • 将屏幕缓冲区映射到用户空间。
  • 映射后就可以直接读/写屏幕缓冲区,进行绘图和图片显示了。

范例代码:

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <fcntl.h>
 4 #include <linux/fb.h>
 5 #include <sys/mman.h>
 6 #include <errno.h>
 7
 8 int main() {
 9     int fp = 0;
10     struct fb_var_screeninfo vinfo;
11     struct fb_fix_screeninfo finfo;
12
13     int screensize = 0;
14     char *fbp = 0;
15     int x = 0, y = 0;
16     int location = 0;
17     int bytes_per_pixel;
18
19     fp = open("/dev/fb0", O_RDWR);
20     if(fp < 0) {
21         printf("open failed\n");
22     }
23
24     if(ioctl(fp, FBIOGET_FSCREENINFO, &finfo)) {
25         perror("ioctl");
26     }
27
28     if(ioctl(fp, FBIOGET_VSCREENINFO, &vinfo)) {
29         perror("ioctl");
30     }
31
32     bytes_per_pixel = vinfo.bits_per_pixel/8;
33     screensize = vinfo.xres * vinfo.yres * bytes_per_pixel;
34     printf("x = %d  y = %d   bytes_per_pixel = %d\n",  vinfo.xres,  vinfo.yres,  bytes_per_pixel);
35     printf("scrrensize = %d\n",  screensize);
36
37     fbp = (char*) mmap(0,  screensize,  PROT_READ |PROT_WRITE,  MAP_SHARED, fp, 0);
38     if(fbp < 0) {
39         perror("mmap");
40     }
41
42     for(x = 100; x<200; x++) {
43         for(y=100; y<200; y++) {
44             location = x * bytes_per_pixel + y * finfo.line_length;
45             *(fbp + location) = 0;
46             *(fbp +location + 1) = 255;
47             *(fbp + location + 2) = 0;
48             *(fbp + location + 3) = 0;
49         }
50     }
51
52     munmap(fbp, screensize);
53     close(fp);
54     return 0;
55 }  

原文地址:https://www.cnblogs.com/laoyaodada/p/8398966.html

时间: 2024-08-02 05:47:19

帧缓冲设备应用开发的相关文章

【原创】IP摄像头技术纵览(三)---图像数据在帧缓存设备(framebuffer)上的显示

[原创]IP摄像头技术纵览(三)-图像数据在帧缓存设备(framebuffer)上的显示 本文属于<IP摄像头技术纵览>系列文章之一: Author: chad Mail: [email protected] 本文可以自由转载,但转载请务必注明出处以及本声明信息. 提起Linux的窗口系统,我们第一个想到的就是X-Window.X-Window是Unix/Linux上的图形系统,它是通过X-Server来控制硬件的.但有一些Linux的发行版在引导的时候就会在屏幕上出现图形,这时的图形是不可能

帧缓冲子系统框架

1  Linux帧缓冲子系统 帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,它把显示设备描述成一个缓冲区,允许应用程序在图形模式下直接对显示显示缓冲区进行读写操作. 帧缓冲是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容.通过不断的向帧缓冲写入数据,显示控制器就自动的从帧缓冲中读取数据并显示出来.帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示设备,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/dev/fb0~fb31,帧缓

Linux设备驱动开发基础

1.驱动概述和开发环境搭建 1.1驱动设备的作用 对设备驱动最通俗的解释就是"驱动硬件设备行动".驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮训.中断处理.DMA通信,进行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据. 由此可见,设备驱动充当了硬件和应用软件之间的纽带,他使得应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作.在系统中没有操作系统的情况下,工

摄像头v4l2编写,实现视频在帧缓冲显示

申明:该文档只是记录我的编写和理解过程,代码部分参考了较多的文章,如有意见请联系我删除,谢谢. 目标: 使用v4l2提供API,完成摄像头视频采集,并使用帧缓存显示. 准备工作: USB摄像头1个 编译环境(我用的是PC+Ubuntu14.04) 了解大概情况,查看如下网址,基本情况应该没问题了:http://baike.baidu.com/item/V4L2?sefr=enterbtn 框架理解: 关键点理解: 摄像头采集的循环buf 必须使用循环buf,否则摄像头采集图像显示不会连续. 摄像

OpenGL学习脚印: 帧缓冲对象(Frame Buffer Object)

写在前面 一直以来,我们在使用OpenGL渲染时,最终的目的地是默认的帧缓冲区,实际上OpenGL也允许我们创建自定义的帧缓冲区.使用自定义的帧缓冲区,可以实现镜面,离屏渲染,以及很酷的后处理效果.本节将学习帧缓存的使用,文中示例代码均可以在我的github下载. 本节内容整理自 1.OpenGL Frame Buffer Object (FBO) 2.www.learnopengl.com Framebuffers FBO概念 在OpenGL中,渲染管线中的顶点.纹理等经过一系列处理后,最终显

V4L2捕捉画面+H264压缩视频+帧缓冲显示视频————帧缓冲显示视频

帧缓冲显示主要步骤 打开设备文件, 比如/dev/fb0 获取framebuffer的一些信息, 比如分辨率 设置参数 映射framebuffer内存到用户空间 写入要显示的画面 /* display.c */ #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <unistd

linux 字符设备驱动开发详解

一.设备的分类及特点 1.字符设备 字符设备是面向数据流的设备,没有请求缓冲区,对设备的存取只能按顺序按字节的存取而不能随机访问.    Linux下的大多设备都是字符设备.应用程序是通过字符设备节点来访问字符设备的.通常至少需要实现 open, close, read, 和 write 等系统调用.    设备节点一般都由mknod命令都创建在/dev目录下,包含了设备的类型.主/次设备号以及设备的访问权限控制等,如:crw-rw----  1 root  root 4, 64 Feb 18

Linux设备驱动开发学习(1):前言

虽然网络上已经有很多Linux设备驱动开发学习的文章和博客,更是有很多经典的Linux设备驱动开 发的书籍,写这些博文似乎意义不大,但把自己的学习过程.学习心得记录下来,一方面有着强化巩固的 意义,另一方面也是把所学知识转化为自己所得的必要途径之一,这是我写这些的博客的原始动力.

《Linux设备驱动开发详解(第3版)》海量更新总结

本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 2015.2.26 几乎完成初稿. [F]是修正或升级:[N]是新增知识点:[D]是删除的内容 第1章 <Linux设备驱动概述及开发环境构建>[D]删除关于LDD6410开发板的介绍[F]更新新的Ubuntu虚拟机[N]添加关于QEMU模拟vexpress板的描述 第2章 <驱动设计的硬件基础> [N]增加关于SoC的介绍:[N]增加关于eFuse的内容:[D]删除ISA总线的内容了:[N]增加关于SP