资料下载
coding无法使用浏览器打开,必须用git工具下载:
代码语言:javascript复制git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
视频观看
百问网驱动大全
单Buffer的缺点与改进方法
参考资料,GIT仓库里:
- 内核自带的LCD驱动程序
- IMX6ULL驱动源码:
Linux-4.9.88driversvideofbdevmxsfb.c
- STM32MP157的驱动程序是基于GPU的,在Linux-5.4里没有mxsfb.c,可以参考另一个:
Linux-5.4driversvideofbdevgoldfishfb.c
- 在视频里基于IMX6ULL的mxsfb.c来讲解,我们把这个驱动程序也放到GIT仓库里
IMX6ULLsource 3_LCD12_lcd_drv_imx6ull_from_kernel_4.9.88
STM32MP157sourceA7 3_LCD12_lcd_drv_imx6ull_from_kernel_4.9.88
- 使用多buffer的APP参考程序,在GIT仓库中
IMX6ULLsource 3_LCD13_multi_framebuffer_exampletestcamera
STM32MP157sourceA7 3_LCD13_multi_framebuffer_exampletestcamera
- IMX6ULL驱动源码:
1. 单Buffer的缺点
- 如果APP速度很慢,可以看到它在LCD上缓慢绘制图案
- 即使APP速度很高,LCD控制器不断从Framebuffer中读取数据来显示,而APP不断把数据写入Framebuffer
- 假设APP想把LCD显示为整屏幕的蓝色、红色
- 很大几率出现这种情况:
- LCD控制器读取Framebuffer数据,读到一半时,在LCD上显示了半屏幕的蓝色
- 这是APP非常高效地把整个Framebuffer的数据都改为了红色
- LCD控制器继续读取数据,于是LCD上就会显示半屏幕蓝色、半屏幕红色
- 人眼就会感觉到屏幕闪烁、撕裂
2. 使用多Buffer来改进
上述两个缺点的根源是一致的:Framebuffer中的数据还没准备好整帧数据,就被LCD控制器使用了。 使用双buffer甚至多buffer可以解决这个问题:
- 假设有2个Framebuffer:FB0、FB1
- LCD控制器正在读取FB0
- APP写FB1
- 写好FB1后,让LCD控制器切换到FB1
- APP写FB0
- 写好FB0后,让LCD控制器切换到FB0
3. 内核驱动程序、APP互相配合使用多buffer
流程如下: