显示屏驱动
Posted 四季帆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了显示屏驱动相关的知识,希望对你有一定的参考价值。
0. 前言
每款SOC 都会集成图像处理相关的模块以减轻SOC 处理图像的压力,增强图像处理的速度和效果,Imx6dl 这款SOC 的图像处理模块是IPU。
1. 概述
IPU是应用处理器中视频和图形子系统的一部分,IPU的目标是为从图像传感器和/或到显示设备的数据流提供全面支持,说得直白点,即IPU是IMX6 的图像处理模块。
使用IPU的重要优势:尽量减少ARM平台对图像管理的参与。特别是,可以完全自主地执行显示刷新/更新和摄像机预览(显示来自图像传感器的输入),释放了ARM平台来执行其他task,并降低了功耗(当ARM核心空闲时,可以下电)。
从IMX数据手册的书签页来看,IPU模块总共有IDMAC、CSI、SMFC、IC、VDIC、CM等几个重要的子模块。
从IPU模块的架构图可知,ARM平台和IPU之间的关系点就是CM(Control Module)子模块,其余的子模块皆是IPU模块内部的自动动作,只需要对这些子模块进行配置即可。ARM平台想要设置、获取、显示摄像头数据只能通过CM子模块,所以CM子模块是接下来的分析重点。
CM由Frame Synchronization Unit (FSU),Interrupt Generator (IG),General Configuration Registers (GCR),Clock and Reset Control Unit (CRCU)和Shadow Registers Block (SRM)组成。
我挑了两个最重要且易懂的部分(FSU和IPU main flows)进行翻译和介绍。
2. FSU
FSU(Frame Synchronization Unit)即帧同步单元,FSU提供IPU内部各个子模块所进行的task 处理之间的同步,IPU就可以自动处理一些复杂的task 而不需要ARM平台提供同步。
2.1 Frame Synchronization Flow
1)初始化
ARM平台必须在使能一个task 之前对这个任务进行初始化,通过配置GCR中的寄存器和IPU内部各个子模块的参数内存来完成初始化。
2)使能
当完成初始化以后,ARM平台通过向对应寄存器中的使能位写值来使能这个task。
3)触发
当task 使能以后,FSU等待触发信号的到来,当触发产生后,FSU会调用对应的处理函数来操作。
4)操作
触发步骤导致task 进入活动状态,在这一步中,FSU监听来自ARM平台,IDMAC和对应的处理单元所发出的同步信号,然后控制这些单元的操作。FSU同样控制IDMAC中buffer的开关,FSU在每一帧后面检测下一帧是否可用,如果下一帧可用的话,FSU就保持活动状态,继续发送<TASK>_NEW_FRM_RDY信号,并且更新相应的标志位,如DMA<BL>_<#>_CUR_BUF和DMA<BL>_<#>_BUF_RDY等。如果下一帧不可用,FSU进入暂停模式,暂停当前任务,直到下一个可用的帧的到来。
5)关闭
当ARM平台关闭一个task 的时候(通过将对应的使能位清零),FSU进入关闭状态。
2.2 FSU's fundamentals
1) trigger source select(触发源选择器)
一个flow被触发器所触发,这个触发器可能是通过ARM平台手工指定的,也可能是当前处理任务完成的结果。触发源选择器选择触发的来源,触发意味着数据可以被子模块所进行处理。触发源选择器是在对应的模块或任务的SRC_SEL位指定的。
2) Trigger destination select (触发目的地选择器)
一个模块或者任务需要确保下一个模块或者任务已经做好接收数据的准备,用户需要指定数据的目的地是哪里。这一项工作是通过设置模块或者任务中对应的DEST_SEL位来实现的。
3) Double buffering (双缓冲区模式)
IPU支持系统内存中的双缓冲区模式。当一个flow一帧一帧地处理数据的时候,会从内存中存储BUF0的地址的地方读取地址,下一帧就会去内存中存储BUF1的地址的地方读取地址。而这两个位置就是对应的IDMAC channel的CPMEM中的word[1]中保存的EBA0和EBA1。既然有两个buffer,那么IDMAC怎么就知道使用的是哪一个buffer了?是根据DMA_CH_CUR_BUF_#位中指定的。FSU自动地将DMA_CH_CUR_BUF_#位指向当前正在使用的buffer。同样,如果使用双buffer模式的话,需要设置对应的DMA_CH_DB_MODE_SEL_#位。
4) Alternative flow(可选的flow)
有些IPU内部的子模块可以处理两个flow---一个作为main flow,另一个就为alternative flow。
FSU控制alternative flow的开关,它负责更新alternative flow的配置,然后发送合适的信号到IPU的各个子模块中。
当处理完一帧的时候,将会有两个buffer处于准备好状态,其中一个是当前flow的下一个buffer,另一个就是alternate flow的buffer,FSU会自动地通过round-robin优先级选择器选择一个buffer进行处理。
5) IPU task chaining - Single flow
单flow模式就是不包括上面提到的alternative flow,只有一个main flow,双flow模式肯定就是包括一个main flow,还包括一个alternative flow。
帧中的数据是从同一个子摄像头模块中来的,同时,是一帧一帧进行处理的。采集到的第一帧数据(Frame0)会通过SMFC保存到"INPUT BUFFER"中的BUF0中,当BUF0采集完成的话,下一步处理的子模块(如IC)就被触发,然后就会从"INPUT BUFFER"的BUF0读取数据。同时呢,从摄像头模块中来的下一帧数据(Frame1)就会填充到"INPUT BUFFER"的BUF1中。之后当IC对Frame0处理完成的话,就会将Frame0保存到"OUTPUT BUFFER"的BUF0中,之后显示子模块(如DP/DC)就会被触发,从"OUTPUT BUFFER"的BUF0中取数据发送到显示设备上面。各个处理子模块就会这样一帧一帧地对数据进行处理。
6) IPU task chaining - double flow
下面的图示中说明了双flow模式下的task chaining(任务链)
看这个图,这个图是基于上一个单flow模式下的。另一个flow被显示子模块所控制,即DC需要控制两个flows,当Frame0被发送到显示器上后,FSU将要决定下一步处理Frame1还是Frame0_ALT。这个决定需要根据其他buffer的就绪情况来觉得,如果两个buffers(main flow and alternate)都准备好的话,FSU就根据round-robin优先级选择器来选择。
3. IPU main flows
IPU内部的flows可以被分为5部分:
1)CF- capture flows
2)PF- processing flows
3)SF- synchronous display flows
4)AF- Asynchronous display flows
5)DF- Direct flow from IC to the display
其中每一部分可以看作是一个任务(task),而这些task可以被串成任务链(tasks chain)。如下图所示:
4. 总结
总结一下,就是有两个重点:
一、IPU 支持Single flow和double flow两种模式,single模式下只显示摄像头图像一个窗口,double模式下可以将摄像头图像的窗口和显示子系统中的一个图像窗口进行叠加显示,这样做的好处是两个窗口的内容各自独立,当需要更新其中一个窗口时,另外一个窗口的数据可以不动,提高显示效率。
这种窗口叠加显示的功能在应用级SOC中是很常见的,比如S5pv210 这款三星的SOC 就支持4个窗口的叠加显示,这种技术的广泛应用可以减轻图像刷新的压力,比如屏幕下方的流动广告需要刷新时,只需要刷新流动广告对应窗口的framebuffer就可以了,不用更新整个屏幕上所有的画面。
二、IPU的图像处理过程由多个task 任务组成,即task 任务链。
以上是关于显示屏驱动的主要内容,如果未能解决你的问题,请参考以下文章