首页 > 其他分享 >FrameBuffer

FrameBuffer

时间:2024-09-11 21:51:51浏览次数:14  
标签:__ 映射 vinf fb fd u32 FrameBuffer

一、基本概念

        FrameBuffer:可以译作"帧缓冲、帧缓存",有时简称为 fbdrv。
这是一种独立于硬件的抽象图形设备。是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作控制fb。

        对于应用层,通过操作/dev/fb*,通过ioctl来用各种命令控制fb /usr/include/linux/fb.h中查看

 进入内核源码中看看<linux/fb.h>,里面定义了一些ioctl的命令

#define FBIOGET_VSCREENINFO 0x4600   //获取应用程序可改变的参数(如设定的分辨率)
#define FBIOPUT_VSCREENINFO 0x4601 
#define FBIOGET_FSCREENINFO 0x4602   //获取固定的参数(如屏幕的分辨率,一般只是拿来看看)
#define FBIOGETCMAP     0x4604
#define FBIOPUTCMAP     0x4605
#define FBIOPAN_DISPLAY     0x4606

<linux/fb.h>中还提供了专门的结构体类型,用来存放上述两个参数,如下就是存放可变参数的结构体类型

struct fb_var_screeninfo {
    __u32 xres;         /* visible resolution 可视画面的x、y轴分辨率      */ 
    __u32 yres;
    __u32 xres_virtual;     /* virtual resolution       */
    __u32 yres_virtual;
    __u32 xoffset;          /* offset from virtual to visible 可视画面相对于虚拟画面的x、y轴偏移量*/
    __u32 yoffset;          /* resolution           */

    __u32 bits_per_pixel;       /* guess what   像素深度        */
    __u32 grayscale;        /* != 0 Graylevels instead of colors */

    struct fb_bitfield red;     /* bitfield in fb mem if true color, */
    struct fb_bitfield green;   /* else only length is significant */
    struct fb_bitfield blue;
    struct fb_bitfield transp;  /* transparency         */  

    __u32 nonstd;           /* != 0 Non standard pixel format */

    __u32 activate;         /* see FB_ACTIVATE_*        */

    __u32 height;           /* height of picture in mm    */
    __u32 width;            /* width of picture in mm     */

    __u32 accel_flags;      /* (OBSOLETE) see fb_info.flags */

二、函数接口

1.ioctl函数:

int ioctl(int fd, unsigned long request, ...);

octl() 函数执行成功时返回 0,失败则返回 -1 并设置全局变量 errorno 值,如下:

EBADF  fd is not a valid file descriptor.
EFAULT argp references an inaccessible memory area.
EINVAL request or argp is not valid.
ENOTTY fd is not associated with a character special device.
NOTTY The specified request does not apply to the kind of object,that the file descriptor fd references.
2.mmap函数:

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);

(1)功能:内存映射
(2)参数:
        1)addr:欲映射内存的起始地址,NULL表示系统自动选定,映射成功后返回该地址
        2)length:映射内存大小
        3)prot:映射区域的保护方式(读/写/执行/不能存取)

PROT_EXECPages may be executed.
 PROT_READPages may be read.
PROT_WRITEPages may be written.
PROT_NONEPages may not be accessed.

        4)flags:影响区域映射的各种特性
        MAP_SHARED:对映射区域写入的数据会复制回源文件内,而且允许其他映射该文件的进程共享
        MAP_PRIVATE:对映射区域的写入操作会产生一个映射文件的复制,即对此区域的任何修改都不会写回原来的文件内
        5)fd:要映射的目标文件
        6)offset:文件映射的偏移量(0代表从开头开始)
(3)返回值:void * :返回映射欲映射内存的首地址
  

void *pmem;
struct fb_var_screeninfo vinf;

int init_fb(char *devname)
{
	//1. 打开显示设备
	int fd = open(devname, O_RDWR);	
	if (-1 == fd)
	{
		perror("fail open fb");
		return -1;
	}
	
	//2、获取显示设备相关参数 分辨率 位深度
	int ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinf);
	if (-1 ==ret)
	{
		perror("fail ioctl");
		return -1;
	}
	
	printf("xres = %d, yres = %d\n", vinf.xres, vinf.yres);
	printf("xres_virtual = %d, yres_virtual = %d\n", vinf.xres_virtual, vinf.yres_virtual);
	printf("bits_per_pixel : %d\n", vinf.bits_per_pixel);

	size_t len = vinf.xres_virtual * vinf.yres_virtual * vinf.bits_per_pixel/8;
	//3, 建立显存和用户空间的映射关系
	pmem = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
	if ((void *)-1 == pmem)
	{
		perror("fail mmap");
		return -1;
	}
	return fd;
}
3.munmap函数:

   int munmap(void *addr, size_t length);

(1)功能:解除内存映射
(2)参数:

  • addr:映射内存的地址
  • length:映射内存大小
void uninit_fb(int fd)
{
	size_t len = vinf.xres_virtual * vinf.yres_virtual * vinf.bits_per_pixel/8;
	munmap(pmem, len);
	close(fd);
}
附录:
  1. 打开USB摄像头设备文件(需要以读写/非阻塞方式打开)
  2. 获取摄像头相关参数(VIDIOC_QUERYCAP);
  3. 设置图像帧格式(VIDIOC_S_FMT);
  4. 申请帧缓冲(VIDIOC_REQBUFS);
  5. 获取缓冲地址长度信息(VIDIOC_QUERYBUF);
  6. mmap把内核空间的帧缓冲映射到用户空间
  7. 帧缓冲入队列;
  8. 开始采集图像(VIDIOC_STREAMON);
  9. 出队缓冲帧(VIDIOC_DQBUF);
  10. 访问缓冲帧(读/写)

标签:__,映射,vinf,fb,fd,u32,FrameBuffer
From: https://blog.csdn.net/qq_69639971/article/details/142108055

相关文章

  • framebuffer帧缓存
    1.framebufferFramebuffer(帧缓冲区)是用于存储图像数据的一块内存区域。我们可以将我们想要显示的图像数据写到framebuffer中,驱动程序每隔一段时间会自动的去读取Framebuffer中的图像数据,并根据读取到的图像数据在屏幕上显示对应的图像。2.颜色的表示 我们知道一幅图像其......
  • 帧缓冲 framebuffer
    一、基本概念framebuffer:帧缓存、帧缓存(显示设备)Linux内核为显示提供的一套应用程序接口。(驱动内核支持)分辨率:像素点显示屏:800*600(横向有800个像素点,纵向有600个像素点)显卡(显存(保存像素点的值))RGB888(8个bitR,8个bitG,8个bitB)PC,4412(RGB888)RGB565(S3C2440)......
  • 正点原子Linux Framebuffer编程:解决示例程序在开发板上LCD显示错位和颜色异常
    正点原子LinuxFramebuffer编程:解决示例程序在开发板上运行7寸LCD显示错位和颜色异常作者在学习【正点原子】I.MX6U嵌入式LinuxC应用编程指南V1.4时,发现其配套的程序在开发板上运行不正常。使用的硬件版本:正点原子I.MX6UALPHAV2.4版本底板,LCD:正点原子7寸1024*600,型号ATK-MD0......
  • linux的lcd驱动(framebuffer)---点屏
    一.设定屏幕参数1.更改设备树下的lcd节点参数目录:arch/arm/boot/dts/imx6ull-14x14-nand-7-1024x600-c.dts点击查看代码&i2c2{ goodix_ts@5d{ reg=<0x5d>; };};&lcdif{ display0:display{ bits-per-pixel=<32>;//16 bus-width=<24>; display-......
  • framebuffer(帧缓冲)
    framebuffer    在Linux系统中,Framebuffer通常是指Framebuffer设备,它是一种特殊的字符设备,在Linux系统中,Framebuffer设备使得程序员可以通过其设定的函数接口直接访问硬件,而不需要通过CPU。framebuffer的一般操作流程为:1.打开 (open)2.获取frame相关信息 (ioctl)3.......
  • FrameBuffer 应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
    FrameBuffer应用编程什么是Framebuffer设备Framebuffer定义:Framebuffer是帧缓冲,指一块内存,用于保存一帧图像Linux系统中的Framebuffer:在Linux系统中,Framebuffer是一种显示驱动接口,抽象并屏蔽了不同显示设备的硬件细节,对应用层提供了一块显示内存(显存)Framebuf......
  • 嵌入式linux系统中framebuffer应用开发详解
    大家好,今天给大家详细分析一下,利用framebuffer进行linux应用开发的详细方法。第一:LCD屏Framebuffer基本原理LCDFramebuffer就是一块显存.在嵌入式系统中.显存是被包含在内存中。LCDFramebuffer里的若干字节〈根据驱动程序对LCD控制器的配置而定〉表示LCD屏幕中的一个像素点.......
  • QT 程序使用 Framebuffer 显示 UI
    桌面版本的Linux都会带有类似xorg这样的图形服务,桌面程序和应用程序的UI都是通过图形服务渲染的。但是有些系统为了减少系统体积、提升性能,会把图像服务和没有用到的模块裁剪掉,如:嵌入式系统。没有图形服务程序就不能直接渲染显示UI,这时候我们可以使用Framebuffer进行渲......
  • lcd4linux实现输出framebuffer图像到LCD
    根据文章: Linux下支持AX206LCDFORAIDA64Business ,可以实现输出png图片到AX206LCD。那么如果我们想输出framebuffer的图像到LCD屏幕呢?如何实现?根据[email protected]:ukoda/lcd4linux-ax206.git仓库的代码,我们可以看到png图片的渲染是通过widget_image.c中的 staticvoidwid......
  • Vulkan/FrameBuffer
    帧缓冲(Framebuffer)代表由渲染管线进行渲染的一组图像。它们影响管线的最后几个阶段:深度模板测试,颜色混合,逻辑运算,多重采样等等。一个帧缓冲对象总是附着在一个渲染通道上并且可以用在多个具有相似模板编排的渲染通道中。调用vkCreateFramebuffer创建帧缓冲对象。在VkFramebuffer......