NXP

8.4 子模块分析之IC

2019-07-12 13:51发布

data/attach/1907/kx6zx4iyj1dpecs5divqaps8u13asog9.jpgdata/attach/1907/8r9qr22u9dg90w2y4rges3xf1gam4hp1.jpgdata/attach/1907/qaj3p840ov6i891yshk0ap6z9ne6248k.jpgdata/attach/1907/kgh3psqz536gulvf74vqsz36drv3w3qg.jpgdata/attach/1907/2k832mrx2b6b9t4wa934v1fc4scrs8zi.jpgdata/attach/1907/afmj5twk5yd8yk2yqv2b4b2ifsx5z7zv.jpg 1)概述 IC包含三个处理模块:缩放(downsizing),主处理流程(main processing)和翻转(rotation)。这几个模块是通过外围寄存器控制的,所需的参数是ARM通过AHB总线写到Task Parameter Memory中的。这个Task Parameter Memory在后面介绍。 先来看一个整体图: 这几个模块如下所示: 2Processing tasks 这三个模块中任何一个都可以最多进行三个处理任务,这三个处理任务如下所示: 1Preprocessing task for encoding.(编码预处理) 2Preprocessing task for displaying image from sensor (viewfinder)VF显示处理) 3Postprocessing task.(后加工) 这些任务通过单个硬件来实现,ARM平台会在使能这些任务之前配置好它们。
任务切换对于ARM平台而言是透明的。任务切换到downsizing模块所花的时间单元等于处理一个8pixels 突发(burst)所花的时间;任务切换到main processing模块所花的时间单元等于处理一个图像一行所花的时间;任务切换到rotation模块所花的时间单元等于处理一帧图像所花的时间。
这三个处理任务包含相似的操作控制命令,下图就是这些命令的定义: ARM平台将这些命令写到IC_CONF寄存器中,IC_CONF寄存器如下所示:
ARM平台如果想要修改IC task参数的话,必须先关闭这个task。在关闭task的过程中,IC会继续执行完当前帧,当这一帧处理完后,IPUARM平台发送一个中断信号,通知ARM平台可以改变task的参数,ARM平台修改后使能这个task,并从下一帧开始。
3 Downsizing Section
在这个模块中,有三个内存模块,Input Buffer Memory, Downsizing Temporary Memory, Downsizing Output Memory,同时每个内存模块都有一个控制器,核心是Downsizing Arithmetic Unit模块以及与之对应的Downsizing Control控制器。下面会讲述它们分别有什么作用。
CSI中来的数据会写到Input Buffer Memory中的一个FIFO中,可以通过编程控制,这个FIFO里面的数据能够通过IDMAC发送到系统内存中或者直接发送到Downsizing Unit中。
通过IDMAC发送到系统内存中这种情况,数据是通过ARM平台处理,然后通过Input Buffer Memory中的另一个FIFO来发送到IDMAC中的。
在后加工这个task中,IDMAC将数据从系统内存中传送到第三个FIFO中,然后Downsizing Unit模块来读取这个数据。
这三个FIFO各含有128页,每一页可以保存有2或者4个字大小的突发,对应8或者16pixels。具体突发的大小在对应channelCB#_BURST_SIZE位里面定义的。其中,在这个memory中每一个字的大小是128bits,每个字里面包含相连的颜 {MOD}元素或者16bytes的通用数据(例如Bayer)。这几个FIFO是通过InputBuffer Memory Control来控制的。
Downsizing Unit提供图像像素水平方向和垂直方向上的平均和采样根据下面的公式: IPr,c代表输入像素,HPR,c代表经过水平缩放的像素值,VPR,C代表在水平缩放的基础上再次经过垂直缩放后的像素值。DS_R_HDS_R_V分别代表水平和垂直方向上的缩放比例因子。其中这两个缩放因子是在IC_PRP_ENC_RSC,IC_PRP_VF_RSC IC_PP_RSC寄存器中设置的。这三个寄存器如下所示:
仔细来看这两个公式,倒是不太难理解,例如水平方向的缩放,缩放因子是6的话,就将水平方向上面的6个像素值求和后除以6即可,垂直方向上的缩放相似。最终的计算结果向8取整。
三个缩放任务的每一个所处理的数据是一个8 pixels的突发。通常情况下,当前正在执行的任务会一直执行到FIFO里面的数据清空为止。然后如果FIFO接收到一个新任务突发的情况下,Downsizing Unit就会切换到下一个更高优先级的新任务。
水平方向上的像素平均会首先进行,每个像素的所有颜 {MOD}元素并行处理,之后,会将产生的新数据按行保存到Downsizing Temporary Memory中,之后再进行垂直方向的像素平均。在这个Downsizing Temporary Memory中,会存放三行数据对应这三个任务。这个内存中每一个字的宽度是36 bits
当完成垂直方向上的像素平均以后,数据会输出到Downsizing Output Memory中,在这个内存中每一个字的宽度是48 bits(包含两个输出像素)。对于每一个任务,Downsizing Output Memory内存中一行含有两个bufferDownsizing Unit填充这两个buffer中的前背景部分,Main Processing Unit填充这两个buffer的后背景部分。
4Main Processing Section 对于每一个任务,Main Processing Unit都会按照下面的步骤来处理: 1.将从Downsizing Output Memory里面所读取到数据进行翻转(可选操作,因为是是否翻转是根据对应dma channelCPMEM中的有关VF,HFROT参数来决定的),encoding任务使用IDMAC channel #20viewfinder任务使用IDMAC channel #21postprocessing任务使用IDMAC channel #22。这几个channel在程序中都体现了。 2.将从Downsizing Output Memory中获取到的数据进行水平方向上的大小调整根据下面的公式: RS_C_H代表当前水平方向上的大小调整系数,这个系数的计算结果是向8bits取整的。这个系数的计算公式如下:
RS_R_H代表水平方向上的大小调整比率,这个比率是在IC_PRP_ENC_RSC,IC_PRP_VF_RSC IC_PP_RSC寄存器中设置的,这三个寄存器在上面已经显示过了,在这就不再显示。 经过这一步的计算后,结果保存在Task Parameter Memory中。 3.继续从Task Parameter Memory中取出已经经过水平方向上大小调整的数据,然后进行垂直方向上的大小调整,之后继续保存到Task Parameter Memory中。垂直方向上的大小调整是按照下面的公式: RS_C_V代表当前垂直方向上的大小调整系数,这个系数的计算结果同样是向8 bits取整的。这个系数的计算公式如下:


RS_R_V代表垂直方向上的大小调整比率,这个比率同样是在IC_PRP_ENC_RSC,IC_PRP_VF_RSC IC_PP_RSC寄存器中设置的。
注意,在这个Main Processing Unit中进行的是ReSizing操作,而在Downsizing Section Unit中进行的是DownSizing操作,这两个相似的系数都保存在IC_PRP_ENC_RSC,IC_PRP_VF_RSC IC_PP_RSC这三个寄存器中,仔细看这几个寄存器中的各位的名字,可以区分它们。
4.第一次颜 {MOD}空间转换(CSC)的时候(YUV->RGB或者RGB->YUV)需要使用到转换矩阵CSC1。转换矩阵是可以通过编程控制的,它们保存在Task Parameter Memory中。转换矩阵如下:

当在YUV->RGB情况下时:X0=Y, X1 =U, X2 =V, Z0 =R, Z1=G, Z2 =B 当在RGB->YUV情况下时:X0=R, X1 =G, X2 =B, Z0 =Y, Z1=U, Z2 =V 转换矩阵里面的所有参数都是通过ARM平台写到Task Parameter Memory中去的。 5.将图像整合起来,有三种整合方式: local alpha blending, global alpha blending, use of key color. 相比alpha blending而言,color keying方式具有更高的优先级。 整合模式是可以通过在IC_CONF寄存器的28,19位中选择的: 整合公式如下所示:
IGP代表an input graphics pixel IVP代表an input video pixelα=(A+floor(A/128))/256代表an alpha valueA代表a global or local transparency parameterglobal A写在IC_CMBP_1寄存器中,如下所示: color keying使能并且有一个pixel匹配key color的时候,graphics pixel变得透明。 graphics data是从位于Main Processing Memory里面的FIFO里面读取出来的。这个FIFO包含32页,里面的数据格式为RGB或者RGBA或者YUV4:4:4或者YUVA。这些graphics data是通过IDMAC从系统内存中加载进去的。
以上所有的操作是通过统一的处理单元有序执行的。第一步和第二步不会被其他的任务所打断,其他步骤会被具有更高优先级的任务所打断,Preprocessing任务的优先级比postprocessing任务的优先级高。
这个统一处理单元对于三个颜 {MOD}元素都有对应的三个独立部分,所以这三个颜 {MOD}元素可以并行处理。
处理结果会通过一个输出FIFO一行一行地填充到Main Processing Output Memory中。最终IDMAC会将输出突发传送到系统内存中或者直接通过DMFC到显示器来显示(使用dma channel #21)。这个Main Processing Memory为每个任务准备了三个bufferthe temporary row buffer, the graphics FIFOthe output FIFO.
5Rotation Section
这个翻转模块包含: the Rotation Memory:用来存放一个8×8像素的输入矩形块; an output FIFO:包含四页,并且每页是8 pixels 这个Rotation Memory中字的宽度等于四个相连的像素的宽度--96bits
Rotation Unit重写每一个从输入块到输出块内像素数据的相对位置。对于这三个任务来说,旋转/左右翻转/上下翻转是分开使能的。配置这些翻转参数通过对应dma channel里面的CPMEM里面的VF,HF & ROT这几个参数。 preprocessing task for encoding使用IDMAC channel #45 preprocessing task for viewfinder使用IDMACc hannel #46 postprocessing task使用IDMAC channel #47
这些翻转如下所示: 图中FLR表示:Flipping Left/Right FUD表示:Flipping Up/Down 当完成这些翻转任务的时候,IDMAC将输出FIFO里面的内容返回给系统内存。
6