用Framebuffer开发LCD的应用过程中,用ioctl获取的bits_per_pixel值为32,与设备树的配置的24不一致,本文分析原因。

1、展示问题

设备树配置如下

 

应用程序如下

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/fb.h>

int main(int argc, char* argv[])
{
    struct fb_var_screeninfo fb_var;
    struct fb_fix_screeninfo fb_fix;
    int fd;
    fd = open("/dev/fb0", O_RDWR);
    ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix);//固定信息
    ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);//可变信息 
    //ioctl(fd, FBIOPUT_VSCREENINFO, &fb_var);

    printf("分辨率:%d x %d\n",     fb_var.xres, fb_var.yres);           
    printf("色深:%d\n",            fb_var.bits_per_pixel);
    printf("每行占用字节:%d\n",     fb_fix.line_length);
    printf("像素格式: R<%d %d> G<%d %d> B<%d %d>\n", 
    fb_var.red.offset, fb_var.red.length,
    fb_var.green.offset, fb_var.green.length,
    fb_var.blue.offset, fb_var.blue.length);

    close(fd);
    exit(0);//正常退出程序
    return 0;
}

打印输出效果

 2、问题分析

        在确认了应用程序和设备树没有出错的情况下,初步认为是驱动导致的。

查找源码

        在Vscode中搜索bits_per_pixel,发现在linux源码的drivers/video/fbdev/mxsfb.c中有用到bits_per_pixel。如下图

图中代码455行,只要设备树中的bits_per_pixel不是32也不是16,就令bits_per_pixel=32。

3、小结:由于我设备树中bits_per_pixel=24,不等于32,也不等于16,所以bits_per_pixel=32。

4、补充

从mxsfb.c的458行开始,是判断RGB为565、888的源码,从中可以得出结果:

  • bits-per-pixelRGB565 值为 <16>RGB888/666 值为 <32>

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值