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

简介: Linux FrameBuffer(三)- struct fb_fix_screeninfo 和 struct 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 */
};

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

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_*
vmode vmode 查看宏 FB_VMODE_*
rotate 顺时针旋转的角度
pixclock 显示一个点需要的时间,单位为ns

四、打印 struct fb_fix_screeninfostruct fb_var_screeninfo

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

#include <stdio.h>
#include <linux/fb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
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;
}

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

目录
相关文章
|
7月前
|
编解码 Ubuntu Linux
Linux应用开发基础知识——Framebuffer 应用编程(四)
Linux应用开发基础知识——Framebuffer 应用编程(四)
134 0
Linux应用开发基础知识——Framebuffer 应用编程(四)
|
7月前
|
Linux Android开发
嵌入式linux中Framebuffer 驱动程序框架分析
嵌入式linux中Framebuffer 驱动程序框架分析
76 0
|
7月前
|
存储 算法 Linux
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
302 0
|
存储 Linux 数据处理
深入解析Linux下的struct tm结构体:时间信息的存储与操作
在Linux系统编程中,`struct tm` 结构体是一个重要的数据结构,用于存储和表示日期和时间信息。它提供了丰富的成员变量,允许开发者访问和操作年、月、日、时、分、秒等时间单位。本文将详细介绍 `struct tm` 结构体的成员变量、使用方法以及如何将时间信息以更易读的方式呈现给用户。
3025 3
|
Linux Android开发 芯片
Linux驱动分析之Framebuffer驱动
前面我们了解了LCD的基本架构《Linux驱动分析之LCD驱动架构》,接下来我们拿个具体的实例来分析分析。这样可以了解其大概是如何使用和工作的。
|
编解码 缓存 Ubuntu
Linux FrameBuffer(一) —— FrameBuffer是什么?怎么用?
Linux FrameBuffer(一) —— FrameBuffer是什么?怎么用?
950 0
Linux FrameBuffer(一) —— FrameBuffer是什么?怎么用?
|
编解码 Ubuntu Linux
linux/鸿蒙开发(基于IMX6ULL)开发 (十三)Framebuffer应用编程
linux/鸿蒙开发(基于IMX6ULL)开发 (十三)Framebuffer应用编程
291 2
linux/鸿蒙开发(基于IMX6ULL)开发 (十三)Framebuffer应用编程
|
编解码 Linux
Linux 应用基础 Framebuffer应用编程
在 Linux应用基础中,Framebuffer 驱动程序主要用来控制 LCD。今天带大家来了解一下如何通过 Framebuffer 来编程 LCD。 在此之前,我们要先了解一下 Framebuffer 和 LCD。
215 0
|
编解码 Linux
Linux下的Framebuffer编程
Linux下的Framebuffer编程
140 0
|
Linux
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析(三)
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析
353 0
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析(三)