8.1 子模块分析之IDMAC

来源:互联网 发布:孙子涵是网络歌手吗 编辑:程序博客网 时间:2024/05/22 00:10

先来看一个整体的图:


主要看图中蓝色的箭头,它反映了IPU内部数据总线的连接关系。后面我们研究的DMA传输都需要物理连接的支撑。可以看出来,在IPU中最重要的模块就是这个CM- Control Module模块和IDMAC– Image DMA Control模块了。

这个图中有几点不好理解:

1IPUARM都挂载在AHB总线上面,ARM就是通过CM模块来控制使用IPU

2)数据要进行DMA传输全部需要使用IDMAC进行控制,同时IDMAC通过AXI总线与内存相连。


IDMAC的作用:

下面来分析IDMAC


看看各个子模块的含义:

IBIW& IBIR : Internal Bus Interface Write / Read

IPU内部总线向IDMAC桥接,可以简单看成多路复用控制模块。

FCW& FCR : Format Converter Write / Read

从框图反映为64位总线向128位总线过渡,其实它的核心工作是数据的压缩存放,和压缩数据进入IPU其他模块前的数据还原。但数据位于RAM中的存储方式与IPU所支持的格式不同。当然要想实现数据的压缩与恢复我们还需要CPMEMLUT的支持。

BCW& BCR : Buffer Controller Write / Read

BUFW& BUFR : Buffer Write / Read

读写端都具有4x 64 bytes buffers,因为RGBAYUVA都有4种颜色分量构成。BCW控制BUFWBCR控制BUFR

AXIW& AXIR : AXI Write / Read

AXIW/AXIR控制对AXI总线的读写。IPU手册解释为:实时通道控制。因为IPUAXI发出的请求有实时总线请求与非实时总线请求,并且BCR/BCW会对他们进行控制,可用读取通道数为8,写入通道数为6。因此防止全部非实时通道造成的通道阻塞,因此需要限制IPU同时最高使用的通道数目。

CC_W& CC_R : Channel Control Write / Read

其实CC_W/CC_R才是最重要的IDMAC控制单元

AAU_W& AAU_R : Address Arithmetic Unit Write / Read

DMA访问地址计算单元

ATC: Alpha Transparency Controller

LUT: Look up table

CPMEM: Channel Parameter Memory

每个通道由160bit参数配置区控制。


下面具体分析每一个小模块:

1IDMAC目前一共有52channel,如果想要使能一个channel的话,就设置对应的IPU_IDMAC_CH_EN寄存器,由于每个寄存器是32位的,所以需要两个寄存器来对应这52channel,寄存器如下所示:

2IBIW& IBIR - Internal bus interface for write and read

这个小模块实现了IPU内部的子模块与IDMAC的通信,IPU内部的子模块通过IBIW来向内存中写数据,通过IBIR来从内存中读取数据。


3FCW& FCR - Format converter write and read

Formatconverter的主要工作是数据的压缩存放(write的时候)与压缩数据的还原(read的时候)。为什么这么说呢:因为IPU内部只支持下面这两种格式,并且每种格式都是32位的。

而数据在RAM中的存储方式有很多,如下所示:

图中R/G/B意味着这个位置可以为R或者G或者BA代表alpha元素的位置。

这些格式元素保存在CPMEM中。

下面这个图是数据压缩的示意图:

下面这个图是数据解压示意图:


如果要读取的数据是已经编码的格式,需要经过look_uptable来解码。所以LUT必须在IDMAC初始化的时候加载进去。LUT的输出格式必须匹配IPU内部的数据格式:RGB888,同时R在最高位,A在最低位。


4Bufferingunits

BufferingunitsBUFWBUFR)用来存储包含不同颜色成分的已编码数据。每一个bufferingunit包含4×64bytesBUFWBCWAXIW控制,BUFRBCRAXIR控制。


5AXIW- AXI Write and AXIR - AXI Read

AXIW/AXIR控制对AXI总线的读写。IPU手册解释为:实时通道控制。因为IPUAXI发出的请求有实时总线请求与非实时总线请求,并且BCR/BCW会对他们进行控制,可用读取通道数为8,写入通道数为6.因此防止全部非实时通道造成的通道阻塞。因此需要限制IPU同时最高使用的通道数目。需要设置USED_BUFS_MAX_W或者USED_BUFS_MAX_R,但是没有找到这两个寄存器在哪里。


6CC_W& CC_R - Channel Control Write and Read

1.Channel Control unitIDMAC里面最重要的控制单元。

1)它根据各个channel的优先级来仲裁。

2)控制addressarithmetic unitAAU)。

3)作为CPMEM的接口,从CPMEM里面来读取参数,为参数所对应的控制做准备,然后如果这些参数更新了的话,再将这些参数写到CPMEM中去。

4CC_RIBIR单元提供参数。

5CC_WAXIW单元提供参数。


2.Channel Control单元几乎计算需要所有的参数,除了地址和BS(burst size)是在AAU中计算。

3.优先级设置:

1)每个channel优先级是在IDMAC_CH_PRI_1IDMAC_CH_PRI_2寄存器中的对应位中设置的。

2watermark(水印)从子模块中产生,同时watermark默认是忽视的,除非IDMAC_WM_EN存器中的某个channel对应位已经设置了。

3alpha通道有特殊的优先级。

IDMAC_CH_PRI_1寄存器如下:


IDMAC_CH_PRI_2寄存器中肯定是剩下的channel了,就不截图表示了。

4.其中最终的优先级value是根据上面所说的三个优先级的综合结果,如下所示:


大致意思就是每个alphachannel的优先级权值是1Channel'spriority bit的优先级权值是2,watermarksignal的优先级权值是1.再对比上图,就很好理解最终的优先级value是怎么计算出来的。


5.Locking the arbitration and reordering the AXI bursts

当通过AXI总线发送连续的burst地址的时候,能够提高系统的整体性能。这样做的方法是将同一个channelAXIburst地址重新排序后一起发送。有关的寄存器是IPUx_IDMAC_LOCK_EN_1IPUx_IDMAC_LOCK_EN_2.如下所示:


顺便看一下解释:用两位来表示一个channel,这两位的值代表同时发送这个channel的几个连续AXIburst地址。


7AAU_W& AAU_R- Address Arithmetic Unit for Write and Read

DMA访问地址计算单元,计算出IPU能够访问的地址,计算公式是:

ADDR= EBA + (XB + SX) * BPP + (YB + SY) * (SL + 1)

当在使用双buffer模式时,EBA0buffer0的基地址,EBA1buffer1的基地址。IPU_CHA_CUR_BUF寄存器是一个状态寄存器,里面包含每一个DMAchannel当前使用的buffer的指针,如下所示:


可以看出来,这个寄存器是只读的。

IPU会自动地将IPU_CHA_CUR_BUF寄存器里面的指针指向当前的buffer。如果双buffer模式的数据来源是ARM平台的话,那么ARM就需要去检查这个寄存器来确定哪一个buffer是当前使用的,并且ARM只能在没有其他dmachannel使用buffer的情况下向其中写数据。当ARM平台将这个buffer中填充满数据以后,需要设置IPU_CHA_BUF0_RDYIPU_CHA_BUF1_RDY这两个寄存器中的相应位。

因为一共52dmachannel,所以需要使用4个寄存器来表示这些状态,下面只列出了IPUx_CH_BUF1_RDY0寄存器。

在上面介绍ChannelControl的时候说了,CC是最重要的控制单元,它有几个功能:

作为CPMEM的接口,从CPMEM里面来读取参数,为参数所对应的控制做准备,然后如果这些参数更新了的话,再将这些参数写到CPMEM中去,控制addressarithmetic unitAAU)来计算地址。而这个AAU就是通过上述过程来计算地址的。


8ATC- Alpha Transparency Controller

当像素数据和alpha数据分布在不同的buffer的时候,就需要ATC来控制。

首先需要明确的一点是,在52dmachannel中,一共有7dmachannel是可以指定像素数据和alpha数据分布在不同的buffer中。这几个dmachannel分别是:14,15,23,24,25,27,29.当然,这几个channel也可以像其他channel一样使用像素数据和alpha数据分布在同一个buffer的模式。

那么系统怎么区分它们呢?首先需要设置IDMAC_SEP_AL这个寄存器,如下所示:

同时,还需要设置CPMEM中的ALU位,如下所示:

上面说了,dmachannel中一共有7channel可以指定像素数据和alpha数据分布在不同的buffer中,那么这个alpha数据也需要使用一个channel来存放啊,那么这几个通道和相应的alpha数据channel是怎么关联的?就需要从CPMEM中的ALBM参数来指定了,如下所示:


从这几个图中就可以看出来,当ALBM设置为0时,会将1417通道关联起来。依次类推。

再来看看IDMACdma channel列表中,确实跟上面所说的一致.


9LUT-Look Up Table

查阅表,这个是在编码译码的时候的辅助表。

当工作在已编码和8bit的数据格式下,从内存中读取的数据都是经过译码的数据。但是工作的4bit的模式下,就需要根据LUT来选择数据,那么怎么根据LUT来选择呢?就需要根据CPMEM中的DEC_SEL位。在查看CPMEM的时候,发现DEC_SEL只工作在隔行存储数据的模式下。

10CPMEM- Channel Parameter Memory

对于每个dmachannel的配置都保存在对应的CPMEM中,每个CPMEM包括两个mega-word,并且每个mega-word160位。


每个dmachannel都可以配置成两种模式:

1)非隔行数据模式:Y:U:V数据分别保存在系统内存中的三个不同位置。

2)隔行数据模式:Y:U:V数据保存在系统内存中的同一个buffer上面。


而对于这两种不同的模式,CPMEM中每一位所代表的含义也是不同的,所以首先需要确定当前的dmachannel所使用的是哪一种数据保存的格式,IPU会根据CPMEM中的PixelFormat Select (PFS)位来决定数据被解析成哪种格式。


关于这个CPMEM中每一位的分析,在应用程序中已经分析了部分了,暂时就不分析每一位了。


11IDMACRotation操作

Rotation:翻转操作需要IDMACIC共同来操作。

每一帧数据被分成8×8的像素块,然后IC对每个像素块内的数据进行重排列,IDMAC对这些像素块进行重排列。

IDMAC对这些像素块进行重排列时按照什么规则来重排列?需要根据CPMEM中的ROT,VF & HF 参数。




12Framesize

IPU支持很多种非隔行的数据格式,通过CPMEM中的FrameHeight (FH)FrameWidth (FW)来控制.






13IDMAC'sinternal events


至此,IDMAC就分析完毕了。


0 0
原创粉丝点击