您的位置:首页 > 运维架构 > Linux

关于Linux4412开发平台上Qt程序的反色问题

2015-02-07 10:28 585 查看
Linux4412开发板颜色问题

最近在做一个基于Linux4412平台的资产管理软件的界面,当我的Qt界面程序在开发板上运行的时候,logo的颜色瞬间改变,而我的Qt界面的颜色也改变了,具体情况是,红色变成了蓝色,蓝色变成了红色,而绿色是正常显示的,找了好久都没有找到解决的方法。

在Linux开发板开机启动的时候,logo显示是正常的,所以Linux上应该是正常的,而我的Qt程序在宿主机上运行是也是正常的,所以也不会是我Qt程序的问题,那么问题出在哪儿呢?

和我的同事讨论后,觉得有可能是Linux开发板上的流lcd驱动的问题,因为在开发板运行我的程序的时候,颜色恰好是相反的,也就说,可能是我的Qt程序中使用RGB顺序和开发板上的RGB顺序是相反的,于是开始查看开发板上的lcd驱动程序,果然发现了问题。

刚开始,我读取了开发板的LCD的显示参数,主要是其中的可变参数fb_var_screeninfo这个结构体,其中有六个变量是与这个问题有关的,在fb_var_screeninfo结构体中有三个结构体成员,是由同一个结构体来定义的,该结构体就是struct fb_bitfield,这个结构体大致如下:

Sturct fb_bitfield

{

_u32offset;//颜色的偏移量

_u32length;//表示颜色的长度

_u32msb_right;//

}

从以上信息可以看到颜色的偏移量和长度,颜色的长度决定了屏幕的颜色深度,二偏移量就决定了颜色的顺序。

在struct fb_var_screeninfo中有如下的变量

Struct fb_var_screeninfo

{

……

Structfb_bitfield red;

Structfb_bitfield green;

Structfb_bitfield blue;

……

}

到这里我们不难看出LCD中是怎么来表示颜色的了吧,当我首次从程序读出以上数据的时候,数据是这样的:

Red.offset = 16

Red.length = 8

Green.offset = 8

Green.legnth = 8

Blue.offset = 0

Blue.length = 8;

可以看出,这样一个顺序是蓝色在前,红色在最后,所以此时颜色的顺序是BGR而不是我们的RGB,所以这就是问题的所在。

那么接下来就来看看怎么矫正:

字开发板的内核文件下找到这样一个文件./drivers/video/lcd.c,这个文件就是lcd驱动源程序,有关LCD显示的参数的设置都在这里面,大约是在521行(不同的内核可能不一样),有这样一顿程序:

……

Case32:

Case24:

bit_per_pixel= 32;

red.offset =16;

red.length =8;

green.offset =8;

green.length =8;

blue.offset =0;

blue.length =8;

……

所以,我们只需要将red和blue的offset值对调,重新编译内核,烧写内核即可。

但是这里还有点问题我不太明白,希望懂得的人帮忙讲解一下

1、 我这屏幕的颜色深度是32位的,但是在以上程序中为什么是24的时候设置?

2、 这样修改之后,我的程序运行起来效果对了,但是logo的颜色却和以前相反了,有没有能够在启动程序的时候往里面写入颜色的偏移量,在程序退出的时候讲其偏移量改回的方法?

本人是新手,废话有点多,对Linux的内核不是很熟悉,这次只是解决问题的心得,希望能够帮到遇到同样问题的朋友,请多指教,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: