当前位置: 首页 > article >正文

framebuffer

一、什么是framebuffer

        framebuffer 是一种独立于硬件的抽象图形设备。
                是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。

二、framebuffer的使用步骤

  1. 打开 Framebuffer 设备:通常在 /dev/fb0 设备文件中。

  2. 获取屏幕信息:使用 ioctl 系统调用获取屏幕的分辨率、颜色深度等信息。

        ioctl函数

int ioctl(int fd, unsigned long request, ...);
  • fd:设备文件的文件描述符。
  • request:请求的命令,通常是一个宏,定义了要执行的操作。
  • ...:可选参数,通常是指向数据结构的指针,用于传递额外的信息。

        对于应用层,通过操作/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 */

3.映射 Framebuffer 到内存:使用 mmap 将 framebuffer 映射到进程的地址空间。

        mmap 是一个系统调用,用于将文件或设备的内容映射到进程的地址空间。它允许程序直接访问文件或设备的内存,而无需使用传统的读写操作。

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
  • addr:建议的映射起始地址,通常设置为 NULL
  • length:要映射的字节数。
  • prot:映射区域的保护标志(如可读、可写)。
  • flags:映射的选项(如共享或私有)。
  • fd:要映射的文件描述符。
  • offset:文件或设备的偏移量。

4.绘制图形:直接操作映射的内存来绘制图形。

5.关闭设备:完成后,解除映射并关闭设备。


http://www.kler.cn/a/298685.html

相关文章:

  • 走方格(蓝桥杯2020年试题H)
  • 电商项目-数据同步解决方案(四)商品下架同步更新ES索引库数据
  • 最大化堡垒补给数量的策略与实现
  • 12.31【Linux】shell脚本【运行方式,修改环境变量,数组】思维导图 内附练习
  • Flink读写Kafka(DataStream API)
  • 【MyBatis-Plus 核心接口】BaseMapper 和 IService 深度解析
  • Android13修改Setting实现电量低于30%的话不可执行Rest操作
  • ubuntu配置tftp、nfs
  • 【编程基础知识】Spring过滤器、拦截器、AOP区别
  • 《JavaScript 中数据类型判断、转换技巧及应用实例》
  • GitHub每日最火火火项目(9.10)
  • 最新版 | SpringBoot3如何自定义starter(面试常考)
  • Java数组的定义及遍历
  • 【局域网投屏】sunshine和moonlight投屏/屏幕共享/扩展屏
  • LabVIEW软件,如何检测连接到的设备?
  • 全频段覆盖的卫星通信模块-灵活应对多应用场景
  • Swift 中的函数:定义、使用与实践指南
  • 《ChatGPT:强大的人工智能聊天机器人》
  • vue axios 如何读取项目下的json文件
  • 云计算41——部署project_exam_system项目(续)
  • 正点原子阿尔法ARM开发板-IMX6ULL(四)——汇编LED驱动实验-下
  • 超微小间距COB大尺寸LED智能会议一体机玩转高清视频会议显示市场
  • 1-14 画框画线画圆 opencv树莓派4B 入门系列笔记
  • 建投数据获批安全生产许可证
  • 通过API方式访问llama3
  • 学习使用双指针