fb_var_screeninfo:记录了帧缓冲设备和指定显示模式的可修改记录。包括屏幕的分辨率,像素信息和一些时序变量

struct fb_var_screeninfo {

__u32 xres;             /* 行像素数 */

__u32 yres;             /* 列像素数 */

__u32 xres_virtual;     /* virtual resolution       */

__u32 yres_virtual;

__u32 xoffset;          /* offset from virtual to visible */

__u32 yoffset;          /* resolution           */

__u32 bits_per_pixel;   /*每个像素的位数            */

__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;      /* acceleration flags (hints)   */

/* 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 reserved[6];      /* Reserved for future compatibility */

};

前几个成员决定了分辨率。xres和yres是在屏幕上可见的实际分辨率,在通常的vga模式将为640和400(也许是480,by highbar)。*res-virtual决定了构建屏幕时视频卡读取屏幕内存的方式。当实际的垂直分辨率为400,虚拟分辨率可以是800。这意味着 800行的数据被保存在了屏幕内存区中。因为只有400行可以被显示,决定从那一行开始显示就是你的事了。这个可以通过设置*offset来实现。给 yoffset赋0将显示前400行,赋35将显示第36行到第435行,如此重复。这个功能在许多情形下非常方便实用。它可以用来做双缓冲。双缓冲就是 你的程序分配了可以填充两个屏幕的内存。将offset设为0,将显示前400行(假设是标准的vga),同时可以秘密的在400行到799行构建另一个 屏幕,当构建结束时,将yoffset设为400,新的屏幕将立刻显示出来。现在将开始在第一块内存区中构建下一个屏幕的数据,如此继续。这在动画中十分 有用。

另外一个应用就是用来平滑的滚动整个屏幕。就像在前面屏幕中一样,在内存分配800行的空间。每隔10毫秒设定一个定时器(timer,见man settimer和man
signal / man sigaction),将offset设为1或是比上次更多,瞧,你看到了一个平滑滚动的屏幕。确保你的信号(signal)不要因为最佳输出的原因被信号处理程序阻塞。


bits_per_pixel 设为1,2,4,8,16,24或32来改变颜色深度(color
depth)。不是所有的视频卡和驱动都支持全部颜色深度。当颜色深度改变,驱动将自动改变fb-bitfields。这些指出,在一个特定的颜色基准
上,多少和哪些比特被哪种颜色使用。如果bits-per-pixel小于8,则fb-bitfields将无定义而且颜色映射将启用。

在fb-var-screeninfo结构结尾的定时的设置是当你选择一个新的分辨率的时候用来设定视频定时的。(
EXAMINE AND EXPLAIN TIMINGS! )

fb_fix_screeninfo:记录了帧缓冲设备和指定显示模式的不可修改记录。包含了屏幕缓冲区的物理地址和长度。

struct fb_fix_screeninfo {

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

unsigned long smem_start;   /* Start of frame buffer mem */

/* (physical address) */

__u32 smem_len;         /* Length of frame buffer mem */

__u32 type;             /* see FB_TYPE_*        */

__u32 type_aux;         /* Interleave for interleaved Planes */

__u32 visual;           /* see FB_VISUAL_*      */

__u16 xpanstep;         /* zero if no hardware panning  */

__u16 ypanstep;         /* zero if no hardware panning  */

__u16 ywrapstep;        /* zero if no hardware ywrap    */

__u32 line_length;      /* length of a line in bytes    */

unsigned long mmio_start;   /* Start of Memory Mapped I/O   */

/* (physical address) */

__u32 mmio_len;         /* Length of Memory Mapped I/O  */

__u32 accel;            /* Type of acceleration available */

__u16 reserved[3];      /* Reserved for future compatibility */

};

在这里非常重要的域是smem_len和line-length。smem-len告诉我们framebuffer设备的大小,第二个域告诉我们指针应该前进多少字节去得到下一行的数据。第二个结构则要有意思的多,它给了我们可以改变的信息。

fb_info:linux为帧缓冲设备定义的驱动层接口。

struct fb_info {

char modename[40];                /*设备名称*/

kdev_t node;

int flags;

int open;                         /* 开始标识*/

#define FBINFO_FLAG_MODULE   1   /* Low-level driver is a module */

struct fb_var_screeninfo var;    /* Current var */

struct fb_fix_screeninfo fix;    /* Current fix */

struct fb_monspecs monspecs;     /* Current Monitor specs */

struct fb_cmap cmap;             /* Current cmap */

struct fb_ops fbops;            /* 指向底层操作函数的指针 */

char *screen_base;               /* 虚拟地址 */

struct display *disp;         /* 初始化显示变量 */

struct vc_data *display_fg;       /* 该显示的控制台变量 */

char fontname[40];                /* 显示字体 */

devfs_handle_t devfs_handle;      /* devfs句柄 */

devfs_handle_t devfs_lhandle;

int (*changevar)(int);            /* 告诉控制台发生改变 */

int (*switch_con)(int, struct fb_info*); /* 告诉fb切换控制台 */

int (*updatevar)(int, struct fb_info*);  /* 告诉fb更新vars */

void (*blank)(int, struct fb_info*);  /* tell fb to (un)blank the screen */

/* arg = 0: unblank */

/* arg > 0: VESA level (arg-1) */

void *pseudo_palette; /* Fake palette of 16 colors and the cursor's color for non palette mode */

/* From here on everything is device dependent */

void *par;

};

fb_cmap:调色板信息

struct fb_cmap {

__u32 start;        /* First entry  */

__u32 len;          /* Number of entries */

__u16 *red;         /* Red values   */

__u16 *green;       /* Green values */

__u16 *blue;        /* Blue values  */

__u16 *transp;      /* transparency, can be NULL */

};

之后,该程序定义了关于缓冲帧的一些常用函数,首先介绍操作集如下所示:

操作集

static struct file_operations fb_fops = {

owner:      THIS_MODULE,

read:       fb_read,    //读

write:      fb_write,   //写

ioctl:      fb_ioctl,   //IO控制

mmap:       fb_mmap,    //映射操作

open:       fb_open,    //打开

release:    fb_release, //关闭

#ifdef HAVE_ARCH_FB_UNMAPPED_AREA

get_unmapped_area: get_fb_unmapped_area,

#endif

};

Framebuffer重要结构体说明的更多相关文章

  1. FrameBuffer系列 之 相关结构与结构体

    在linux中,fb设备驱动的源码主要在Fb.h (linux2.6.28\include\linux)和Fbmem.c(linux2.6.28\drivers\video)两个文件中,它们是fb设备 ...

  2. Framebuffer 驱动学习总结(一) ---- 总体架构及关键结构体

    一.Framebuffer 设备驱动总体架构 帧缓冲设备为标准的字符型设备,在Linux中主设备号29,定义在/include/linux/major.h中的FB_MAJOR,次设备号定义帧缓冲的个数 ...

  3. u-boot include目录 gd_t结构体 如何关联芯片指定的目录

    1 u-boot /u-boot-2018.07-fmxx/include/config.h /* Automatically generated - do not edit */#define CO ...

  4. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

  5. C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱

    一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...

  6. go语言结构体

    定义: 是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体. 成员: 每个值称为结构体的成员. 示例: 用结构体的经典案例处理公司的员工信息,每个员工信息包含一个唯一的员工编号.员工的名字. ...

  7. C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

  8. C++_系列自学课程_第_12_课_结构体

    #include <iostream> #include <string> using namespace std; struct CDAccount { double bal ...

  9. java socket传送一个结构体给用C++编写的服务器解析的问题

    另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...

随机推荐

  1. socket编程——sockaddr_in结构体操作

    sockaddr结构体 sockaddr的缺陷: struct sockaddr 是一个通用地址结构,这是为了统一地址结构的表示方法,统一接口函数,使不同的地址结构可以被bind() , connec ...

  2. leetcode 之Longest Consecutive Sequence(六)

    这题要仔细体会下哈希表的用法,要注意的是数组本身是无序的,因此需要向左右进行扩张. 另外这个思路可以进行聚类,把连续的标记为一类. int longestConsecutive(const vecto ...

  3. Linux 基础——常用的Linux网络命令

    一.学Linux网络命令有什么好处 网络的出现,我们的生活更方便了,处理事情的效率也越来越高,也可以看到全世界文化的差异.同时我们接受新事物的信息越来越来强,新事物的信息也越来越来多.网络对于我们尔等 ...

  4. day2 购物商城

    购物商城 商品展示.价格 买,加入购物车 付款,钱不够.(减商品,充值)

  5. Apache配置实现日志按天分割并删除指定几天前的日志

    Apache日志默认情况下是一周切割一次,由于访问量大的时候日志的文件还是比较大的,同时也不利于管理员对日志的分析处理.于是尝试对Apache日志设置按天分割,并通过计划任务执行删除几天的日志. 配置 ...

  6. Python基本语法[二]

    Python基本语法 1.定义变量:  代码正文: x= y= z=x+y 代码讲解: 2.判断语句:  代码正文: score= : print("你真棒") print(&qu ...

  7. 几道坑人的PHP面试题 试试看看你会不会也中招

    这篇文章主要介绍了几道坑人的PHP面试题,试试看看你会不会也中招,这些题目都用了一些障眼法,需要你有一双火眼金睛哦,需要的朋友可以参考下 这几道题是在德问上看到的,感觉挺有意思,拿来给大家分享其中的陷 ...

  8. 湖南大学ACM程序设计新生杯大赛(同步赛)C - Do you like Banana ?

    题目描述 Two endpoints of two line segments on a plane are given to determine whether the two segments a ...

  9. iOS 9音频应用开发基础教程

    iOS 9音频应用开发基础教程(大学霸内部资料)   介绍:iOS 9音频应用开发基础教程(内部资料)是iOS 9音频应用开发专向教程.本书采用Swift 2.0语言开发基于iOS 9的音频应用.实现 ...

  10. Python Socket多线程并发

    1.SocketServer模块编写的TCP服务器端代码 Socketserver原理图 服务端: import SocketServer #导入SocketServer,多线程并发由此类实现 cla ...