(一)概述
Control Module(CM) 模块由以下几个部分构成:
CM由Frame Synchronization Unit (FSU),Interrupt Generator (IG),General Configuration Registers (GCR),Clock and Reset Control Unit (CRCU)和Shadow Registers Block (SRM)组成。
(二)各部分介绍
2.1 Frame Synchronization Unit(FSU)
2.1.1 FSU概述
FSU提供IPU内部各个子模块所进行的任务处理之间的同步,IPU就可以自动处理一些复杂的任务而不需要ARM平台提供同步。FSU支持外部内存设备上存储图像的双buffer模式,并且允许IPU处理流程自动链接起来。
2.1.2 Frame Synchronization Flow
1)初始化
ARM平台必须在使能一个任务之前对这个任务进行初始化,通过配置GCR中的寄存器和IPU内部各个子模块的参数内存来完成初始化。
2)使能
当完成初始化以后,ARM平台通过向对应寄存器中的使能位写值来使能这个任务。
3)触发
当任务使能以后,FSU等待触发信号的到来。触发信号是一系列信号的综合,包括使能信号,缓冲区准备好的信号(DMA_CH_BUF<0/1>_RDY_<#>),和执行任务中的产生的信号如满页信号(IDMAC_EOF_#)等等。
当触发产生后,FSU会调用对应的处理函数来操作。
4)操作
触发步骤导致任务进入活动状态,这就是所谓的操作步骤。在这一步中,FSU监听来自ARM平台,IDMAC和对应的处理单元所发出的同步信号,然后控制这些单元的操作。FSU同样控制IDMAC中buffer的开关,FSU在每一帧后面检测下一帧是否可用,如果下一帧可用的话,FSU就保持活动状态,继续发送
5)关闭
当ARM平台关闭一个任务的时候(通过将对应的使能位清零),FSU进入关闭状态。
2.1.3 FSU's fundamentals (FSU基础)
Trigger source select(触发源选择器)
一个flow被触发器所触发,这个触发器可能是通过ARM平台手工指定的,也可能是当前处理任务完成的结果。触发源选择器选择触发的来源,触发意味着数据可以被子模块所进行处理。触发源选择器是在对应的模块或任务的SRC_SEL位指定的。
Trigger destination select (触发目的地选择器)
一个模块或者任务需要确保下一个模块或者任务已经做好接收数据的准备,用户需要指定数据的目的地是哪里。这一项工作是通过设置模块或者任务中对应的DEST_SEL位来实现的。
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_#位。
Alternative flow(可选的flow)
有些IPU内部的子模块可以处理两个flow---一个作为main flow,另一个就为alternative flow。为了使这些模块支持alternative flow,需要进行下面的设置:
1)SRM中有关子模块的可选寄存器设置
2)IDMAC中的可选设置:在对应的CPMEM中的separate alpha设置
3)可选的SRC_SEL位
4)可选的FSU设置(CUR_BUF,BUF_RDY, DB_MODE_SEL)
FSU控制alternative flow的开关,它负责更新alternative flow的配置,然后发送合适的信号到IPU的各个子模块中。
当处理完一帧的时候,将会有两个buffer处于准备好状态,其中一个是当前flow的下一个buffer,另一个就是alternate flow的buffer,FSU会自动地通过round-robin优先级选择器选择一个buffer进行处理。
IPU task chaining - Single flow(单flow模式)
下面的图示中说明了单flow模式下的task chaining(任务链)。
单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中取数据发送到显示设备上面。各个处理子模块就会这样一帧一帧地对数据进行处理。
IPU task chaining - double flow(双flow模式)
下面的图示中说明了双flow模式下的task chaining(任务链)。
看这个图,这个图是基于上一个单flow模式下的。另一个flow被显示子模块所控制,即DC需要控制两个flows,当Frame0被发送到显示器上后,FSU将要决定下一步处理Frame1还是Frame0_ALT。这个决定需要根据其他buffer的就绪情况来觉得,如果两个buffers(main flow and alternate)都准备好的话,FSU就根据round-robin优先级选择器来选择。
2.1.4 IPU main flows(IPU的主flow)
上面说了,IPU内部会执行一个main flow,一个alternative flow,这里先分析一下main flow。
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)。如下图所示:
这些flows可以按照上图中的箭头来组合成task flows chaining。对于每个flow,代表数据从摄像头采集到显示(或者保存在内存中)的过程中的一个分步骤,每个flow都对应一个或几个channel,而每个channel的数据流通过程中,是通过DMA传输的,所以每个channel里面又包含一个或几个dma_channel。在这不太好理解,看看手册中的介绍(capture flow):
其中上面和程序中所说的channel对应图中的Tasks chain,对于这个channel的理解需要根据ipu内部架构图来理解,如下所示:
以上面CSI0-->SMFC-->MEM这个channel为例,它代表数据从CSI经过SMFC到达内存MEM中,因为数据是从CSI中获得的,所以physical DMA channel中的video input为空,而数据从这个channel输出的话,就需要通过DMA channel了,从图上可以看出来,physical DMA channel中的video output可以为IDMAC_CH_0~ IDMAC_CH_3。
同样对于capture flow,还可以通过CSI0-->SMFC--->MEM和CSI0-->VDIC-->MEM这两种方式将摄像头采集到的数据存放到内存中。
再来看手册中的Processingflows
以MEM-->IC-->MEM这个channel为例,根据IPU内部框架图可以看到,从内存中取出数据,经过IC处理以后再放入内存中,那么取出数据的时候,就使用到DMA channel了,从这个图中可以看出来,使用的是IDMAC_CH12,再次放入内存中的时候就使用到IDMAC_CH20。
下面再看看synchronous display flows,下面的就不分析了,参照上面的讲解就可以分析出来,同样,下面的图也只是截取一部分作为示例,具体完整的图查看芯片手册。
asynchronous display flows
还有几个flow,就不一一列举了。
2.1.5 Sub-Frame Double-Buffering (Band Mode)
双buffer模式使用的是整个帧作为缓冲区,当一个缓冲区填充满以后才会触发满页中断(EOF),然后切换到下一个缓冲区进行数据填充。IPU同样支持更小的缓冲区,每一个缓冲区都包含4/8/16/32/64/128/256行像素值,这种情况就可以使用系统内部内存来缓冲数据。
这种模式就称为Band Mode(个人理解,这个band的意思就是一个buffer的一部分),如果想使用这种情况的话,需要做以下修改:
1)系统内存的地址是通过同样的公式来进行计算的,但是需要插入想要使用的行的数目k,只有2^k行被使用到。
2)Band Mode情况下,当数据填充满对应的2^k行后,就会触发中断,而不是一页满后才触发中断。
3)每一个channel是否工作在这个Band Mode模式下,是通过对应的IDMAC_BNDM_EN_位来指定的。而且相应的dma channel中的BNDM参数同样需要设置。
2.1.6 Automatic Window Refresh
通过设置flow相应的<>_SRC_SEL位进入自动刷新模式,那么智能显示设备就可以启动自动刷新模式。刷新周期在AUTOREF_PER中定义。
真正的刷新周期的计算公式是:
THSP* 217 * (AUTO_REF_PER+1).
2.1.7 IPU VDOA synchronization
IPU能够和一个友邻互相影响,这个友邻就是VDOA(VideoData OrderAdapter),VDOA的作用就是将VPU所使用的"tiled"的视频数据转换成IPU所使用的普通的数据格式。VDOA可以通过系统内部内存来将数据传送给IPU,所以使用的应该就是上面讲过的Band Mode模式。
双buffer模式下的同步操作不需要MCU的参与,使用VDOA和IPU之间的专属信号,同时,在 IPU内部的两个dma channel之间使用相同的传输协议。
VDOA通知IPU将要去读取的band,然后,IPU通知VDOA什么时候去读。这种同步使用的是IPU内部的VDI和IC(pp)模块,VDOA的目的地在VDOA_DEST_SEL中指定,同样的,也需要指定VDI和IC(pp)模块的源数据来源是VDOA,是通过PP_SRC_SEL和VDI_SRC_SEL来指定的。
IPU和VDOA的设置需要一致,通常来说:
1)由于使用的是Band Mode,所以一个band的宽度大小在IPU和VDOA中的定义必须一致。
2)VDI中通过VDI_MOT_SEL设置的所使用frame的数量需要与VDOA中的设置一致。
2.2 Interrupt Generator
IG能够向ARM平台产生两种类型的中断---功能性中断和错误中断。
简单截个图如下所示:
对于这些中断,在IPU中对应的是IPUx_INT_CTRL_1~IPUx_INT_CTRL_15寄存器。具体就不分析了。
2.3 SDMA event generator
IPU能够产生一个SDMA事件信号,这个信号能够被SoC上的SDMA做为一个触发所使用。IPU内部将一个事件与一个SDMA信号连接起来。这个内部事件通过设置IPUx_SDMA_EVENT_1~IPUx_SDMA_EVENT_14寄存器中相应的位来使能对应的SDMA信号。
用户允许同时使用多个事件,当这些事件中的一个出现的时候,ipu_sdma_event信号就被产生了。与中断信号类似,通过向INT_STAT_#寄存器中对应的位写1就能够清除信号。
不推荐使用同一个事件来同时触发ipu_sdma_event信号和中断信号。
2.4 General Configuration Registers
GCR包含一系列的控制/状态/数据寄存器,它是IPU提供给AHB总线上的子设备的接口。每个寄存器的细节问题在Programmable Registers section这一章中。
2.5 Shadow Registers Module (SRM)
IPU支持帧级的任务切换,即子模块可以本次处理一种配置的帧,同时,下次处理的帧可以是另一种配置。配置之间的切换通过更新子模块的参数来完成。
为了使自动处理视频流在每一帧的边界处不需要更新所有的参数,每一个子模块中具有shadowing capabilities的寄存器都在Shadow Register Memory中保存着一个文件。
(我的理解就是,更新配置的话,并不需要将所有的寄存器配置都更新,哪些寄存器不需要更新,都在Shadow Register Memory的文件中做了记载,这样的话,当子模块处理不同配置的帧时,就不用更新这些寄存器的配置了。)
子模块支持以下这几个功能:
2.5.1 Switching between 2 flows (两个流之间的切换)
当FSU发出请求后,SRM切换寄存器的配置与Shadow Register Memory保存的内容。这在同一个子模块支持两个flows的情况下很常见。
1)当前flow(第一个)的配置保存在子模块的寄存器中;
2)另一个flow(第二个)的配置保存在SRM中;
3)当进行两个flow之间的切换时,将当前flow(第一个)的配置保存到SRM中,另一个flow(第二个)的配置写到子模块的寄存器中。当再次进行flow之间的切换时,再次执行一次这样的操作。
这个过程完全是由FSU控制的。
2.5.2 Updating parameters between frames (更新帧之间的配置)
这种模式是在用户需要更新当前flow中帧的配置的情况下使用,更新后的配置从下一帧开始生效。
1)当前帧的配置保存在子模块的寄存器中;
2)下一帧的配置保存在SRM中;
3)在一帧结束的时候,SRM读取下一帧的配置,然后将这些配置写到子模块的寄存器中,而子模块寄存器中原来的配置就丢失了。
2.5.3 Updating the memory
为了避免数据的粘着性问题,用户应该设置一个标志位表明他正在更新一个子模块保存在Shadow Register Memory中的配置。当这个标志位被设置的话,SRM就不会去更新这个子模块相关的配置。当用户完成更新的时候,同样需要清除这个标志位,然后这些配置参数也就可以被使用了。
这个标志位就是对应子模块的SRM_MODE位,这一位控制子模块的SRM逻辑:
1)00--- ARM平台允许控制子模块在内存中的区域,自动切换机制是关闭的;
2)01--- SRM被FSU所控制,这些配置将在下一帧的时候更新;
3)10--- SRM被FSU所控制,寄存器的配置在帧和帧直接切换;
4)11--- 现在更新,SRM被ARM平台所控制。
各个子模块根据自身的行为来使用SRM机制,下图表示了SRM对各个子模块的支持:
当用户需要更新参数的时候,首先需要监听相应子模块的SRM_BUSY位,当SRM_BUSY位不忙的时候,用户应到首先将SRM_MODE位设置成00,然后去更新Shadow Register Memory中的寄存器文件,当修改完后,再将SRM_MODE位设置成需要的模式。
2.5.4 SRM priority (SRM优先级)
SRM根据预定义的优先级来更新寄存器,优先级在对应子模块的SRM_PRI位中设置,用户必须为每一个子模块指定一个唯一的优先级。
2.5.5 SRM entries mapping
下面的图标显示了将IPU中寄存器的地址映射为SRM中的地址,在图表中SRM entry列为NONE代表相应的寄存器没有SRM 入口。PG列表示该寄存器是否在gating模式下保存,LPSR列表示寄存器是否在low power screen refresh模式下进行切换。
2.6 Memory Access Unit
Memory Access Unit (MA)支持ARM平台去访问IPU内部的内存。下面的表中显示了允许访问的内存和限制。
2.7 SISG - Still Image Synchronization Generator
IPU包含一个"Still Image Synchronization Generator" (SISG),能够产生时间敏感性的同步信号。
SISG通过一个时钟基计数器和六个时间比较单元来执行,如下图所示:
SISG的输入信号是:
1)一个激活的触发
2)VSYNC信号:从摄像头过来的一帧的边界同步信号
SISG会被以下几种情况激活:
1)ARM平台:需要设置的MCU_ACTV_TRIG位;
2)通过MIPI/CSI-2接口接收到的合适的短包所产生的信号;
3)一个外部的信号(GPIO)引脚
当SISG被激活的时候,重置计数器,然后会发生如下两种情况之一:
1)立即开始计数;
2)延迟计数直到以下7个VSYNC信号中的一个到来。
在计数期间,SISG能够产生6路输出:
1)每一路输出都能够被单独使能或关闭,并且有一个可以编程的优先级;
2)每一路输出是指定的计数值,通过配置SISG_SET和SISG_CLR寄存器的值;
3)时钟有25位,在一个时钟周期里面最多能够产生两个12M的像素时钟。
SISG能够重复执行上面的流程最多32个循环().