NXP

8.6 子模块分析之CM

2019-07-12 13:51发布

data/attach/1907/ylilv3t0ibvufczagvoh60u195vfq5ny.jpgdata/attach/1907/f8j1ur0s0sqs670472ntfyapkc1zx13b.jpgdata/attach/1907/dplbixpqbvizs9mxxe9h3vt3f0i7xvhc.jpg (一)概述 Control Module(CM) 模块由以下几个部分构成:
CMFrame 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同样控制IDMACbuffer的开关,FSU在每一帧后面检测下一帧是否可用,如果下一帧可用的话,FSU就保持活动状态,继续发送_NEW_FRM_RDY信号,并且更新相应的标志位,如DMA_<#>_CUR_BUFDMA_<#>_BUF_RDY等。如果下一帧不可用,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 channelCPMEM中的word[1]中保存的EBA0EBA1。既然有两个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,需要进行下面的设置: 1SRM中有关子模块的可选寄存器设置 2IDMAC中的可选设置:在对应的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 flowbufferFSU会自动地通过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中。之后当ICFrame0处理完成的话,就会将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 flowsIPU的主flow 上面说了,IPU内部会执行一个main flow,一个alternative flow,这里先分析一下main flow
IPU内部的flows可以被分为5部分: 1CF- capture flows 2PF- processing flows 3SF- synchronous display flows 4AF- Asynchronous display flows 5DF- 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--->MEMCSI0-->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行被使用到。 2Band 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