LINUX LCD 使用rgb888而不是教程的rgb565,实现过程中遇到的问题
主要问题:显示异常
问题查找思路
怀疑是像素深度有问题。打印出可变参数信息,看像素设置以及bit_per_pixel
是否有问题
像素是正常的800*480,但是bit_per_pixel为32位,行字节数为3200
根据正点原子驱动教程中的lcd实验,将设备树文件imx6ull-alientek-emmc.dts
中的&lcdif
节点的display
子节点下的bits-per-pixel
设置为24,表示使用RGB888。但是在绑定文档
/Documentation/devicetree/bindings/fb/mxsfb.txt
中,明确指出RGB888/666应该设置为32。
但是设置的就是24,为什么读取出来的是32。十分的想不通,百度搜了半天也没结果。只能去看源码,文件为mxsfb.c
,通过imx6ull.dtsi
文件下lcdif
节点的compatible属性可找到。
代码分析
在455行mxsfb_check_var
函数中对bits-per-pixel
进行了判断,如果不是16和32,就会设置为32。mxsfb_check_var
函数会在probe函数中1477行mxsfb_dispdrv_init
函数中调用;mxsfb_set_par
函数的第664行计算行字节数line_length
并放入fb_fix_screeninfo
结构体中,mxsfb_set_par
函数会在probe函数中1489行调用,也就是说在调用时bits-per-pixel
已经被设置为32了。
最终原因
教程使用RGB565,定义的显存基地址为static unsigned short *screen_base = NULL;
unsigned short
长度为2个字节,而我们需要32位也就是4个字节,映射后的显存基地址的定义应该更改为unsigned int
总结
虽然开始时问题查找的思路有一点点偏差,但最终原因还是在bit_per_pixel
上。