framebuffer

framebuffer

1.framebuffer的理解

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

1.分辨率:横向的像素点和纵向的像素点构成的,像素点越多图片越高清
2.显存(不允许用户操作):用来存储显示屏刷新出来的数据,数模转换到显示屏(显卡的控制电路完成)
3.用户空间:将显存中一段没有用到的空间经过内存映射到用户的空间,此时在用户空间写入东西就可以映射到显存中(MMU)
4.RGB:颜色值,红绿蓝三原色,可以调节颜色比例获得需要的颜色
RGB888:占4字节 (0x00 FF 00 00  32bit 红色)   
RGB565:占2字节     
RGB555:不常见
显示屏:像素点先由左至右,再由上至下排列

核心思路:通过在用户空间写入东西(RGB颜色值)映射在显存中,显卡再将显存的内容转换到显示屏上,完成像素点的绘制。

过程:想在在显示屏上的(x,y)点写入红色的颜色值。通过用户空间首地址pmem偏移,偏移的字节数由数据类型来定(pmem+y*800+x)。将红色的RGB值写入偏移完后的位置,通过内存映射到显存中,写入的位置为(y*800+x   先从左到右,再从上到下)

2.代码实现:

打开显示设备(/dev/fb0)-> 获取显示设备相关参数(ioctl),如分辨率,像素深度 -> 建立内存映射mmap,获得用户空间的首地址 -> 直接写入颜色值 -> 清屏操作,解除内存映射 -> 关闭显示设备

需要用到的函数:

1.#include <sys/ioctl.h>
   int ioctl(int fd, int request, ...);    
   ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);    //获取屏幕信息(可变)

<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 */

#include <sys/mman.h>
2.void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
功能:内存映射
参数:
    addr:欲映射内存的起始地址,NULL表示系统自动选定,映射
          成功后返回该地址
    length:映射内存大小
    prot:映射区域的保护方式(读/写/执行/不能存取)
    flags:影响区域映射的各种特性
            MAP_SHARED:对映射区域写入的数据会复制回源文件内,
                        而且允许其他映射该文件的进程共享
            MAP_PRIVATE:对映射区域的写入操作会产生一个映射文件的复制,
                        即对此区域的任何修改都不会写回原来的文件内
    fd:要映射的目标文件
    offset:文件映射的偏移量(0代表从开头开始)
返回值:
    void * :返回映射欲映射内存的首地址
    eg:
    unsigned int* addr = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE,
            MAP_SHARED, fd, 0);
3.int munmap(void *addr, size_t length);
功能:解除内存映射
参数:
    addr:映射内存的地址
    length:映射内存大小

代码:

/*初始化显示设备*/
int init_fb(const char *fbname)
{//1.打开显示设备int fd = open(fbname, O_RDWR);	if (-1 == fd){perror("fail open fb");return -1;}struct fb_var_screeninfo vinf;   //虚拟屏幕的信息//2.获取显示设备(虚拟屏幕)的相关参数:分辨率和像素深度int ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinf); //获取信息if (ret < 0){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);//将获取到的信息放进定义的结构体变量中fbinf_g.bits = vinf.bits_per_pixel;fbinf_g.x_virtual = vinf.xres_virtual;fbinf_g.y_virtual = vinf.yres_virtual;fbinf_g.fd = fd;//3.建立内存映射关系:将显存空间映射到用户空间size_t size = vinf.xres_virtual*vinf.yres_virtual*vinf.bits_per_pixel/8;fbinf_g.pmem = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if ((void *)-1 == fbinf_g.pmem){perror("fail mmap");return -1;}return 0;
}/*绘制一个像素点*/
void draw_point(int x, int y, unsigned int col)  //传参:坐标x,y和颜色
{if (x >= fbinf_g.x_virtual || y >= fbinf_g.y_virtual){return ;         //超过显示屏范围跳出}if (fbinf_g.bits == RGB888_FMT){unsigned int *p = fbinf_g.pmem;   //RGB888*(p+y*fbinf_g.x_virtual + x) = col;   //将这个点赋值颜色  点为:p+y*宽+x}else if (fbinf_g.bits == RGB565_FMT){unsigned short *p = fbinf_g.pmem;  //RGB565*(p+y*fbinf_g.x_virtual + x) = col;}
}/*解除映射*/
void uninit_fb()
{munmap(fbinf_g.pmem ,  fbinf_g.x_virtual*fbinf_g.y_virtual*fbinf_g.bits/8);//     映射地址      映射内存的大小,显示屏的x*y*深度/8(字节)close(fbinf_g.fd);
}/*画横直线*/
void draw_x_line(int x, int y, int len, unsigned int col)
{for (int i = x; i < x+len; i++){draw_point(i, y, col);    //y不变,x递增}
}/*画竖直线*/
void draw_y_line(int x, int y, int len, unsigned int col)
{for (int i = y; i < y+len; i++){draw_point(x, i, col);   //x不变,y递增}
}/*画矩形*/
void draw_rectangle(int x, int y, int w, int h, unsigned int col)
{draw_x_line(x, y, w, col);draw_y_line(x, y, h, col);draw_x_line(x, y+h, w, col);draw_y_line(x+w, y, h, col);
}/*画圆*/
void draw_circle(int x, int y, int r, unsigned int col)
{int x0, y0;for (float si = 0; si <= 360; si += 0.1){x0 = r * cos(2 * 3.1415/360 * si) + x;y0 = r * sin(2 * 3.1415/360 * si) + y;draw_point(x0, y0, col);draw_point(x0+1, y0, col);draw_point(x0, y0+1, col);draw_point(x0-1, y0, col);draw_point(x0, y0-1, col);}
}

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

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

相关文章

GitHub学生认证

文件、证明之类的一定要用英文。 我先是用有道网页翻译把学信网的报告翻译成了英文&#xff0c;然后截图传上去&#xff0c; 给我这个答复 所以要先2FA认证、支付信息填好。 2FA认证&#xff1a;Github开启2FA双重验证 - 知乎 (zhihu.com) 支付信息&#xff1a;点击Setting…

【学习】软件测试行业 ,有哪些以就业为主的学习侧重点

今天给所有入行软测的同学们&#xff0c;帮大家梳理下以就业为主的学习侧重点&#xff0c;简单来说就是【这些都是重点&#xff0c;圈起来&#xff0c;要考的】&#xff0c;有需要的小伙伴可以往下看。 建议一&#xff1a;一定要学习一门编程语言&#xff0c;再开始使用自动化测…

LC 100.相同的树

100. 相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a; p [1,2,3], q [1,2,3] 输出&#xff1…

PostgreSQL技术大讲堂 - 第48讲:PG高可用实现keepalived

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第48讲&#…

IPv6-基础概念

IPv6基础概念 IPv6技术特点&#xff1a;精简报文格式、实现自动配置和重新编制、支持层次化网络编制、支持端对端安全、更好的支持Qos、支持移动特性。 五元组&#xff1a;源地址&#xff0c;目的地址&#xff0c;源端口&#xff0c;目的端口&#xff0c;协议。 IPv6报头优势…

gitee 本地文件提交到仓库

一、准备工作 1.下载Git Bash Git Bash官网下载地址 http://www.git-scm.com/download/ 点此跳转 2.注册或登录gitee gitee官网地址 https://gitee.com/ 点此跳转 没有账号选择注册有账号的话直接登陆 3.在gitee中新建一个空的仓库 登陆成功后点进个人主页&#xff0c;点击…

美国免税州详细地址:可用于ChatGPT、MJ、POE、AppStore等订阅服务账单地址填写!

地址1zip_Codecountriesstatecitystreet199654USAAKWasilla2075 E Chickaloon Rd236110USAAL MontgomeryMontgomery372034USAARConway617 Watkins St486303USAAZPrescott330 S Cortez St592805USACAAnaheim505 S Zeyn St680232USACOLakewood1390 S Zephyr St706109USACTWether…

Pygame基础4-多阶段

4-多阶段 原理 本章是对第2章的延续。 我们希望为游戏添加多个阶段&#xff0c;比如开始界面、游戏界面、结束界面等。 为此&#xff0c;我们可以使用一个类来管理游戏的不同阶段。 我们创建了GameManager类&#xff0c;并通过self.status属性表示不同的阶段。 intro阶段…

javaSSM公司招聘管理系统IDEA开发mysql数据库web结构计算机java编程maven项目

一、源码特点 IDEA开发SSM公司招聘管理系统是一套完善的完整企业内部系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;MAVEN方式加 载&#xff0c;系统具有完整的源代码和…

solr-lucene的解释

什么是solr-lucene Solr是一个基于Apache Lucene的开源搜索平台。Lucene是一个开源的全文搜索引擎库&#xff0c;它提供了一个简单而强大的API&#xff0c;用于索引和搜索文档。Solr通过在Lucene的基础上构建一个更高级的搜索平台&#xff0c;为用户提供了更丰富的功能和易于使…

聊聊我做测试开发的十年心路历程

作者&#xff1a;天士 一、前言 不知不知觉&#xff0c;已经从事测试开发这个行当 10 来年了&#xff0c;从上大学到参加工作&#xff0c;从南方到北方再回南方&#xff0c;辗转了大半个中国&#xff0c;如今算算进公司已经开启了第五个年头&#xff0c;今年就要五年陈了。 兜…

解决三维模型的模型调色的主要技术方法

解决三维模型的模型调色的主要技术方法 三维模型的模型调色是指对三维模型的表面进行着色和贴图&#xff0c;使其更加真实和生动。在数字媒体、游戏开发和影视制作等领域&#xff0c;模型调色是十分重要的环节。下面将介绍三维模型模型调色的主要技术方法。 材质贴图 材质贴图…

智能文档处理技术综述

一、 智能文档处理介绍 智能文档处理&#xff08;Intelligent Document Processing, IDP&#xff09;是利用人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、计算机视觉&#xff08;CV&#xff09;、自然语言处理&#xff08;NLP&#xff09;等技术…

机器学习笔记(2)—单变量线性回归

单变量线性回归 单变量线性回归(Linear Regression with One Variable)1.1 模型表示1.2 代价函数1.3 代价函数的直观理解1.4 梯度下降1.5 梯度下降的直观理解1.6 梯度下降的线性回归 单变量线性回归(Linear Regression with One Variable) ps:...今天很倒霉 一名小女孩悄悄地碎…

Redhat7安装yum源,解决报错No more mirrors to try...

运行yum出现报错 或者 bash: yum: command not found...的提示&#xff0c;按照此篇文章重新安装yum并配置源即可。 前提 Linux系统为redhat7&#xff0c;且可以通外网 步骤一&#xff1a;卸载原有yum 使用rpm -qa | grep yum 查看 rpm -qa|grep yum|xargs rpm -e --node…

极端道路天气数据集 雨天 雾天 道路晴朗

极端道路天气数据集 是一系列专为自动驾驶、智能交通系统研发以及计算机视觉算法测试而设计的真实世界或模拟的道路环境图像和视频集合。这些数据集包含了在各类极端天气条件下捕捉到的道路场景&#xff0c;例如大雾、暴雨、暴雪、冰雹、雾霾、道路结冰等&#xff0c;这些都是…

【数据分享】1929-2023年全球站点的逐日平均海平面压力(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…

【C++中的STL(未完成)】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

Vue.js高效前端开发(增删查)

效果图 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div id"app"><span>ID</span><input type"text" name"…

如何在Java中创建Excel表单控件

前言 在数据填报时&#xff0c;创建Excel表单控件是一项常见的任务&#xff0c;它可以极大地简化数据收集和处理的过程。传统的做法需要在Excel中开启开发工具&#xff0c;并且自己手动添加&#xff0c;如下图&#xff0c;就是一个常见的表单控件。 而在Java中&#xff0c;可…