Linux下的Framebuffer编程

news2024/11/20 12:29:37

文章目录

  • 前言
  • 一、LCD操作原理
  • 二、代码解析及编写程序的步骤
    • 0.定义各类参数
    • 1.打开LCD设备节点
    • 2.获取触摸屏数据
    • 3.mmap映射Framebuffer,在Framebuffer中写入数据
  • 三、LCD操作函数解析
    • 1.描点函数
    • 2.显示字符函数
  • 总结


前言

本篇文章将会介绍Linux下的Framebuffer编程,这里将会引用到百问网韦东山老师讲的一些知识。

一、LCD操作原理

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

二、代码解析及编写程序的步骤

0.定义各类参数

下面这些参数后面我们会一 一介绍。

int fd_fb;
struct fb_var_screeninfo var;	/* Current var */
int screen_size;
unsigned char *fbmem;
unsigned int line_width;
unsigned int pixel_width;

1.打开LCD设备节点

这些的fd_fb就是打开LCD设备返回的文件句柄。
/dev/fb0 :LCD设备节点(根据自己板子上面的节点填写)

	fd_fb = open("/dev/fb0", O_RDWR);
	if (fd_fb < 0)
	{
		printf("can't open /dev/fb0\n");
		return -1;
	}

2.获取触摸屏数据

使用ioctl获取LCD的一些参数信息,并将这些参数的信息放入var结构体中。

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

var结构体解析:
这个结构体里面保存了LCD的相关信息,比如xres和yres就是代表了x方向的分辨率和y方向的分辨率。
大家的手机都有分辨率,最常见的就是1080×1920了。对应到xres和yres就是xres=1080,yres=1920。
大家只需要知道var这个结构体是用来保存ioctl获取到的LCD的参数信息即可。
bits_per_pixel:每一个像素的颜色用多少位表示

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 colorspace;		/* colorspace for FOURCC-based modes */
	__u32 reserved[4];		/* Reserved for future compatibility */
};

3.mmap映射Framebuffer,在Framebuffer中写入数据

line_width:var.xres * var.bits_per_pixel代表每一行有多少个像素
/8就代表了每一行有多少个字节
pixel_width每一个像素多少个字节
screen_size :计算出整个屏幕所占字节的大小
fbmem :Framebuffer是存在于驱动程序当中的,在应用程序中不可直接使用,需要使用mmap将驱动程序的内存映射到应用程序中才可进行操作。

	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;
	fbmem = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
	if (fbmem == (unsigned char *)-1)
	{
		printf("can't mmap\n");
		return -1;
	}

三、LCD操作函数解析

1.描点函数

pen_8 ,pen_16,pen_32参数代表的是起笔点,因为我使用的LCD每个像素是8位的,所以我这里只需要计算pen_8 即可,其他两个只需要进行一次转换即可。
pen_8 的计算
在这里插入图片描述

void lcd_put_pixel(int x, int y, unsigned int color)
{
	unsigned char *pen_8 = fbmem+y*line_width+x*pixel_width;
	unsigned short *pen_16;	
	unsigned int *pen_32;	

	unsigned int red, green, blue;	

	pen_16 = (unsigned short *)pen_8;
	pen_32 = (unsigned int *)pen_8;

	switch (var.bits_per_pixel)
	{
		case 8:
		{
			*pen_8 = color;
			break;
		}
		case 16:
		{
			/* 565 */
			red   = (color >> 16) & 0xff;
			green = (color >> 8) & 0xff;
			blue  = (color >> 0) & 0xff;
			color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
			*pen_16 = color;
			break;
		}
		case 32:
		{
			*pen_32 = color;
			break;
		}
		default:
		{
			printf("can't surport %dbpp\n", var.bits_per_pixel);
			break;
		}
	}
}


2.显示字符函数

void lcd_put_ascii(int x, int y, unsigned char c, unsigned int color)
{
	unsigned char *dots = (unsigned char *)&fontdata_8x16[c*16];
	int i, b;
	unsigned char byte;

	for (i = 0; i < 16; i++)
	{
		byte = dots[i];
		for (b = 7; b >= 0; b--)
		{
			if (byte & (1<<b))
			{
				/* show */
				lcd_put_pixel(x+7-b, y+i, color); /* 白 */
			}
			else
			{
				/* hide */
				lcd_put_pixel(x+7-b, y+i, 0); /* 黑 */
			}
		}
	}
}

总结

本篇文章就介绍到这里,Framebuffer编程的编程其实并不算很难,大家只要理清楚这些参数即可。具体的代码请参考百问网,这里我只做重要部分介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html中的定位知识点如何使用

目录 系列文章目录 文章目录 前言 一、定位是什么&#xff1f;有什么用&#xff1f; 二、定位方式有哪些&#xff1f;怎么使用&#xff1f; 1、静态定位&#xff1a;就是默认的定位方式&#xff0c;意思就是没有定位; 2、相对定位&#xff1a; 3、绝对定位&…

PDF怎么转成Word?安利几个转换小技巧

平时我们工作学习的时候&#xff0c;经常要跟文件打交道&#xff0c;并且接触最多的文件形式就是PDF与Word两种文件格式&#xff0c;它们各有各的好处&#xff0c;PDF的保密性以及兼容性好&#xff0c;便于我们进行文件分享查阅&#xff0c;而Word就方便我们进行编辑。如果我们…

Ubuntu Server 22.04.1配置(配置root账号、设置固定IP、更改SSH端口、配置UFW、VM扩展磁盘后Ubuntu的扩容)

为了能快速的创建虚拟机&#xff0c;通过VM创建了一个2核CPU、4G内存、40G硬盘&#xff0c;安装Ubuntu Server 22.04.1的虚拟机&#xff0c;以便在需要的时候随时克隆一个新的虚拟机出来。 在新的虚拟机克隆出来后可能会调整硬件的配置&#xff0c;例如将40G硬盘扩展到50G&…

Python编程 字典创建

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.字典 1.字典介绍 &#xff08;了解&#xff09; 2.字典创建&#xff0…

艾美捷nickases内切酶活性检测及相关研究

艾美捷nickases内切酶组分&#xff1a; NLS-Cas9(D10A) Nickase(0.1 μg/μl) 500 μL 10Reaction Buffer 1 ml 艾美捷nickases内切酶切割活性检测&#xff1a; NLS-Cas9(D10A) Nickase(0.1 μg/μl) 500 μL 10Reaction Buffer 1 ml 经多次柱纯化&#xff0c;SDS-PAGE 胶检…

70. 爬楼梯(动态规划解法)

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&a…

【异常】com.alicp.jetcache.CacheException: refresh error

jetcache refresh error一、背景描述二、报错内容三、报错原因四、解决方案4.1 解决方案一&#xff0c;使用一级缓存4.2 解决方案二&#xff0c;开启写入权限一、背景描述 技术栈&#xff1a;Spring Boot(2.1.5.RELEASE) Spring Cloud Oopenfeign(2.1.1.RELEASE) jetCache(2.…

基于nodejs电商购物系统的设计与实现(论文+源码+ppt文档+视频录制)

资料下载地址&#xff1a;请点击》》》》 1 前言 2 1.1课题背景 2 1.2课题内容 3 2 需求分析 4 2.1 功能需求 4 2.2 性能需求 5 系统安全性 5 系统数据完整性 5 2.3 数据需求 6 2.4 运行环境需求 6 客户端配置 6 服务器配置 6 2.5 nodejs框架分析 6 3 系统设计 7 3.1 系统设计…

软件项目管理期中准备(自用,仅供参考)

考前拿到了样卷(#^.^#) 直接面向样卷备考 软件项目管理期中准备&#xff08;自用&#xff0c;仅供参考&#xff09;选择题计算题1.进度管理-关键路径法&#xff0c;时间压缩法2.进度管理-任务历时估计3.成本管理-COCOMO估算法4.项目的执行与控制-挣值分析法5.成本管理-专家估算…

数据库-----JDBC技术

JDBC概述 数据的持久化 持久化(persistence)&#xff1a;将内存中的数据保存到可永久保存的存储 设备中&#xff08;如磁盘&#xff09;。 持久化的主要应用是将内存中的数据存储在关系型数据库中&#xff0c;当 然也可以存储在磁盘文件、XML数据文件中。 什么是 JDBC 1、JDBC…

DIN EN ISO 4589-2塑料 用氧指数法测定燃烧行为 第2 部分:室温试验

ISO 4589-2 塑料-用氧指数法测定燃烧行为-第2部分:室温测试&#xff0d;标准名称&#xff1a; ISO 4589-2 塑料-用氧指数法测定燃烧行为-第2部分:室温测试 ISO 4589-2 Plastics-Determination of burning behaviour by oxygen index –Part 2: Ambient-temperature test ISO 4…

推荐10个不错的React开源项目

1&#xff0c;Kutt.it Kutt是一个现代的URL缩短器&#xff0c;支持自定义域&#xff0c;可以用来缩短网址、管理链接并查看点击率统计信息。Kutt支持自定义域名&#xff0c;设置链接密码和描述&#xff0c;缩短URL的私人统计信息&#xff0c;查看、编辑、删除和管理链接&#…

LPWA物联网通信

物联网LPWA是物联网中的无线通信技术之一。 根据物联网无线通信技术的覆盖距离&#xff0c;大致可分为两类&#xff1a;一类是短距离通信技术&#xff0c;包括蓝牙(蓝牙)&#xff1b;NFC,Zigbee、WIFI、NFC&#xff0c;主要用于室内智能家庭、消费电子等场景&#xff1b;另一种…

C++异常

21 C异常 21.1 什么时候会发生异常 1.打开一个不存在的文件 2.请求存储空间失败 3.数组越界等等 21.2 使用abort()函数 1.包含在cstdlib头文件中&#xff0c;包含在std命名空间中 2.当调用abort()函数时&#xff0c;会引发异常并中断程序(Visual Studio 2019)&#xff1b;…

【PlasticSCM Could Edition】新版本云托管浅试 (与踩一些坑)

【PlasticSCM Could Edition】新版本云托管浅试前言尝试对比前言 UnityHub 3.3.0-c7 中&#xff0c;下载了一个 2021LST 的版本&#xff0c;毕竟为了做毕设&#xff0c;用 2020LST 的感觉老了点… 然后新建了一个项目&#xff0c;勾选使用 版本控制 &#xff0c;但是报错 那先…

【附源码】计算机毕业设计JAVA药品管理系统

【附源码】计算机毕业设计JAVA药品管理系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA mybati…

STM32CubeMX学习笔记(48)——USB接口使用(MSC基于外部Flash模拟U盘)

一、USB简介 USB&#xff08;Universal Serial BUS&#xff09;通用串行总线&#xff0c;是一个外部总线标准&#xff0c;用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、…

HTTP —— HTTP 响应详解, 构造 HTTP 请求

JavaEE传送门JavaEE 【前端】JavaScript —— WebAPI HTTP —— HTTP 协议中的细节(超详细!!) 目录HTTP 响应详解认识 "状态码"状态码小结认识响应 "报头" headerContent-Type认识响应 "正文" body构造 HTTP 请求form 表单ajaxpostmanHTTP 响应…

API接口怎么使用(教你使用api接口获取数据)

API是应用程序的开发接口&#xff0c;在开发程序的时候&#xff0c;我们有些功能可能不需要从到到位去研发&#xff0c;我们可以拿现有的开发出来的功能模块来使用&#xff0c;而这个功能模块&#xff0c;就叫做库(libary)。比如说&#xff1a;要实现数据传输的安全&#xff0c…

【Linux】常见指令汇总

每个优秀的人&#xff0c;都有一段沉默的时光。 那段时光&#xff0c;是付出了很多努力&#xff0c;却得不到结果的日子&#xff0c;我们把它叫做扎根。 文章目录一、xshell的介绍操作系统1.1 xshell1.2 操作系统二、Linux下基本指令2.1 ls(显示当前目录下的文件列表&#xff…