• Linux FrameBuffer(三)- struct fb_fix_screeninfo 和 struct fb_var_screeninfo 详解


    目录
    一、概述
    二、struct fb_fix_screeninfo详解
    2.1 struct fb_fix_screeninfo定义
    2.2 struct fb_fix_screeninfo字段说明:
    三、struct fb_var_screeninfo详解
    3.1 struct fb_var_screeninfo定义:
    3.2 struct fb_var_screeninfo字段说明:
    四、打印 struct fb_fix_screeninfostruct fb_var_screeninfo


    一、概述

    struct fb_fix_screeninfostruct fb_var_screeninfo 都定义在系统的/usr/include/linux/fb.h文件内。下面分别结构体定义、结构体字段说明两部分来详细解释这两个结构体。


    二、struct fb_fix_screeninfo详解

    struct fb_fix_screeninfo主要用于获取FrameBuffer的固定信息,这些信息无法在应用层被更改,只能通过ioctl函数使用FBIOGET_FSCREENINFO去获取。

    2.1 struct 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;			/* Indicate to driver which*//*specific chip/card we have	*/
    	__u16 capabilities;		/* see FB_CAP_*					*/
    	__u16 reserved[2];		/* Reserved for future compatibility */
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.2 struct fb_fix_screeninfo字段说明:

    表格中提到的宏如FB_TYPE_PACKED_PIXELSFB_VISUAL_TRUECOLORFB_ACCEL_NONE请查看 /usr/include/linux/fb.h 的相关定义。

    字段名称描述附加说明
    id设备驱动名称
    smem_start显存起始物理地址
    smem_len显存大小
    type显卡类型一般为 FB_TYPE_PACKED_PIXELS(值为0,表示像素值紧密排 列),查看fb.h的 FB_TYPE_*
    type_aux附加类型查看fb.h的 FB_AUX_TEXT_MDA
    visual色彩模式一般为 FB_VISUAL_TRUECOLOR(值为2,真彩色)
    xpanstep 支持水平方向上的 PAN 显示:
    0:不支持
    非 0:支持,此时该值用于表示在水平方向上每步进的像素值
    默认为 1
    ypanstep 支持垂直方向上的 PAN 显示:
    0:不支持。
    非 0:支持,此时该值用于表示在垂直方向上每步进的像素值。
    默认为 1
    ywrapstep该方式类似于 ypanstep,不同之处在于:当其显示到底部时,能回到显存的开始处进行显示。默认为 0
    line_length每行字节数
    mmio_start显存映射 I/O 首地址默认为不支持
    mmio_len显存映射 I/O 长度默认为不支持
    accel显示所支持的硬件加速设备默认为 FB_ACCEL_NONE

    三、struct fb_var_screeninfo详解

    struct fb_var_screeninfo主要用于获取和设置FrameBuffer的可变屏幕信息,包括分辨率、像素位深、像素格式等。这些信息可以通过ioctl函数使用FBIOGET_VSCREENINFO获取,也可以通过FBIOPUT_VSCREENINFO修改。

    3.1 struct fb_var_screeninfo定义:

    struct fb_var_screeninfo {
    	__u32 xres;				/* visible resolution		*/
    	__u32 yres;
    	__u32 xres_virtual;		/* virtual resolution		*/
    	__u32 yres_virtual;
    	__u32 xoffset;			/* offset from virtual to visible */
    	__u32 yoffset;			/* resolution			*/
    
    	__u32 bits_per_pixel;	/* guess what			*/
    	__u32 grayscale;		/* 0 = color, 1 = grayscale,*//* >1 = FOURCC*/
    	
    	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 	*/
    
    	/* 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 rotate;			/* angle we rotate counter clockwise */
    	__u32 reserved[5];		/* Reserved for future compatibility */
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    3.2 struct fb_var_screeninfo字段说明:

    表格中提到的宏和结构体请查看 /usr/include/linux/fb.h 的相关定义。

    字段名称描述其他
    xres可见屏幕宽度(每行像素数)分辨率
    yres可见屏幕高度(每列像素数)分辨率
    xres_virtual虚拟屏幕宽度(显存中图像宽度)每行像素数,一般会设置其与xres相等
    yres_virtual虚拟屏幕高度(显存中图像高度),每像素数每列像素数,一般会设置其与yres相等虚拟屏幕
    xoffset虚拟到可见(实际)之间的行方向偏移
    yoffset虚拟到可见(实际)之间的列方向偏移
    bits_per_pixel每个像素有多少bit这个值除以8,表示每个像素的字节数
    grayscale灰度级默认为 0
    red、green、blue、transp颜色分量中红色、绿色、蓝色、透明度的位域信息struct fb_bitfield{
    __u32 offset;//颜色分量起始比特位
    __u32 length;//颜色分量所占比特长度。
    __u32 msb_right;//右边的比特是否为最高有效位
    nonstd是否为标准像素格式
    activate设置生效的时刻默认为 FB_ACTIVATE_NOW
    height、width屏幕高、宽,单位为 mm默认为不支持(-1)
    accel_flags加速标志默认不支持,查看fb_info.flags
    pixclock显示一个点需要的时间,单位为ns
    left_margin、right_margin、hsync_len分别是左消隐信号、右消隐信号、水平同步时长,这三个值之和等于水平回扫时间,单位为点时钟
    upper_margin、lower_margin、vsync_len分别是上消隐信号、下消隐信号、垂直同步时长,这三个值之和等于垂直回扫时间,单位为点时钟
    sync同步信号方式查看宏 FB_SYNC_*
    vmodevmode查看宏 FB_VMODE_*
    rotate顺时针旋转的角度
    pixclock显示一个点需要的时间,单位为ns

    四、打印 struct fb_fix_screeninfostruct fb_var_screeninfo

    复制下面代码保存为printFbInfo.c,编译后,在ubuntu系统上,加上sudo执行,就可以看到FrameBuffer的固定信息和可变信息了,再结合上面的说明,可以更好地理解这两个结构体。

    #include 
    #include 
    
    #include 
    #include 
    #include 
    
    void print_finfo(struct fb_fix_screeninfo *finfo)
    {
        fprintf(stderr,"Printing fb_fix_screeninfo:\n");
        fprintf(stderr,"smem_start=%p,smem_len=%d\n",(char *)finfo->smem_start,finfo->smem_len);
        fprintf(stderr,"type = %d\n", finfo->type);
        fprintf(stderr,"type_aux = %d\n", finfo->type_aux);
        fprintf(stderr,"visual = %d\n", finfo->visual);
        fprintf(stderr,"xpanstep = %d, ypanstep = %d\n", finfo->xpanstep,finfo->ypanstep);
        fprintf(stderr,"ywrapstep = %d\n", finfo->ywrapstep);
        fprintf(stderr,"line_length = %d\n", finfo->line_length);
        fprintf(stderr,"mmio_start=%p, mmio_len=%d\n",(char *)finfo->mmio_start,finfo->mmio_len);
        fprintf(stderr,"accel = %d\n\n", finfo->accel);
    }
    void print_vinfo(struct fb_var_screeninfo *vinfo)
    {
        fprintf(stderr, "Printing vinfo:\n");
        fprintf(stderr, "xres:%d, yres:%d\n", vinfo->xres,vinfo->yres);
        fprintf(stderr, "xres_virtual:%d, yres_virtual:%d\n", vinfo->xres_virtual,vinfo->yres_virtual);
        fprintf(stderr, "xoffset:%d, yoffset:%d\n", vinfo->xoffset,vinfo->yoffset);
        fprintf(stderr, "bits_per_pixel: %d\n", vinfo->bits_per_pixel);
        fprintf(stderr, "grayscale: %d\n", vinfo->grayscale);
    	fprintf(stderr, "red: %d/%d\n", vinfo->red.length, vinfo->red.offset);
        fprintf(stderr, "green: %d/%d\n", vinfo->green.length, vinfo->green.offset);
        fprintf(stderr, "blue: %d/%d\n", vinfo->blue.length, vinfo->blue.offset);
        fprintf(stderr, "transp: %d/%d\n", vinfo->transp.length, vinfo->transp.offset);
        fprintf(stderr, "nonstd: %d\n", vinfo->nonstd);
        fprintf(stderr, "activate: %d\n", vinfo->activate);
        fprintf(stderr, "height: %d\n", vinfo->height);
        fprintf(stderr, "width: %d\n", vinfo->width);
        fprintf(stderr, "accel_flags: %d\n", vinfo->accel_flags);
        fprintf(stderr, "pixclock: %d\n", vinfo->pixclock);
        fprintf(stderr, "left_margin: %d\n", vinfo->left_margin);
        fprintf(stderr, "right_margin: %d\n", vinfo->right_margin);
        fprintf(stderr, "upper_margin: %d\n", vinfo->upper_margin);
        fprintf(stderr, "lower_margin: %d\n", vinfo->lower_margin);
        fprintf(stderr, "hsync_len: %d\n", vinfo->hsync_len);
        fprintf(stderr, "vsync_len: %d\n", vinfo->vsync_len);
        fprintf(stderr, "sync: %d\n", vinfo->sync);
        fprintf(stderr, "vmode: %d\n", vinfo->vmode);
    	fprintf(stderr, "rotate: %d\n\n", vinfo->rotate);
    }
    
    int main(int argc, char *argv[])
    {
    	// 1.打开设备
    	char fbPath[64] = "/dev/fb0";
    	int framebuf_fd = open(fbPath, O_RDWR);
    	if ( framebuf_fd < 0 ) {
            printf("[%s:%d] open %s error \n", __FILE__,__LINE__,fbPath);
            return -1;
        }
    	
    	// 2.获取设备固定参数
    	struct fb_fix_screeninfo finfo;
    	if (ioctl(framebuf_fd, FBIOGET_FSCREENINFO, &finfo) < 0)
        {
            fprintf(stderr, "ioctl FBIOGET_FSCREENINFO err \r\n");
            return -1;
        }
    	print_finfo(&finfo);
    
    	// 3.1 获取虚拟参数
    	struct fb_var_screeninfo vinfo;
        if (ioctl(framebuf_fd, FBIOGET_VSCREENINFO, &vinfo) < 0)
        {
            fprintf(stderr, "ioctl FBIOGET_VSCREENINFO err \r\n");
            return -1;
        }
    	print_vinfo(&vinfo);
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    如果文章有帮助的话,点个赞让我知道一下 *_^

  • 相关阅读:
    AMD EPYC(霄龙)Genoa服务器 | 综合评测
    ESP32-C3入门教程 IoT篇⑤——阿里云 物联网平台 EspAliYun RGB LED 实战之批量生产的解决方案
    C++的string容器->基本概念、构造函数、赋值操作、字符串拼接、查找和替换、字符串比较、字符存取、插入和删除、子串
    盘点 MySQL 创建内部临时表的所有场景
    面试心经
    ThreadLocal与Synchronized的区别
    程序里对象很深很大,可以用这个设计模式缓解一下
    HDFS的Arichive机制【博学谷学习记录】
    Centos系统初始化脚本
    C++算法包学习
  • 原文地址:https://blog.csdn.net/wkd_007/article/details/128025259