目录
一、概述
二、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_screeninfo
和 struct fb_var_screeninfo
一、概述
struct fb_fix_screeninfo
和 struct 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_PIXELS
、FB_VISUAL_TRUECOLOR
、FB_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_screeninfo
和 struct 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;
}
如果文章有帮助的话,点个赞让我知道一下 *_^