Framebuffer 机制【转】

2023-05-16

本文转载自:http://blog.csdn.net/paul_liao/article/details/7706477

Framebuffer

Framebuffer是Linux系统为显示设备提供的一个接口,它将显示缓存区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。Framebuffer设备是标准的字符设备,主设备号为29,对应于/dev/fbn设备文件。

双缓冲机制

         Android系统中使用的此机制,带来的好处是让画面的切换更流畅。比如可视分辨率为240x320,虚拟分辨率为240x640,当第一帧0~319在显示时,第二帧320~639则在后台计算;当第一帧显示完时,直接切换到第二帧显示。接着系统又可以计算下一帧,这样大大的提高了效率。

驱动文件

Fbmem.c文件实现了帧缓冲驱动公共的调用(核心)

modedb.c所有的VESA标准显示模式信息

Fbmon.c解析显示器的EDID并计算时需参数

Fbcmap.c实现了和调色板相关的调用   

Xxxfb.c具体控制器驱动的实现     

skeletonfb.c   framebuffer的骨架程序

Framebuffer设备驱动框架

帧缓冲设备提供给用户控件的file_operations结构由fbmem.c中的file_operations提供,而特定帧缓冲设备fb_info结构体的注册、注销以及其中的成员的维护,尤其是fb_ops中成员函数的则由对应的xxxfb.c文件实现,fb_ops中的成员函数最终会操作LCD控制器硬件寄存器。

相关数据结构

Fb_info

Fb_info结构是帧缓冲设备属性和操作的完整描述,包含了帧缓冲设备的全部信息,如设备参数设置、以及操作函数指针。每一个帧缓冲设备都必须对应一个fb_info。

struct fb_info {

         structfb_var_screeninfo var; /* 描述fb可变参数 */

         structfb_fix_screeninfo fix;     /* 描述fb固定参数 */

         structbacklight_device *bl_dev;   /* 背光设备 */

         structdevice *dev;           /* This is this fbdevice, guess what? */

         structfb_ops *fbops;   /* fb操作函数集 */

         ……

}

Fb_ops

         Fb_ops是操作底层fb的函数集合,对于不同的LCD控制器实现不同fb_ops,应用层通过file_operations函数集合调用到fb_ops函数集合。

struct fb_ops {

         /*打开和关闭fb设备 */

         int(*fb_open)(struct fb_info *info, int user);

         int(*fb_release)(struct fb_info *info, int user);

         /*用于非线性布局和在常规内存无法映射访问的fb */

         ssize_t(*fb_read)(struct fb_info *info, char __user *buf,

                               size_t count, loff_t *ppos);

         ssize_t(*fb_write)(struct fb_info *info, const char __user *buf,

                                size_t count, loff_t *ppos);

         /*检测可变参数,并调整到支持的值*/

         int(*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);

         /*根据info->var设置video模式 */

         int(*fb_set_par)(struct fb_info *info);

         /*set color register */

         int(*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,

                                unsigned blue, unsigned transp, structfb_info *info);

         /*set color registers in batch */

         int(*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info);

         /*空白显示 */

         int(*fb_blank)(int blank, struct fb_info *info);

         /*pan display */

         int(*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info);

         /*矩形填充 */

         void(*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);

         /*Copy data from area to another */

         void(*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);

         /*Draws a image to the display */

         void(*fb_imageblit) (struct fb_info *info, const struct fb_image *image);

         /*绘制光标 */

         int(*fb_cursor) (struct fb_info *info, struct fb_cursor *cursor);

         /*旋转显示 */

         void(*fb_rotate)(struct fb_info *info, int angle);

         /*wait for blit idle, optional */

         int(*fb_sync)(struct fb_info *info);

         /*perform fb specific ioctl (optional) */

         int(*fb_ioctl)(struct fb_info *info, unsigned int cmd,

                            unsignedlong arg);

         /*Handle 32bit compat ioctl (optional) */

         int(*fb_compat_ioctl)(struct fb_info *info, unsigned cmd,

                            unsignedlong arg);

         /*fb特定的mmap */

         int(*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);

         /*get capability given var */

         void(*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps,

                                struct fb_var_screeninfo *var);

         /*teardown any resources to do with this framebuffer */

         void(*fb_destroy)(struct fb_info *info);

};

fb_var_screeninfo

         记录用户可修改的显示控制器参数,包括屏幕分辨率、每个像素点包含的位数和timing等。

struct fb_var_screeninfo {

         __u32xres;                         /* 可视分别率                 */

         __u32yres;

         __u32xres_virtual;          /* 虚拟分别率                 */

         __u32yres_virtual;

         __u32xoffset;                    /* 虚拟到可视的偏移 */

         __u32yoffset;

         __u32bits_per_pixel;               /* guesswhat                    */

         __u32grayscale;               /* 0 = color, 1 =grayscale,       */

                                                        /* >1 = FOURCC                          */

         /*fb缓存的RGB位域*/

structfb_bitfield red;                /*bitfield in fb mem if true color, */

         structfb_bitfield green;  /* else only length issignificant */

         structfb_bitfield blue;

         structfb_bitfield transp; /* transparency                          */    

         __u32nonstd;                    /* != 0 Nonstandard pixel format */

         __u32activate;                           /* seeFB_ACTIVATE_*             */

         __u32height;                     /* height ofpicture in mm    */

         __u32width;                      /* width ofpicture in mm     */

         __u32accel_flags;            /* (OBSOLETE) seefb_info.flags */

         /*时序:出了pixclock其他单位都是ps*/

         __u32pixclock;                           /*pixel clock in ps (pico seconds) */

         __u32left_margin;           /* time from syncto picture    */

         __u32right_margin;                 /* time frompicture to sync    */

         __u32upper_margin;               /* time fromsync to picture    */

         __u32lower_margin;

         __u32hsync_len;              /* length ofhorizontal sync     */

         __u32vsync_len;              /* length ofvertical sync */

         __u32sync;                        /* seeFB_SYNC_*            */

         __u32vmode;                    /* seeFB_VMODE_*                 */

         __u32rotate;                     /* angle werotate counter clockwise */

         __u32colorspace;            /* colorspace forFOURCC-based modes */

         __u32reserved[4];           /* Reserved forfuture compatibility */

};

Fb_fix_screeninfo

         记录用户不能修改的显示控制器的参数,如帧缓存区的物理地址和长度等。

struct fb_fix_screeninfo {

         charid[16];                         /*identification string eg "TT Builtin" */

         unsignedlong smem_start;    /*帧缓存区的开始物理地址*/

         __u32smem_len;                      /* 长度 */

         __u32type;                        /* seeFB_TYPE_*             */

         __u32type_aux;                         /*Interleave for interleaved Planes */

         __u32visual;                      /* seeFB_VISUAL_*                  */

         __u16xpanstep;                         /* zeroif no hardware panning  */

         __u16ypanstep;                         /* zeroif no hardware panning  */

         __u16ywrapstep;             /* zero if nohardware ywrap    */

         __u32line_length;            /* length of aline in bytes    */

         unsignedlong mmio_start;     /*内存映射IO的开始地址 */

                                               /*(physical address) */

         __u32mmio_len;                       /* Lengthof Memory Mapped I/O  */

         __u32accel;                       /* Indicateto driver which       */

                                               /*  specific chip/card we have       */

         __u16capabilities;           /* see FB_CAP_*                        */

         __u16reserved[2];           /* Reserved forfuture compatibility */

};

Fb_bitfield

         Fb_bitfield结构体描述每个像素点的组织方式。

struct fb_bitfield {

         __u32offset;                      /* 位域偏移   */

         __u32length;                     /*位域长度     */

         __u32msb_right;             /* != 0 : Mostsignificant bit is right */

};

注册/注销函数

Int register_framebuffer(struct fb_info*fb_info);

Int unregister_framebuffer(struct fb_info*fb_info);

fb注册函数主要完成创建fb设备文件、把新的fb设备加入到registered_fb数组和convertfb_var_screeninfo to fb_videomode。Fb注销函数作用则相反。

如何编写一个帧缓冲设备驱动?

内核中提供了一个帧缓冲设备驱动的骨架程序(skeletonfb.c),很有参考价值。现在大多数的LCD控制器都是SOC的,所以驱动里用platform设备来进行注册。

帧缓存设备初始化,需要完成以下几个工作:

1、映射LCD寄存器和申请LCD中断;

2、申请fb_info并初始化fb_fix_screeninfo和fb_var_screeninfo结构体;

3、根据具体LCD屏幕的特点,完成LCD控制器的初始化;

4、申请帧缓冲设备的显示缓存区空间;

5、调用register_framebuffer函数注册帧缓冲设备。

实现fb_ops结构体,其中fb_fillrect、fb_copyarea和fb_imageblit是必须的。

static struct fb_ops xxxfb_ops = {
.owner  = THIS_MODULE,
.fb_open  = xxxfb_open,      /* 打开fb设备 */
.fb_read  = xxxfb_read,
.fb_write  = xxxfb_write,
.fb_release  = xxxfb_release,  /* 关闭fb设备 */
.fb_check_var  = xxxfb_check_var,         /* 检测可变参数,并调整到支持的值 */
.fb_set_par  = xxxfb_set_par,                     /* 初始化LCD控制器 */
.fb_setcolreg  = xxxfb_setcolreg,                  /* 设置color寄存器 */
.fb_blank  = xxxfb_blank,                         /* 显示空白 */
.fb_pan_display= xxxfb_pan_display,
.fb_fillrect  = xxxfb_fillrect, /* Needed !!! 矩形填充  */
.fb_copyarea  = xxxfb_copyarea, /* Needed !!!  数据拷贝 */
.fb_imageblit  = xxxfb_imageblit, /* Needed !!!  图像填充 */
.fb_cursor  = xxxfb_cursor, /* 显示光标 */
.fb_rotate  = xxxfb_rotate,               /* 旋转显示 */
.fb_sync  = xxxfb_sync,
.fb_ioctl  = xxxfb_ioctl,                          /* fb特定的IOCTL */
.fb_mmap  = xxxfb_mmap,             /* fb特定的MMAP */
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Framebuffer 机制【转】 的相关文章

  • Framebuffer 机制【转】

    本文转载自 xff1a http blog csdn net paul liao article details 7706477 Framebuffer Framebuffer是Linux系统为显示设备提供的一个接口 xff0c 它将显示缓
  • open(\"/dev/graphics/fb0\") failed!

    转自VC错误 http www vcerror com p 2160 问题描述 在用手机app通过framebuffer截屏的时候 手机已经root过了 但是执行代码 fb gt fd open dev graphics fb0 O RDO
  • Micropython驱动ST7735显示中文(中文字体库)

    大家是不是遇到显示中文就头大了 又是取模又是怎么的 但麻烦 太繁琐了 对确定的字符显示来说还可以 但不确定的内容时就麻烦了 所以 今天还是来讲讲干货了 来使用一个方便的方式来显示中文 不用取模 直接显示你想要的中英文字体 开始之前要说一下的
  • glClear(GL_COLOR_BUFFER_BIT) 后 OpenGL 无效帧缓冲区操作;

    每次我打电话后glClear GL COLOR BUFFER BIT 我收到 OpenGL 错误 无效的帧缓冲区操作 通话似乎工作正常 没有任何问题 我打电话glClear GL COLOR BUFFER BIT 第一件事在 paintGL
  • python的帧缓冲模块

    我正在寻找一个可以显示的python模块jpg or png文件至 dev fb0直接地 我希望模块可以像这样调用并在屏幕上显示图片 show photo path to jpg x y dev dev fb0 我在google上搜索了这种
  • 写入帧缓冲区

    我使用的是带有内置图形加速器 GMA HD 的 i5 内核 在 RHEL 6 0 操作系统上运行 我需要测试显卡驱动程序的图形加速能力 我发现我的电脑上是i915 我使用以下代码 我从互联网上获得并进行了一些修改 来写入帧缓冲区 inclu
  • 在 fb_var_screeninfo 中设置 yres_virtual 时出现无效参数错误

    我正在尝试为 Linux 创建一个直接写入帧缓冲区 dev fb0 的应用程序 为了使其成为双缓冲 我尝试使虚拟屏幕成为屏幕大小的两倍 这是我写的程序 struct fb var screeninfo screeninfo var stru
  • Opengl 和 Webgl:从附加到当前帧缓冲区的纹理中采样

    我有一个带有两个纹理的帧缓冲区t0 and t1随附的 在第一遍中 我使用多个片段着色器输出渲染它们 在第二遍之前 我执行以下操作 打开仅具有一个输出的着色器 Bind t1到纹理单元 调用 glDrawBuffers 禁用写入t1的附件
  • OpenGL 3.0 帧缓冲区输出到附件而无需我指定?

    好的 我有一个带有一堆附件的帧缓冲区 附件是颜色 绽放 速度和深度 我首先使用以下代码将帧缓冲区清除为我选择的值 Clear Color Buffer float colorDefaultValue 4 0 5 0 5 0 5 1 0 gl
  • pygame.display.init() 对于非 root 用户失败

    Tl dr 我需要使用pygame但由于权限问题 它无法以普通用户身份初始化屏幕帧缓冲驱动程序 根可以做pygame display init 但不是用户 用户位于 视频 组中 可以在其上书写 dev fb0 用户缺少什么权限pygame
  • 帧缓冲区对象拾取

    我正在尝试使用帧缓冲区进行对象拾取 并尝试使用 stbi write png 来查看我正在渲染的内容 因为该帧缓冲区不会渲染到屏幕上 我想使用无符号整数来确定对象 ID 这是帧缓冲区定义 我检查帧缓冲区是否有效 glGenFramebuff
  • Android源代码不工作,通过glReadPixels读取帧缓冲区

    我是 Android 开发新手 有一项任务是在指定的时间间隔后读取帧缓冲区数据 我想出了以下代码 public class mainActivity extends Activity Bitmap mSavedBM private EGL1
  • OpenGL 中的透明 FrameBuffer 背景

    我想使用 glClear 和 glClearColor 用包括 alpha 透明度的颜色填充帧缓冲区 但是 当绑定到渲染到屏幕的纹理时 帧缓冲区始终呈现为不透明 我希望渲染到帧缓冲区的所有内容都保持其透明度 我只是想改变背景 请看下面的代码
  • 使用 Linux 帧缓冲区进行图形处理,但禁用控制台文本

    我有一些 C 代码 可以在 Linux 帧缓冲区控制台上绘制简单的图形 我还使用树莓派及其复合视频输出 操作系统是 raspbian 我正在做一个不使用 X 的低级解决方案 我的图形运行良好 而且我还能够读取 USB 键盘并对按键做出响应
  • 拍摄嵌入式 Linux 帧缓冲区的屏幕截图

    我在评估套件 Zoom OMAP35x Torpedo 开发套件 上运行嵌入式 Linux 该板有一个 LCD 我希望能够拍摄屏幕截图并将其转换为 gif 或 png 我可以通过执行以下操作来获取原始数据 cp dev fb0 screen
  • 无法通过多重采样渲染到纹理

    我运行了帧缓冲区示例this http www open gl framebuffers page 原始代码 http www open gl content code c6 base txt 在osx 10 8中的xcode 4 6中使用
  • OpenGL 通过 FBO 渲染到纹理 -- 不正确的显示与正常纹理

    离屏渲染到纹理绑定的离屏帧缓冲区对象应该是微不足道的 但我遇到了一个问题 我无法理解 我的完整示例程序 目前仅限 2D 在这里 http pastebin com hSvXzhJT http pastebin com hSvXzhJT 请参
  • 将 2 个像素点在一起

    我在第一个像素的右边点了一个像素 但结果不同 第二个像素距离第一个像素很远 怎么了 org 100h change to 320x200 graphic mode mov ax 13 int 10h frame buffer locatio
  • 如何获取/设置默认帧缓冲区的宽度和高度?

    我想知道我的默认帧缓冲区的尺寸 我读到将视口设置为特定值不会影响 设置帧缓冲区的尺寸 是否有任何 GL 要求 您无法通过 OpenGL 调用设置默认帧缓冲区的大小 它是窗口的大小 由窗口系统接口 例如Android上的EGL 控制 如果您想
  • pygame初始化framebuffer或x服务器

    我有一个类检查合适的帧缓冲区 它工作得很好 一对计算机 主要是嵌入式旧板 没有帧缓冲区 所以我删除了init self 函数并手动将其设置为在 X 下运行 两种方式都可以在各自的系统上运行 我只是厌倦了每次进行更改时都将其移植 这是工作帧缓

随机推荐

  • 信息加密(简单的字母转换)

    题目 在传递信息的过程中 xff0c 为了加密 xff0c 有时需要按一定规则将文本转换成密文发送出去 有一种加密规则是这样的 xff1a 1 对于字母字符 xff0c 将其转换成其后的第3个字母 例如 xff1a A D xff0c a
  • TCP协议与UDP协议详解

    TCP协议 TCP xff0c 即Transmission Control Protocol xff0c 传输控制协议 人如其名 xff0c 要对数据的传输进行一个详细的控制 TCP协议的特点 xff1a 有连接 xff0c 可靠传输 xf
  • C语言头文件相互包含的问题

    我深知前路风雨 xff0c 但我依然微笑前行 头文件相互包含的问题 问题 xff1a 头文件交叉包含是否会导致递归包含 xff0c 导致编译出错 xff1f 如果不会因为递归包含出错 xff0c 那么交叉包含是不是完全没问题 xff1f 1
  • 【51单片机STC89C52】DHT11温湿度传感器的使用

    目录 一 DHT11概述 数据传送逻辑 数据格式 通讯过程时序图 二 检测模块是否存在 时序逻辑分析 代码实现 三 读取温湿度数据 DHT11传输0的时序分析 DHT11传输1的时序分析 代码实现 四 串口打印 一 DHT11概述 数据传送
  • Hadoop MapReduce自关联(单表关联)-案例

    案例 xff1a 获取孙子和祖父母的列表 单表关联 txt child parent Tom Lucy Tom Jack Jone Lucy Jone Jack Lucy Mary Lucy Ben Jack Alice Jack Jess
  • Oracle-Grouping sets

    Oracle Grouping sets span class token comment 创建一个雇员表 span span class token keyword CREATE span span class token keyword
  • Udacity深度学习-深度神经网络-assignment3

    六层深度神经网络 43 SGD 43 L2正则项 43 dropout xff0c TensorFlow实现 NN with SGD L2 batch size 61 128 layer cnt 61 6 层数 graph 61 tf Gr
  • 【基于STM32的串口通信----用软件模拟】

    注 xff1a 这是我上班第一次学习串口通信 xff0c 此文章基于STM32F4系列单片机 一 xff1a 什么是软件模拟串口通信 xff1a 1 平常所用串口通信都是用的单片机外设 xff0c 是单片机内部自带的模块 xff0c 只需要
  • 关于单片机内存详解

    引言 xff1a 内存是单片机的重要组成部分 xff0c 那么如何操作 分配内存对于一个嵌入式软件工程师来说便是极为重要的 一 存储器的定义 xff1a 存储器单元实际上是时序逻辑电路 的一种 按存储器的使用类型可分为只读存储器 xff08
  • Keil编译报错--IAP\IAP.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.

    之前在用CUBE生成文件时发生了这样的报错 xff1a IAP IAP sct 7 error L6236E No section matches selector no section to be FIRST LAST 发生这样的报错是因
  • Keil编程环境背景颜色--护眼色

    在Edit中选择Configuration 选择Colors amp Fonts 点击下载那个按钮 按照这个参数输入自定义颜色并添加 xff0c 就保存为一个护眼的绿色啦
  • win10下MissionPlanner地面站的安装

    win10下MissionPlanner地面站的安装 编辑器 xff1a Viaual Studio2019社区版 安装时工作负荷和单个组件的选择如下图所示 xff0c 然后自定义安装位置进行安装 安装完成后启动MP地面站 启动Visual
  • git fatal: The remote end hung up unexpectedly 错误

    使用git将本地项目添加到远程仓库报以下错误 git push u origin master Counting objects 2053 done Delta compression using up to 2 threads Compr
  • git submodule update --init --recursive

    转自https blog csdn net wangjia55 article details 24400501 转自http webfrogs me 2013 03 20 git submodule 开发过程中 xff0c 经常会有一些通
  • C++简介( C++ Primer Plus)

    C 43 43 历史 xff1a 1980年 xff0c 贝尔实验室的 Bjarne Stroustrup 本贾尼 斯特劳斯 开始对C进行改进和扩充 1983年正式命名为C 43 43 支持3钟不同的程序设计 过程化程序设计 数据 43 算
  • 树莓派3B+ 引脚图说明

    如上图所示 xff0c 我们可以很清楚的看到各个引脚的功能 例如我们想使用pwm引脚来控制舵机 xff0c 则我们可以考虑使用其中的 BCM18 PWM0 和 BCM13 PWM1 在使用wiringPi库时 xff0c 我们定义的引脚即B
  • 树莓派3B+ 串口使用大全(实现串口通信功能)

    1 树莓派串口控制台功能 在2018 10 09 raspbian stretch img镜像中 xff0c 要使用串口来调试设备 xff0c 需要修改conig txt文件 1 sudo systemctl disable hciuart
  • Java学习笔记(三)函数——学习MOOC网翁恺老师课程记录

    七 函数 7 1 函数定义与调用 Java的函数必须定义在类的内部 xff0c 成为类的成员 定义一个函数 xff0c 要像这样写 xff1a lt 返回类型 gt lt 方法名称 gt lt 参数表 gt lt 方法体 gt 返回类型是这
  • STL笔试面试题总结(干货)

    STL笔试面试题总结 一 STL有哪些组件 STL提供六大组件彼此此可以组合套用 1 容器 容器就是各种数据结构 我就不多说 看看下面这张图回忆一下就好了 从实现角度看 STL容器是一种class template 2 算法 各种常见算法
  • Framebuffer 机制【转】

    本文转载自 xff1a http blog csdn net paul liao article details 7706477 Framebuffer Framebuffer是Linux系统为显示设备提供的一个接口 xff0c 它将显示缓