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在后面介绍。
先来看一个整体图:
这几个模块如下所示:
(2)Processing
tasks
这三个模块中任何一个都可以最多进行三个处理任务,这三个处理任务如下所示:
1)Preprocessing
task for encoding.(编码预处理)
2)Preprocessing
task for displaying image from sensor (viewfinder)(VF显示处理)
3)Postprocessing
task.(后加工)
这些任务通过单个硬件来实现,ARM平台会在使能这些任务之前配置好它们。
任务切换对于ARM平台而言是透明的。任务切换到downsizing模块所花的时间单元等于处理一个8pixels
突发(burst)所花的时间;任务切换到main
processing模块所花的时间单元等于处理一个图像一行所花的时间;任务切换到rotation模块所花的时间单元等于处理一帧图像所花的时间。
这三个处理任务包含相似的操作控制命令,下图就是这些命令的定义:
ARM平台将这些命令写到IC_CONF寄存器中,IC_CONF寄存器如下所示:
ARM平台如果想要修改IC
task参数的话,必须先关闭这个task。在关闭task的过程中,IC会继续执行完当前帧,当这一帧处理完后,IPU向ARM平台发送一个中断信号,通知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。具体突发的大小在对应channel的CB#_BURST_SIZE位里面定义的。其中,在这个memory中每一个字的大小是128bits,每个字里面包含相连的颜 {MOD}元素或者16bytes的通用数据(例如Bayer)。这几个FIFO是通过InputBuffer
Memory Control来控制的。
Downsizing Unit提供图像像素水平方向和垂直方向上的平均和采样根据下面的公式:
IPr,c代表输入像素,HPR,c代表经过水平缩放的像素值,VPR,C代表在水平缩放的基础上再次经过垂直缩放后的像素值。DS_R_H和DS_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内存中一行含有两个buffer,Downsizing
Unit填充这两个buffer中的前背景部分,Main
Processing Unit填充这两个buffer的后背景部分。
(4)Main
Processing Section
对于每一个任务,Main Processing Unit都会按照下面的步骤来处理:
1.将从Downsizing
Output Memory里面所读取到数据进行翻转(可选操作,因为是是否翻转是根据对应dma channel的CPMEM中的有关VF,HF和ROT参数来决定的),encoding任务使用IDMAC
channel #20,viewfinder任务使用IDMAC
channel #21,postprocessing任务使用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 value,A代表a
global or local transparency parameter。global 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为每个任务准备了三个buffer:the
temporary row buffer, the graphics
FIFO和the output FIFO.
(5)Rotation
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)