关于DM814x系统学习

一、DM814x体系架构

4核心:A8(arm) + M3 VIDEO + M3 VPSS + DSP(c674x)

关于DM814x系统学习_第1张图片

A8:图片码流收发,网络服务,消息控制,其他应用等,LINUX 1.0GHZ

M3 VIDEO:图片H264MJPEG编解码等,BIOS6 280MHZ

M3 VPSSCamera采集,Capture采集,ISPSIMCOPDisplay(HDMI,SDO,HDO)MJPEG编码,SCALARNSFFD等,BIOS6 280MHZ

DSPalg图像智能处理算法等,BIOS6 700MHZ

操作系统:

关于DM814x系统学习_第2张图片


二、软件架构(syslink

系统通过syslinklink机制来进行数据流的搭建,核与核之间是通过syslinkipc通信机制进行通信的,syslink是建立于操作系统之上的集任务和消息通信于一身的软件架构,故每个核须跑操作系统。通过编写一个link来完成特定的任务,一个link相当于一个特殊的线程,link内部必须完成对数据流的控制和消息的通信。Syslink软件架构如下图:

关于DM814x系统学习_第3张图片

关于DM814x系统学习_第4张图片

LINK ID:每个link都包含一个唯一的32位的link ID,高4位是处理器的ID,低28位是link id号:

关于DM814x系统学习_第5张图片

关于syslink详情见TI提供的介绍文档。SDK已集成的links如下,可以自己编写添加别的link:

关于DM814x系统学习_第6张图片

关于DM814x系统学习_第7张图片

关于DM814x系统学习_第8张图片

关于DM814x系统学习_第9张图片

关于DM814x系统学习_第10张图片

关于DM814x系统学习_第11张图片

关于DM814x系统学习_第12张图片

关于DM814x系统学习_第13张图片

关于DM814x系统学习_第14张图片

关于DM814x系统学习_第15张图片

MPSCALAR: YUV422I/YUV420->YUV422I,mpW*mpH->1920*1080 (mpW*mpH>=1080p)

SCALAR: YUV422I/YUV420SP->YUV422I,W*H->scW*scH (W*H<=1080p,scW*scH<=1080p)

NSF: YUV422I->YUV420SP


Syslink API:

API

Description

System_linkCreate

Creates a link- allocates driver, codec, memory resources.

System_linkGetInfo

Getinformation about a link like number of channels, properties ofeach channel. MUST be called after System_linkCreate() for a link

System_linkStart

Start the link- starts the driver or codec

System_linkControl

Send a linkspecific control command with optional arguments

System_linkStop

Stop the link- stops the driver or codec

System_linkDelete

Deletes a link- frees driver, codec, memory resources


Link的建立:

1.在link_api目录下添加相应的link头文件;

2.在system_linkId.h中添加相应的id定义;

3.在相应模块中添加_priv.h和_tsk.c;

4.在src_bios6\links_common\system\system_priv_common.h中添加相应的优先级定义,添加栈大小的定义;

5.在System_xxx.c(如在dsp中是System_c6xdsp.c)中调用相应的init接deInit接口;

6.在ipnc_mcfw\mcfw\src_linux\mcfw_api\ti_vsys_priv.h中添加相应的头文件;

7.在链路搭建中使用link.

Link内部必须完成任务的初始化和反初始化:xxxLink_init(), xxxLink_deInit()

Link内部必须完成create时候的初始化:xxxLink_create(),在System_linkCreate()的时候会调用到这里来。

Link内部必须完成数据流的控制:定义取bufferxxxLink_getFullFrame)、还buffer(xxxLink_putEmptyFrame)和取linkInfo(xxxLink_getLinkInfo)的接口并在init接口中注册这这些接口(回调函数)。

Link的消息的通信:定义相应的消息ID,定义相应的消息处理函数,在xxxLink_tskMain任务主函数循环内部添加相应消息ID处理函数的调用。


Chain的搭建:

根据应用的需求我们需要把数据的处理流程先整理出来,然后把每个数据处理的关键环节写成link,因为Link内部已经完成了对数据流的控制,然后我们只要把这些link按照流程链接起来就完成了,chain就是把link链接起来搭建成完整的数据流链路的过程。需要注意的是,chain的搭建(create)需要从数据源link开始搭建,并且要正确的按照数据流顺序来搭建;chain的停止(stop)也需要从数据源link开始停止;而chain的销毁(delete)则要反过来,从数据流的末端开始销毁。


关于link的搭建的几点注意事项:

(1)ipcFrameInLink 后面必须接dupLink(如果链路还要继续走),否则会出错,原因是ipcFrameInLink使用了帧头的一些信息,后面的link(一般的link)会将这些信息丢掉,而dupLink会先保存帧头信息,等还buffer的时候再重新拷贝回去。

(2)对于核间交互的link即带有ipc头的link,需要特别注意prevLinkQueId,前后2ipcLink都不需要注意prevLinkQueId(除非是最后一个link了),但是ipcInLink的下一个linkprevLinkQueId必须跟ipcOutLink的前一个linkqueId匹配链路才能搭建成功,例如:

ispCreatePrms.numOutQueue = 2;

ispCreatePrms.outQueuePrm[0].nextLink = xxx;

ispCreatePrms.outQueuePrm[1].nextLink = ipcM3OutVpssLinkId;

ipcM3OutVpssPrms.inQueParams.prevLinkId = ispLinkId;

ipcM3OutVpssPrms.inQueParams.prevLinkQueId = 0/1; //0 or 1 or other may work

ipcM3OutVpssPrms.outQueParams.nextLink = ipcM3InVideoLinkId;

ipcM3InVideoPrms.inQueParams.prevLinkId = ipcM3OutVpssLinkId;

ipcM3InVideoPrms.inQueParams.prevLinkQueId = 0/1; //or other may work, don’t care

ipcM3InVideoPrms.outQueParams.nextLink = encLinkId;

encLinkPrms.inQueParams.preLinkId = ipcM3InVideoLinkId;

encLinkPrms.inQueParams.preLinkQueId = 1; //should be 1, only care ispLink out queid

这是因为ipcM3OutipcM3In纯粹是将前一个link的所有linkInfo拷贝给下一个link,而不会按照queid只读取que的信息给下一个link

3mergeLink是多进一出,进来的que都被mergechannel上,merge的过程是按顺序merge的,如进来有3queque0本身有2个通道,que1有一个通道,que22个通道,则merge后的通道01分别对应于que0的通道01,通道2对应于que1的通道0,通道34分别对应于que2的通道01mergeLink可以和selectLink一起使用,selectLink是选择某一个通道转成que



三、A8核

略。


四、VIDEO M3核

也叫HDVICP2,与VPSS M3共用一个媒体控制器,共享cache。有视频编解码的硬件模块,完成H264MJPEG的编解码。

关于DM814x系统学习_第16张图片


五、VPSS M3核

与VIDEO M3共用一个媒体控制器。有CameraCaptureISP5SIMCOPDisplay(HDMI,SDO,HDO)MJPEGSCALARNSFFD等视频采集处理模块。其中CameraISP5SIMCOP集成在ISS中,而MJPEGSIMCOP来做的,TI SDK已经编成相应的库。CaptureDisplaySCALARNSF集成在HDVPSS中。这些模块均有硬件来完成。


1. ISS架构


左边黄色框为SIMCOP模块,右边为Camera采集模块(CSI2串行采集口和CPI并行采集口)和ISP5Camera ISP数据流:(1)CPI -> IPIPEIF -> ISIF -> DDR; (2)CPI -> IPIPEIF -> ISIF -> H3A -> DDR; (3)CPI -> IPIPEIF -> IPIPE -> DDR; (4)CPI -> IPIPEIF -> IPIPE -> RSZ -> DDR. 

SIMCOP叫做静态图像协处理器(still image coprocessor),功能有图像编解码(如MJPEG)和图像数据处理(如直方图统计等),是基于微块内存到内存(M2M)的图像处理引擎,有单独的cpu,可编程。硬件模块有DMALDC(畸变矫正)DCT(离散余弦变换)VLCDJ(JPEG编解码)NSF2(二维时域降噪)NSF3(三维时空降噪)ROT(块旋转)IMX A&B(可编程图像处理引擎),时钟由ISS提供。该模块的开发需要TI提供相关的文档。

做图像的可能都会用到缩放,ISP里面有一个缩放模块RESIZER,由RSZ ARSZ B组成。AB可以同时工作,也可以只使用A,分别实现2种或1种分辨率的输出,可以放大也可以缩小。需要注意的是RSZ ARSZ B,输出的分辨率和倍数有限制,RSZ A缩放后的图像宽度必须小于等于5376RSZ B缩放后的图像宽度必须小于等于2336,高度都没有特别的限制;放大倍数也有限制,Normal模式下最大放大20倍和最小缩小1/16倍,如果是DownScaling模式(需要修改底层寄存器的配置)则只能用于缩小,最小到1/4096倍。另外,RSZ ARSZ B是同源同时钟工作的,即它们的数据源必须相同(不能同时配不同的图像,一张给A缩放另一张给B缩放),也共用一个时钟,故它们的步伐是一致的,所以缩放的快慢取决于输出的最大分辨率。ISP的时钟配置是这样的,ISP的时钟是基于ISS的分频,其实是先倍频后分频,从ispLink参数配置可以看出(clkDivM倍频和clkDivN分频),相应一个是读时钟ISS_FCLK*clkDivM/clkDivNIPIPEIPIPEIF时钟,不知道内部是否还有时钟细分不得而知),一个是写时钟ISS_FCLK,这是因为读时钟是将数据从内存读到fifo里面和数据处理的时钟,写时钟相当于数据写入内存的时钟,根据图像输出的分辨率读时钟必须小于写时钟,故这2个时钟必须正确配置才能良好工作,否则会发生溢出(resz overflow)的情况。故ISP的时钟配置必须符合以下条件:

ISS_FCLK*(clkDivM/clkDivN) / ISS_FCLK  <=  input resolution / max output resolution

即:clkDivN/clkDivM  >=  max output resolution / input resolutionM2M

关于ISP时钟可能我理解的有偏差,最好参考ISS文档,但是经过测试的确是需要符合以上的条件的。


2. HDVPSS架构

关于DM814x系统学习_第17张图片

HDVPSS2个采集口,VIN0VIN1,支持进来的数据有YUV422PYUV444IRGB,可以转换为YUV420SPYUV422IYUV422SPRGB等数据格式存储到DDR中。

数据流:

VIN0 -> VIP_PARSER0 -> ..... -> CHR_DS0 -> VPDMA -> DDR3

其他参见Capture图像采集总结.doc.


六、DSP核

DSP库的添加:

ipnc_rdk\ipnc_mcfw\mcfw\src_bios6\links_c6xdsp目录下新建一个目录/libs,将编好的dsp库放到这个目录下,然后在ipnc_rdk\ipnc_mcfw\makerules\rules_c674.mk文件中变量LIB_PATHS后面添加库的绝对路径和库名,在link里面包含库头文件后就可以调用库的接口了。


七、内存分配

系统内存分配是在一个.bld文件中修改的,该文件位于ipnc_rdk\ipnc_mcfw\mcfw\src_bios6\cfg\ti814x目录下:

关于DM814x系统学习_第18张图片

M3、DSP和A8的配置都是在这个目录下相关的文件进行配置的,如DSP cache的配置(FC_RMAN_IRES_c6xdsp.cfg)。


你可能感兴趣的:(DM814x,TI,HDVPSS,ISS)