嵌入式Linux—Framebuffer应用编程

2024-04-24 17:28

本文主要是介绍嵌入式Linux—Framebuffer应用编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Framebuffer 应用编程

Frame的意思是帧,buffer的意思是缓冲区。Framebuffer就是一块内存(硬件设备),里面保存着一帧图像。

ioctl()函数解析

ioctl()函数非常强大。不同的驱动程序内部会实现不同的 ioctl() ,可以使用各种 ioctl() 跟驱动程序交互:可以传数据给驱动程序,也可以从驱
动程序中读出数据。

头文件:

#include <sys/ioctl.h>

函数原型:

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

函数说明:
① fd 表示文件描述符;
② request 表示与驱动程序交互的命令, 用不同的命令控制驱动程序输出我们需要的数据
③ … 表示可变参数 arg, 根据 request 命令,设备驱动程序返回输出的数据。
④ 返回值: 打开成功返回0,失败将返回-1

实现步骤

1.获取framebuffer描述符

fd_fb = open("/dev/fb0", O_RDWR);  //可读可写if(fd_fb == -1) {printf("can not open /dev/fb0\n");return -1;}

2.获取屏幕可变参数

if(ioctl(fd_fb, FBIOGET_VSCREENINFO, &var)) { //结构体名不是地址,需要取地址。FBIOGET_VSCREENINFO是获取可变参数(fb.h)printf("can not get var\n");return -1;} 

3.计算framebuffer空间大小

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;  //单位:字节fb_base = (unsigned char*)mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, );if(fb_base == (unsigned char*)-1) {printf("can not mmap\n");return -1;}

4.不同的RGB格式转换

switch(var.bits_per_pixel) {case 8:{/*代码*/break;}case 16:{/* 32位转换为RGB565 */red = (color >> 16) & 0xff;   //保留17-24位green = (color >> 8) & 0xff;  //保留8-16位blue = (color >> ) & 0xff;   //保留0-8位color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);  //组合为16bit*add_16 = color;   //像素点对应的地址空间赋值break;}case 32:{*add_32 = color;break;}default:printf("can't surport %dbpp\n", var.bits_per_pixel);break;}

完整程序如下:

#include <sys/mman.h>
#include <sys/*.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>int fd_fb;    //文件描述符
int screen_size;  //屏幕总字节数(framebuffer的大小)
struct fb_var_screeninfo var;
unsigned char *fb_base;
unsigned int line_width;   //行字节
unsigned int pixel_width;  //像素字节void lcd_put_pixel(int x, int y, unsigned int color) {unsigned char *add_8 = fb_base + y*line_width + x*pixel_width; //像素点对应的内存地址unsigned short *add_16;unsigned int *add_32;unsigned int red, green, blue;add_16 = (unsigned short*)add_8;  //8位转换为16位add_32 = (unsigned int*) add_8;switch(var.bits_per_pixel) {case 8:{/*代码*/break;}case 16:{/* 32位转换为RGB565 */red = (color >> 16) & 0xff;   //保留17-24位green = (color >> 8) & 0xff;  //保留8-16位blue = (color >> ) & 0xff;   //保留0-8位color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);  //组合为16bit*add_16 = color;   //像素点对应的地址空间赋值break;}case 32:{*add_32 = color;break;}default:printf("can't surport %dbpp\n", var.bits_per_pixel);break;}}int main(int argc, char **argv)
{int i;/* 1.获取framebuffer描述符 */fd_fb = open("/dev/fb0", O_RDWR);  //可读可写if(fd_fb == -1) {printf("can not open /dev/fb0\n");return -1;}/* 2.获取屏幕可变参数 */if(ioctl(fd_fb, FBIOGET_VSCREENINFO, &var)) { //结构体名不是地址,需要取地址printf("can not get var\n");return -1;} /* 3.计算framebuffer空间大小 **/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;  //单位:字节fb_base = (unsigned char*)mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, );if(fb_base == (unsigned char*)-1) {printf("can not mmap\n");return -1;}/* 清屏: 全部设为白色 */memset(fb_base, 0xff, screen_size);/* 随便设置出100个为蓝色 */for (i = ; i < 100; i++)lcd_put_pixel(var.xres/2+i, var.yres/2, 0x0000FF);munmap(fb_base , screen_size);close(fd_fb);return ;
}

这篇关于嵌入式Linux—Framebuffer应用编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932371

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的