正点原子 LINUX应用编程指南 第19章 FrameBuffer

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上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值