Linux FrameBuffer(三)- struct fb_fix_screeninfo 和 struct fb_var_screeninfo 详解
创始人
2024-02-14 13:23:13
0

目录
一、概述
二、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 */
};

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

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

相关内容

热门资讯

你的晚安是我的早安是什么歌曲 你的晚安是我的早安是什么歌曲苏天伦《你的早安是我的晚安》“你的晚安是我的早安”是单小源的歌曲《东京遇...
积极进取的小故事 积极进取的小故事现代的普通人,不要名人的。不能与别人重复,尽快回答   啄木鸟的故事       啄...
熊出没之探险日记3什么时候播出... 熊出没之探险日记3什么时候播出?熊出没之探险日记3,春节前播放。熊出没只是探险日记三2020年5月4...
谁知道所有有关“七”的歌?拜托... 谁知道所有有关“七”的歌?拜托了各位 谢谢就是歌曲名里有“七”这个字的!谢谢七月七迅谈日晴 看我七十...
求一本小说 女主穿越了三次 每... 求一本小说 女主穿越了三次 每次都在福临身边 后来怀孕了孩子被打掉了那个 女主叫什么雯?那个女主就是...
如果记忆不说话,流年也会开出花... 如果记忆不说话,流年也会开出花的基本信息书 名:《如果记忆不弯饥好说话,流年也会开出花》埋铅 作 者...
你好,旧时光漫画版在哪里可以看... 你好,旧时光漫画版在哪里可以看?暂时在绘心上连载
一首英文歌,男的组合唱的,MV... 一首英文歌,男的组合唱的,MV是一个婚礼的过程。求歌名。是不是darin的can'tstoplove...
为什么很多人喜欢用胶片相机? 为什么很多人喜欢用胶片相机?有一种情怀叫做“怀旧“吧,现在数码相机越来越普遍了,已经到了”全民摄影“...
女主先爱上男主,男主却不喜欢女... 女主先爱上男主,男主却不喜欢女主或者是另有所爱,最后女主男主还是在一起的穿越小说。有木有再生缘:我的...
爱情失恋伤感句子 爱情失恋伤感句子越是美好的从前,越幸福的曾经,现在只能带来锥心的疼痛,痛到撕心裂肺,肝肠寸断,终于痛...
24岁穿这个会不会显老 24岁穿这个会不会显老有点显老,这个颜色款式,颜色有点暗,没有活力,属于那种气质佳,长得高雅的女人,...
哈尔的移动城堡英语版 哈尔的移动城堡英语版可以发给我吗度盘~请查收~
秦时明月之万里长城什么时候播 秦时明月之万里长城什么时候播据说是今年暑假开播别急,官网什么的信他你就输了,12年之前底应该会出,杭...
孩子会得抽动症吗? 孩子会得抽动症吗?我天生的气性比较大,有时跟别人斗嘴时候就会手脚哆嗦,麻木,我问一下这是不是抽动症就...
亨德尔一生为音乐献出了怎样的贡... 亨德尔一生为音乐献出了怎样的贡献?亨德尔一生写了歌剧41部,清唱剧21部,以及大量的管乐器与弦乐器的...
礼仪起源和发展的经典故事? 礼仪起源和发展的经典故事?一、礼仪的起源;1、天神生礼仪;2、礼为天地人的统一体;3、礼产生于人的自...
描写桂林山水的句子有哪些? 描写桂林山水的句子有哪些?天下风光数桂林有杨万里的“梅花五岭八桂林,青罗带绕碧玉簪”;有邹应龙的“无...
避免与强敌正面对决的成语 避免与强敌正面对决的成语避免与强敌正面对决的成语避实就虚 【近义】避重就轻、避难就易、声东击西【反义...
多愁善感类的成语 多愁善感类的成语心细如发【解释】:极言小心谨慎,考虑周密。亦作“心细于发”。【出自】:吴梅《题天香石...