全志视频输出基础
1.LCD 的驱动
显示驱动可划分为三个层面:驱动层,框架层及底层。底层与图形硬件相接,主要负责将上层配置的功能参数转换成硬件所需要的参数,并配置到相应寄存器中。
显示框架层对底层进行抽象封装成一个个的功能模块。驱动层对外封装功能接口,通过内核向用户空间提供相应的设备结点及统一的接口。
在驱动层,分为三个驱动,分别是framebuffer
驱动,display
驱动,LCD&HDMI
驱动。framebuffer
驱动与 framebuffer core
对接,实现 linux
标准的framebuffer
接口。display
驱动是是整个显示驱动中的核心驱动模块,所有的接口都由 display
驱动来提供,包括 lcd
的接口。
2.视频输出模块框图
视频输出模块框图如上,由显示引擎(DE)和各类型控制器(tcon)组成。
输入图层(layers)在DE中进行显 示相关处理后,通过一种或多种接口输出到显示设备上显示,以达到将众多应用渲染的图层合成后在显 示器呈现给用户观看的作用。DE 有2 个独立单元(可以简称de0、de1),可以分别接受用户输入的图 层进行合成,输出到不同的显示器,以实现双显。
DE 的每个独立的单元有1-4 个通道(典型地,de0 有 4 个,de1 有2 个),每个通道可以同时处理接受4 个格式相同的图层。
sunxi 平台有视频通道和UI 通道 之分。视频通道功能强大,可以支持YUV 格式和RGB图层。UI 通道只支持RGB 图层。
3.VO组件-显示引擎DE
内核中的DE驱动是在中断处理函数中从指定的地址去读取帧的显示信息(起始地址、显示/特效参数)。
每次DE驱动的中断到来,都去特定的内存去取帧的各种信息,再去配置寄存器。特定的内存中的信息是由软件去填充,也就是由mpi_vo thread 去填充起始地址和显示信息。
为了确保平滑的显示效果,并且避免出现撕裂或其他显示问题,通常会使用双缓冲技术。双缓冲技术意味着同时准备两帧的显示内容,一帧用于当前显示,另一帧用于下一次显示。当一帧显示完成后,可以直接切换到下一帧,而无需等待新的显示内容准备好,从而提高显示效率和流畅度。
为了保证双缓冲正常运行,帧率需要控制在一个合适的范围内,确保每帧之间的时间间隔比屏幕的刷新间隔大。这样可以确保在一帧显示完成后,下一帧已经准备就绪,从而实现连续流畅的显示效果。如果帧率过高,可能会导致显示内容准备不及时,造成撕裂或卡顿;如果帧率过低,可能会导致画面卡顿或闪烁。
通过合理控制帧率和使用双缓冲技术,可以有效地提高显示效果的稳定性和流畅度,确保图像在屏幕上的呈现达到最佳效果。
简而言之:对于显示,需要使用缓存,缓冲两帧。并且需要保证帧率要比屏幕的刷新了要小,帧间隔的时间比刷新间隔大,就可以保证缓存两帧是足够的。