ITOP4412----基于4.19.99Linux内核的4.3寸显示屏驱动(一)
目录
接上文,在ITOP4412开发板基于Linux4.19内核版本上,移植了4.3寸屏WXCAT43-TG6屏幕驱动,但是驱动的显示效果不正常。
异常表现为上电后打印的log信息、QT写的APP字体的显示异常,(这部分功能是调用系统API的)。使用自己编写的APP对屏幕缓冲区填充色彩却一切正常(这里使用的是内存映射,直接往显存写)。问题应该就出现在这了。为解决这个BUG,决定从FRAMEBUFFER框架开始研究,检查一下驱动哪部分出了问题。
FrameBuffer框架是Linux下的一个图形显示框架,比较经典,当然图形框架不止这一种,在Linux4.19内核中,三星已经使用了另一套DRM框架对图形驱动进行了替换。从我目前了解,DRM框架功能更为丰富,支持一些图形处理的功能例如3D,后面可以尝试使用DRM去适配一个新的驱动。
FrameBuffer简介
在内核代码文档中,
Documentation\fb\framebuffer.txt
描述了FrameBuffer的特点,它既是一个字符设备,也像一个普通的内存设备。这样抽象出来的LCD设备,就是一块内存,要让LCD显示内容,对“内存”读写就可以了。
一个FrameBuffer由一个fb_info结构体来描述,如下图,该结构体位于。
include\linux\fb.h
从图中可以看出fb_info结构体也是由一些结构体组成。
一般情况下,编写FrameBuffer框架下的LCD驱动,只需要在驱动中对三个结构体完成描述即可。
这个三个结构体,分别描述了LCD设备的参数,可变参数,操作函数。
- struct fb_info
- —>struct fb_var_screeninfo;
- —>struct fb_fix_screeninfo;
- —>struct fb_ops;
三个结构体内容:
前两个结构体位于:
include\uapi\linux\fb.h
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