【Linux】Framebuffer 应用

# 前置知识

LCD 操作原理

  • 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。 Frame 是帧的意思, buffer 是缓冲的意思,这意味着 Framebuffer 就是一块内存,里面保存着一帧图像。 Framebuffer 中保存着一帧图像的每一个像素颜色值,假设 LCD 的分辨率是 1024x768,每一个像素的颜色用 32 位来表示,那么 Framebuffer 的大小就是: 1024x768x32/8=3145728 字节。

  • 假设需要设置 LCD 中坐标(x,y)处像素的颜色,首要要找到这个像素对应的内存,然后根据它的 BPP(像素深度 bits per pixel) 值设置颜色。假设 fb_base 是 APP 执行 mmap 后得到的 Framebuffer 地址,可以用以下公式算出(x,y)坐标处像素对应的 Framebuffer 地址:

(x, y)像素起始地址=fb_base+(xres*bpp/8)*y + x*bpp/8

  • 对于 32BPP,一般只设置其中的低 24 位,高 8 位表示透明度,一般的 LCD都不支持。
    对于 24BPP,硬件上为了方便处理,在 Framebuffer 中也是用 32 位来表示,效果跟 32BPP 是一样的。
    对于 16BPP,常用的是 RGB565;

API 函数 

  • ioctl 函数

        ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。

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

函数参数:

参数描述
fd文件描述符
cmd交互协议,设备驱动将根据 cmd 执行对应操作
可变参数 arg,依赖 cmd 指定长度以及类型

返回值: 

EBADF d is not a valid descriptor. 
EFAULT argp references an inaccessible memory area. 
EINVAL Request or argp is not valid. 
ENOTTY d is not associated with a character special device. 
ENOTTY The specified request does not apply to the kind of object that the descriptor d references. 

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

函数参数:

返回值: 

  • 返回值类型:int
  • 若成功映射,将返回指向映射的区域的指针,失败将返回-1

 # 结构体详解

struct fb_fix_screeninfo主要用于获取FrameBuffer的固定信息,这些信息无法在应用层被更改,只能通过ioctl函数使用FBIOGET_FSCREENINFO去获取。

struct fb_fix_screeninfo定义

struct fb_fix_screeninfo {
	char id[16];			/* identification string eg "TT Builtin" */
	unsigned long smem_start;	/* Start of frame buffer mem (physical address) */
	__u32 smem_len;			/* Length of frame buffer mem	*/
	__u32 type;				/* see FB_TYPE_*				*/
	__u32 type_aux;			/* Interleave for interleaved Planes */
	__u32 visual;			/* see FB_VISUAL_*				*/ 
	__u16 xpanstep;			/* zero if no hardware panning  */
	__u16 ypanstep;			/* zero if no hardware panning  */
	__u16 ywrapstep;		/* zero if no hardware ywrap    */
	__u32 line_length;		/* length of a line in bytes    */
	unsigned long mmio_start;/* Start of Memory Mapped I/O (physical address) */
	__u32 mmio_len;			/* Length of Memory Mapped I/O  */
	__u32 accel;			/* Indicate to driver which*//*specific chip/card we have	*/
	__u16 capabilities;		/* see FB_CAP_*					*/
	__u16 reserved[2];		/* Reserved for future compatibility */
};

 struct fb_fix_screeninfo字段说明

表格中提到的宏如FB_TYPE_PACKED_PIXELSFB_VISUAL_TRUECOLORFB_ACCEL_NONE请查看 /usr/include/linux/fb.h 的相关定义。

字段名称描述附加说明
id设备驱动名称
smem_start显存起始物理地址
smem_len显存大小
type显卡类型一般为 FB_TYPE_PACKED_PIXELS(值为0,表示像素值紧密排 列),查看fb.h的 FB_TYPE_*
type_aux附加类型查看fb.h的 FB_AUX_TEXT_MDA
visual色彩模式一般为 FB_VISUAL_TRUECOLOR(值为2,真彩色)
xpanstep支持水平方向上的 PAN 显示:
0:不支持
非 0:支持,此时该值用于表示在水平方向上每步进的像素值
默认为 1
ypanstep支持垂直方向上的 PAN 显示:
0:不支持。
非 0:支持,此时该值用于表示在垂直方向上每步进的像素值。
默认为 1
ywrapstep该方式类似于 ypanstep,不同之处在于:当其显示到底部时,能回到显存的开始处进行显示。默认为 0
line_length每行字节数
mmio_start显存映射 I/O 首地址默认为不支持
mmio_len显存映射 I/O 长度默认为不支持
accel显示所支持的硬件加速设备默认为 FB_ACCEL_NONE

 struct fb_var_screeninfo定义

struct fb_var_screeninfo {
	__u32 xres;				/* visible resolution		*/
	__u32 yres;
	__u32 xres_virtual;		/* virtual resolution		*/
	__u32 yres_virtual;
	__u32 xoffset;			/* offset from virtual to visible */
	__u32 yoffset;			/* resolution			*/

	__u32 bits_per_pixel;	/* guess what			*/
	__u32 grayscale;		/* 0 = color, 1 = grayscale,*//* >1 = FOURCC*/
	
	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 	*/

	/* Timing: All values in pixclocks, except pixclock (of course) */
	__u32 pixclock;			/* pixel clock in ps (pico seconds) */
	__u32 left_margin;		/* time from sync to picture	*/
	__u32 right_margin;		/* time from picture to sync	*/
	__u32 upper_margin;		/* time from sync to picture	*/
	__u32 lower_margin;
	__u32 hsync_len;		/* length of horizontal sync*/
	__u32 vsync_len;		/* length of vertical sync	*/
	__u32 sync;				/* see FB_SYNC_*		*/
	__u32 vmode;			/* see FB_VMODE_*		*/
	__u32 rotate;			/* angle we rotate counter clockwise */
	__u32 reserved[5];		/* Reserved for future compatibility */
};

struct fb_var_screeninfo字段说明

表格中提到的宏和结构体请查看 /usr/include/linux/fb.h 的相关定义。

获取 fb_fix_screeninfo和fb_var_screeninfo信息

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>

/* fb_var_screeninfo info */
static int fd_fb;
static struct fb_var_screeninfo var;
static int screen_size;
static unsigned char *fb_base;
static unsigned int line_width;
static unsigned int pixel_width;

/* fb_fix_screeninfo info */
static struct fb_var_screeninfo finfo;

int main(int argc, char **argv)
{
	int i;
	
	fd_fb = open("/dev/fb0", O_RDWR);
	if (fd_fb < 0)
	{
		printf("can't open /dev/fb0\n");
		return -1;
	}

	if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
	{
		printf("can't get var\n");
		return -1;
	}

    if (ioctl(fd_fb, FBIOGET_FSCREENINFO, &finfo) < 0)
    {
        fprintf(stderr, "ioctl FBIOGET_FSCREENINFO err \r\n");
        return -1;
    }

	line_width  = var.xres * var.bits_per_pixel / 8;
	pixel_width = var.bits_per_pixel / 8;
	screen_size = var.xres * var.yres * var.bits_per_pixel / 8;

    /* 映射 Framebuffer */
	fb_base = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
	if (fb_base == (unsigned char *)-1)
	{
		printf("can't mmap\n");
		return -1;
	}

	munmap(fb_base , screen_size);
	close(fd_fb);
	
	return 0;	
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/392987.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

才气系统与逻辑系统道装实现的比较

才气系统与逻辑系统道装实现的比较 道装道装思想简介烛火流形学习引擎&#xff0c;流形学习的引入王船山信息熵&#xff0c;简称王船山熵&#xff1b;凝聚态数学可计算函数科学方法道装由来琴语言简介逻辑与才气的逐层比较表格&#xff08;王船山熵&#xff09; 道装 道装思想…

LeetCode 0589.N 叉树的前序遍历:深度优先搜索(DFS)

【LetMeFly】589.N 叉树的前序遍历&#xff1a;深度优先搜索(DFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/n-ary-tree-preorder-traversal/ 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表…

防火墙 iptables(二)--------------SNAT与DNAT

一、SNAT ①SNAT 应用环境: 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) ②SNAT原理: 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映射 数据包从内网发送到公网时&#xff0c;SNAT会把数据包的源IP由…

【Web】CVE-2022-22947 SpringCloud Gateway SpEL漏洞学习

目录 简介 Actuator操作Gateway接口列表 复现流程 漏洞复现 简单原理 简介 Spring Boot Actuator 和 Spring Cloud Gateway 是 Spring 生态系统中的两个关键组件&#xff0c;它们在微服务架构中扮演着不同的角色&#xff0c;下面简要介绍它们之间的关系&#xff1a; Spri…

MobaXterm下载安装及使用教程

一、MobaXterm的简介 MobaXterm是一款功能强大的远程计算工具&#xff0c;集成了诸多网络工具和便利功能&#xff0c;包括SSH、X11服务器、SFTP等&#xff0c;支持Windows系统。用户可以使用MobaXterm来轻松管理远程服务器&#xff0c;进行文件传输&#xff0c;远程桌面显示等操…

九宫格锁屏模块,九宫格设置密码

要使用九宫格设置密码,先用自定义一个九宫格样式,使用的自定义的view画出九个点,然后重写onMeasure和onDraw,这两个方法,并处理onTouchEvent,这个事件 在Android视图的绘制和布局过程中&#xff0c;onMeasure和onDraw这两个方法的调用顺序是固定的。以下是它们通常的调用顺序&…

Java数字孪生智慧工地数据大屏APP项目源码

目录 智慧工地云平台核心功能 1.劳务管理 2.视频监控 3.安全教育 4.进度管理 5.环境监测 6.塔吊监控 7.升降机监控 8.工地广播 9.深基坑高支模 10.AI识别 11.安全质量 智慧工地建设的价值和意义 危大工程管理 智慧工地聚焦施工现场一线生产活动&#xff0c;利用物…

typescript类型详解

因为介绍了ts的全部类型,所以比较长,各位可以通过目录选择性观看 typescript类型概述typescript 类型注解概念-->监测类型变化 ts类型注解语法ts常用类型原始类型对象类型对象类型_数组类型 ts新增,联合类型ts函数类型ts 函数类型 voidts 函数类型可选参数 ts 对象类型ts 可…

MySQL数据库基础(七):DML数据表操作

文章目录 DML数据表操作 一、数据表的基本操作 1、数据表的创建 2、查询已创建数据表 3、修改数据表信息 ① 数据表字段添加 ② 修改字段名称或字段类型 ③ 删除某个字段 ④ 修改数据表名称 4、删除数据表 二、字段类型详解 1、整数类型 2、浮点类型 3、日期类型…

Pandas.DataFrame.cumprod() 累积乘积 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

对前端限流操作(Redis版本)4种算法

固定时间窗口算法 固定时间窗口算法也可以叫做简单计数算法。网上有很多都将计数算法单独抽离出来。但是笔者认为计数算法是一种思想&#xff0c;而固定时间窗口算法是他的一种实现包括下面滑动时间窗口算法也是计数算法的一种实现。因为计数如果不和时间进行绑定的话那么失去…

Redis篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、redis的过期策略以及内存淘汰机制二、Redis 常见性能问题和解决方案?三、为什么Redis的操作是原子性的,怎么保证原子性的?四、Redis事务前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家…

视频基础知识

文章目录 一、视频信号1.1 模拟信号1.2 数字信号 二、视频扫描格式三、视频图像基础四、图像颜色空间1、颜色空间分类2、YUV分类3、YUV存储方式4、YUV类型和存储类型关系5、Color Range6、RBG与YUV互转规范7、RBG与YUV转换公式 五、视频信号显示格式1、标清SD2、高清HD3、全高清…

001kafka源码项目gradle报错UnsupportedClassVersionError-kafka-报错-大数据学习

1 报错提示 java.lang.UnsupportedClassVersionError: org/eclipse/jgit/lib/AnyObjectId has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 如…

Ubuntu 22 安装VNC远程图形界面(GNOME)

0.更新软件源 $ sudo apt update 1.安装VNC $ sudo apt install tightvncserver 2.安装GNOME $ sudo apt install -y gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal ubuntu-desktop 3. 安装支持VNC与Windows之间复制粘贴 $ sudo apt install xcl…

docker (七)-部署容器

实战开始&#xff1a; 1 docker 部署 kafka 集群&#xff0c;并验证 参考 Docker搭建Kafka集群 优秀文档 2 docker 部署 mysql 参考上一篇docker(六) 3.docker 部署 zabbix 参考 docker部署zabbix 优秀文档 BUG&#xff1a;根据这篇文章部署后&#xff0c;发现zabbix-s…

思科命令配置使用方法介绍,全网最全!

你们好&#xff0c;我的网工朋友。 思科作为数通界的老大哥&#xff0c;老一辈网络工程师都是从学习思科开始的吧。 往期也发过命令大全&#xff0c;但是很多朋友反馈拿到命令却不知道从何下手&#xff1f; 今天这篇文章&#xff0c;我将给你介绍思科命令配置的使用方法&#x…

YOLO 损失函数之SIoU 和 Focal 损失在PyTorch中的实现

YOLO (You Only Look Once)系列模型以其实时目标检测能力而闻名,其有效性很大程度上归功于其专门的损失函数。在本文中,我们深入研究了YOLO 演化中不可或缺的各种YOLO 损失函数,重点关注它们在PyTorch中的实现。我们的目标是提供对这些功能的清晰的技术理解,这对于优化模…

【STM32 CubeMX】SPI W25Q64功能实现

文章目录 前言一、内部函数的实现1.1 选中和取消选中SPI Flash1.2 写使能函数1.3 获取读状态1.4 等待就绪状态 二、Flash读写函数实现2.1 读Flash ID2.2 擦除某个扇区2.3 写扇区2.4 读数据 三、测试代码总结 前言 SPI Flash 存储器在嵌入式系统中扮演着重要角色&#xff0c;它…

django定时任务(django-crontab)

目录 一&#xff1a;安装django-crontab&#xff1a; 二&#xff1a;添加django_crontab到你的INSTALLED_APPS设置&#xff1a; 三&#xff1a;运行crontab命令来创建或更新cron作业&#xff1a; 四&#xff1a;定义你的cron作业 五&#xff1a;创建你的管理命令&#xff…