根据前几篇文章,一个DM6446的系统已经架构完成。但是有很多人都喜欢TI的机制,毕竟双核软件开发对很多工程师来说是非常麻烦的事情,既然TI提供开发套件和开发包,那么直接做OEM就可以了,底层的东西不需要关心很多,所以我们在这里开始讨论双核通信机制(包含DSP SERVER)。特别是TI提供H.264、JPEG、MPEG4、G711等算法调用例子,让很多系统集成工程师看到项目的希望。网上有很多朋友都介绍DVSDK1.0的Codec和DSP SERVER,他们都写得不错,本篇部分内容介绍也借鉴他们的,在此基础上重点介绍dvsdk_2_00_00_22,毕竟TI的dvsdk原理几乎都一样。TI有几个文档:sprued5.pdf、sprued6.pdf、sprue67.pdf和spruec8b.pdf,都是学习Codec Engine的不错资料。
 
一、dvsdk_2_00_00_22介绍
在我们讨论TI Codec Engine原理之前,先检查大家安装的dvsdk_2_00_00_22,看看还有什么没有安装的,见下图。先让大家有个感性的认识,否则先讲Codec Engine原理的话,估计有不少人还没看完就兴致消失了。dvsdk_2_00_00_22是基于TI EVM的硬件平台的,有些朋友自己设计独创的DM6446板子,要利用TI Codec Engine,就需要做很多移植工作,这是经验之谈。本人在《TI Davinci DM6446开发攻略——开发环境搭建》里,也介绍一些基本软件包的安装,本人这里多装了一个低版本的c6x code generation tools,其实用dvsdk_2_00_00_22自带的cg6x_6_0_23就可以了。dsplink-1_61_03-prebuilt_bk是因为本人要编译dsplink-1_61_03-prebuilt,所以备份一下,防止出问题,其他dvsdk_2_00_00_22的软件包(codec_engine_2_23_01、dvsdk_demos_2_00_00_07,等等)都有原始备份,毕竟本人不是牛人,这些东西开始时不是非常熟悉,所以改动前都要备份一下,以便以后出问题进行比较和还原。根据TI dvsdk_2_00_00_22的Codec Engine要求,local_power_manager_1_23_01是要安装的,有些例子就需要这里边的lpm_dm6446.ko和ocvc_dm6446.ko。这些都可以通过TI的网站上下载(一个网友说得好:内事不决问老婆,项目不决问google)。
 
dvsdk_2_00_00_22里每个软件包和工具包内都有文档介绍说明,见 dm6446_2_00_00_22_release_notes.html的介绍(懒得连文档都不愿看的人或急功近利直接拿来的人,进步是不大的,除非是天才。中国有很多有天才资质的人,但在中国是不会出现天才的,所以,好好看文档吧,呵呵。),而Rules.make是一个很重要的文件,见《开发环境搭建》里有介绍。其中:
bios_5_33_06:是TI的DSP实时操作系统,本人下载比较新的版本。和C6x Code Generation Tools一样,这里的DSP/BIOS也是Linux环境下的版本。DSP系统工程师需要了解这个操作系统。
cg6x_6_0_23:这个是dsp的交叉编译链,即在linux下生成可以在c64系列dsp上运行的程序;
codec_engine_2_23_01:是TI机制的重点所在,实现ARM和DSP或协处理器的协同工作,以它为基础进行算法等开发。开发codec_engine_2_23_01前,如果你不是公认的牛人,请生成自己的Codec Engine例子的目录——<CE_EXAMPLES_INSTALL_DIR>e.g. /usr/work/examples,就是把codec_engine_2_23_01/ examples给COPY到你的工作目录,备份一下。
dm6446_dvsdk_combos_2_05:Codecs for both encoding and decoding H.264 and decoding MPEG2。 玩H264的朋友就应该知道这个文件包的价值。
dmai_1_20_00_06:里边有Capture,Disaplay,V4L2等内核驱动接口,encode,ecode,encodedecode这些例子调用这些驱动接口。
dvsdk_demos_2_00_00_07:里边有encode,ecode,encodedecode的应用例子;
dvtb_4_00_08:这是一个在ARM端运行,基于脚本语言的测试codec的应用程序。用户不需要写任何C代码就可以处理Linux I/O, codec API以及一些与线程有关的问题;
dsplink-1_61_03-prebuilt:是实现ARM和DSP之间通信的底层软件,Codec Engine就是建立在这个底层软件之上。编译出来的dsplinkko.ko是Codec EngineE基本元素之一。
edma3_lld_1_05_00:里边包括EDMA3的低层驱动;
framework_components_2_23_01:是TI提供的一个软件模块,负责DSP侧的memory 和DMA资源管理。因此,DSP算法工程师需要了解这个软件模块。
linuxutils_2_23_01:里边有cmem.ko,这个也是Codec Engine基本元素之一。
local_power_manager_1_23_01:里边有lpm_dm6446.ko和ocvc_dm6446.ko,这个ko有些DM6446的例子是没有用到。但在OMAP的芯片中,DVSDK3.0基本上用到这个元素。
PSP_02_00_00_140:里边包括TI提供的FLASH TOOL,UBL的BIN文件,UBOOT-1.2.0等源代码,audio,ccdc,gpio,V4L2的例子源代码。
xdais_6_23:是一个标准,它定义了TI DSP算法接口的标准。这样大大提高了DSP算法软件的通用性。DSP算法工程师要写出能被ARM通过Codec Engine调用的算法,必须保证自己的算法接口符合这个标准。因此,DSP算法工程师也必须了解这个软件模块。
xdctools_3_10_03:XDC Tools和gmake类似,是用来编译和打包的工具,能够创建实时软件组件包RTSC(Real Time Software Component).与其他编译工具一样,它能根据源文件和库文件编译生成可执行文件。不同的是它能够自动的进行性能优化和版本控制。XDC还能够根据所提供的配置脚本语言产生代码,这一特性在编译如编解码器、服务器和引擎等可执行程序时尤为重要。XDC根据用户定义的一套build指令,通过调用用户指定的ARM 工具链(Tool Chain)和DSP编译器(C6x Code Generation Tools )build出ARM侧和DSP侧的可执行文件。可以先不必细究这个工具,只需通过编Codec Engine的例子,就知道如何设置build指令就可以了。有关XDC的用法,下面这段是参考一个网友的,本人放到这里,让大家更好去理解XDC。
XDC的调用语法格式: XDC <target files> <XDCPATH> <XDCBUILDCFG>
target files: 指编译产生的目标文件。可以通过命令脚本来指定要产生哪些目标文件;
XDCPTH:       编译时所要查找的目录;
XDCBUILDCFG: 由"config.bld"文件指定,包含了与平台有关的编译指令。后面细说。
以上命令模式可能在参数过多是很复杂,通常把它写成shell脚本来运行。
与XDC相关的三个配置文件:package.xdc: 主要包含与包package有关的信息:依赖信息、模块信息、版本信息。由自己提供。package.bld: 主要作用是定义一个包应该如何被编译。文件内容用Javascript来描述。其中包含目标平台集的定义[MVArm9,Linux86]、编译版本的定义[release]、确定源文件集、生成的可执行文件信息等等。这两个文件都是在server目录下,可见每个codec都有自己的package信息描述文件,然后XDC根据再依之生成一个package包。config.bld: 这个文件处在codec_engine_##目录下,为各个codec所共有,它主要定义了与平台有关的特性,包含如下几部分:DSP Target、Arm Target、Linux Host Target、Build Targets、Pkg.attrs.Profile、Pkg.lib等具体信息。通常都是基于TI提供的模板对这三个配置文件做修改。
   其实说这么多的xdais 和XDC,我们先不用一下子就理解很透彻,TI提供的软件包example和工具包都帮我们设置好的,我们要做的就是修改makefile, Rules.make, xdcpaths.mak,user.bld的工作。上面介绍的软件包工具包是开发Codec Engine必不可少的元素,如果要深入学习,得好好看sprued5.pdf、sprued6.pdf、sprue67.pdf和spruec8b.pdf。
 
二、TI DAVINCI软件架构原理介绍
软件架构分为应用层、信号处理层和I/O层三部分,TI提供的达芬奇参考软件框架就是基于这样的结构,如下图。Davinci的应用工程师 可以在系统的用户空间在系统功能性上添加和发挥自己的特色。信号处理层通常都运行在DSP一侧负责信号处理,包括音视频编解码算法、Codec Engine、DSP的实时操作系统DSP/BIOS及和ARM通信的模块。I/O层就是我们通常所说的驱动,是针对Davinci外设模块的驱动程序。在DAVINCI系统中,Davinci的ARM是HOST,负责操作系统应用,DSP是协处理器,负责运行音频视频codec算法处理,ARM通过TI的Codec Engine机制调用DSP侧的codec。
 
 
 
其中应用层通过Codec Engine的VISA(Video, Image, Speech, Audio)API来调用DSP侧的算法,通过EPSI(Easy Peripheral Software Interface)API来访问和操作Davinci的外设。这三个部分通常对应三个Davinci软件开发小组。当然还需要一个系统集成工程师把这三个部分集成起来,不过VISA API和EPSI API的存在已经大大简化了集成工作的复杂程度。Codec Engine是连接ARM和DSP或协处理器的桥梁,是介于应用层(ARM侧的应用程序)和信号处理层(DSP侧的算法)之间的软件模块。ARM应用程序调用Codec Engine的VISA (Video, Image, Speech, Audio)API,如下图中VIDENC_process(a, b, c )。Codec Engine的stub (ARM侧)会把参数a, b, c以及要调用DSP侧process这个信息打包,通过消息队列(message queue)传递到DSP。Codec Engine的skeleton(DSP侧)会解开这个参数包,把参数a, b, c转换成DSP侧对应的参数x, y, z(比如ARM侧传递的是虚拟地址,而DSP只能认物理地址),DSP侧的server(优先级较低,负责和ARM通信的任务)会根据process这一信息创建一个DSP侧的process(x, y, x)任务最终实现VIDENC_process(a, b, c)的操作。
 
 
 
 
 
要真正了解DM6446软件架构,先从自己所处的角色说起,本人认为,开发DM6446软件一般分为:双核系统集成工程师、ARM应用程序工程师、DSP算法工程师和DSP系统工程师。牛的人一般都兼职四个角色!
ARM应用程序工程师:应用层开发设计
DSP算法工程师:DSP算法设计
DSP系统工程师:集成算法LIB和DSP/BIOS的DSP Server设计;
双核系统集成工程师:UBL、UBOOT、LINUX内核、根文件系统、设备驱动程序设计、总体系统集成。
每个角色的具体分工,可以看看sprue67.pdf。以下是一个网友提供的资料,如图下图所示,DaVinci的软件开发通常需要四个步骤(本文以codec运行在DSP为例):
 
 
软件系统分为应用层、信号处理层和I/O层三部分,达芬奇软件开发通常需要以上四个步骤。
 
第一步,DSP算法工程师需要基于DSP利用CCS开发自己的音视频编解码算法,编译生成一个编解码算法的库文件*.lib(等同于Linux环境下的 *.a64P,直接在Linux环境下修改文件后缀名即可)。如果要通过Codec Engine调用这个库文件中的算法函数,那么这些算法实现需要符合xDM(xDAIS(eXpress DSP Algorithm Interface Standard) for Digital Media)标准;Codec Engine机制下不符合xDM标准的算法实现需要创建算法自己的Stub和Skeleton(具体请参考spraae7.pdf)。
第二步,生成一个在DSP上运行的可执行程序*.x64P(即.out文件),也就是DSP Server。
第三步,根据DSP Server的名字及其中包含的具体的音视频编解码算法创建Codec Engine的配置文件*.cfg。这个文件定义Engine的不同配置,包括Engine的名字、每个Engine里包括的codecs及每个 codec运行在ARM还是DSP侧等等(具体说明,请参考sprue67.pdf的第5章Integrating an Engine)。
 最后,应用工程师收到不同的codec包、DSP Server和Engine配置文件*.cfg,把自己的应用程序通过编译、链接,最终生成ARM侧可执行文件。
 
三、利用Codec Engine进行自己的项目
如何利用Codec engine进行自己的项目呢?例子——TI提供的例子,会让你省掉很多复杂的过程,例子先给你个感性的认识,以后用多了,慢慢你就会了解xDAIS、xDM标准和XDC TOOL,xDM只是xDAIS的扩展。你要做的是修改相应工具包、软件包里的makefile, Rules.make, xdcpaths.mak,user.bld,config.bld等等。我们就拿dvsdk_2_00_00_22\dvsdk_demos_2_00_00_07\dm6446\encodedecode说事,因为这个例子调用H.264的codec。
首先确保以下关键元素可以编译通过:
dvsdk_2_00_00_22\codec_engine_2_23_01\examples
dvsdk_2_00_00_22\dm6446_dvsdk_combos_2_05
dvsdk_2_00_00_22\dmai_1_20_00_06
dvsdk_2_00_00_22\dsplink-1_61_03-prebuilt
dvsdk_2_00_00_22\dvsdk_demos_2_00_00_07\dm6446
dvsdk_2_00_00_22\linuxutils_2_23_01\packages\ti\sdo\linuxutils\cmem
 
编译通不过的原因就是相关的makefile, Rules.make, xdcpaths.mak,user.bld没有修改好。请参考各个软件包的文档,比如dvsdk_2_00_00_22/codec_engine_2_23_01/examples/build_instructions.html等,怎么编译,是使用make,gmake还是xdc设置,文档都有介绍,如果要在这里都列出来,那太耗时间了。我们重点讲一下上面软件包的之间的关系,让大家进一步了解Codec Engine。dvsdk_2_00_00_22\dsplink-1_61_03-prebuilt里可以生产dsplinkko.ko,dvsdk_2_00_00_22\linuxutils_2_23_01\packages\ti\sdo\linuxutils\cmem里产生cmem.ko。dsplinkko.ko,cmem.ko这些在开发包里有,由于这些驱动编译时使用的内核和你的内核不一致,所以在目标板子上运行encodedecode的例子时,insmod会出错,你要以你的内核为准,重新编译这些驱动。encodedecode的例子会用到dm6446_dvsdk_combos_2_05里DSP Server的loopbackCombo.x64P,而这些codec 和 server就是建立在codec_engine_2_23_01的基础上的。encodedecode的例子调用linux内核驱动,是通过dmai_1_20_00_06。这样分析,大家应该对dvsdk_2_00_00_22有个比较全面的认识了,很多工作可以进行了。经过一段时间看文档和实际摸索,终于调通TI CODEC ENGINE,这样就轻易调用h.264,g711音频的算法,在我们帮客户设计的硬件平台上,我们成功的帮组客户实现TI 机制开发要求,这样客户基本上不用花太多时间就可以设计出自己的产品,加快产品上市时间。有关Codec Engine包括DSP Server,本文先介绍DAVINCI的双核通信机制,有关DSP Server的搭建,本人打算参考一个网友的文章,因为他写得很不错,他在dvsdk_1.0上介绍的,本人针对dvsdk_2.0 对DSP Server的原理再添加点内容。
本人写文章,目的主要是给大家介绍开发方法,动手的还得大家自己去做,这样你个人能力才会有质的飞跃,一上来就加本人博客公告里的QQ,要这要那,本人觉得是一种很肤浅的行为。本人一再声明,QQ是谈生意和项目合作、技术支持的,是为客户服务的。写技术文章,就是培养一种技术氛围。技术氛围是一个很广泛的东西,没有这种良好氛围,科技就会发展很慢,浮躁急功近利的氛围,只有被动挨打,任人宰割。任何科技发明,科技创新,都需要良好的技术氛围。学习别人先进的东西,总会没错的,否则浮躁急功近利,只会变成实实在在的机器工人,而不是有思维、有创造力的人。

Davinci DM6446 Codec Engine双核通信环境的搭建的更多相关文章

  1. TI Davinci DM6446开发攻略——开发环境搭建

    TI DAVINCI DM6446的开发环境搭建不像三星S3C2410,S3C2440,ATMEL的AT91SAM9260之类的单核ARM那么简单,因为DM6446还有DSP端的开发环境,以及双核之间 ...

  2. 基于TI Davinci架构的多核/双核开发高速扫盲(以OMAP L138为例),dm8168多核开发參考以及达芬奇系列资料user guide整理

    基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门 原文转自http://blog.csdn.net/wangpengqi/article/details/8115614 感谢 ...

  3. 【DSP开发】帮您快速入门 TI 的 Codec Engine

    德州仪器半导体技术(上海)有限公司 通用DSP 技术应用工程师 崔晶 德州仪器(TI)的第一颗达芬奇(DaVinci)芯片(处理器)DM6446已经问世快三年了.继DM644x之后,TI又陆续推出了D ...

  4. Davinci DM6446开发攻略——linux-2.6.18移植

     TI DAVINCI 使用最新的内核是montavista linux-2.6.18,之前说过,国内很多公司,包括开发板的软件包,一直在使用montavista linux-2.6.10,这个版本准 ...

  5. Davinci DM6446开发攻略——DSP开发工程建立

    前段时间一直忙一个项目,同时在生活上时时提防和抵抗中国地沟油.国外核心转基因调和油.大豆油.色拉油.大米玉米.可怕的喂药鱼.药水泡农药喷无虫咬的青菜,所以没时间打理自己的博客,让开发攻略停顿了一段时间 ...

  6. 【DM8168学习笔记1】帮您快速入门 TI 的 Codec Engine

    http://www.ti.com.cn/general/cn/docs/gencontent.tsp?contentId=61575 德州仪器半导体技术(上海)有限公司 通用DSP 技术应用工程师 ...

  7. TI Davinci DM6446开发攻略——根文件系统的裁剪和移植

    一.补充文件系统知识 Linux根文件系统是存放tool软件.lib文件.script(脚本).配置文件.其他特殊文件.自己开发的应用程序的地方.嵌入式linux的根文件系统rootfs就像windo ...

  8. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写

      很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-bo ...

  9. Davinci DM6446开发攻略——u-boot-1.3.4移植(1)

    UBOOT的版本更新速度比较快,截止今天,稳定正式的版本是u-boot-2009.11-rc2,而TI最新的EVM开发包里的UBOOT是1.2.0版本,国内很多公司还一直使用u-boot-1.1.4和 ...

随机推荐

  1. 【PHP】 PHPqrCode二维码类库使用方法

    1.首先去官网下载PHPqrCode库文件,只需要里面的phpqrcode.php文件,下载地址:http://phpqrcode.sourceforge.net 2.二维码生成实例代码: <? ...

  2. 一行代码搭建 Python 静态服务器

    如果电脑上安装有Python, 那么进入到目标文件夹,在终端中运行如下命令, 即可搭建映射当前目录的静态文件服务器: python -m SimpleHTTPServer 9000 默认端口号是800 ...

  3. ansible 批量安装zabbix agentd客户端

    目录结构 # tree /etc/ansible/ /etc/ansible/ ├── ansible.cfg ├── hosts ├── roles │   └── zabbix-agentd │  ...

  4. 解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE

    问题 如下: 2017-07-16 08:50:57.436  INFO 13524 --- [           main] c.p.p.web.PointshopWebApplication   ...

  5. HTML核心标签之表格标签(二)

    基本用法: <ul type="cir"> <li>显示数据</li> <li>显示数据</li> </ul> ...

  6. SSD trim及4k对齐

    trim可以帮助减小SSD的写放大WA问题,删除文件后不仅仅是将文件标记为删除,而是在SSD空闲的时候统一进行删除. Linux下的trim支持叫discard,修改fstab文件,在挂载参数中加上d ...

  7. BZOJ 3669: [Noi2014]魔法森林 [LCT Kruskal | SPFA]

    题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,…,n,边标号为 1,2,3,…, ...

  8. vue2.0路由进阶

    一.路由的模式 第一种用history方式实现,HTML5使用window.history.pushState()实现路由的切换而不刷新页面. 第二种使用hash值的方式来实现. vue2.0两种都可 ...

  9. fatal error C1083:无法打开包括文件:“stdint.h”: No such file or directory解决方案

    stdint.h文件是C99的标准头文件,默认情况下VC是不支持的,所以在使用过程中肯定会碰到 "No such file or directory"的问题. 解决办法 1.从网盘 ...

  10. javascript 一些特殊的字符运算

    1.什么是 --> ? 这两个分开是很简单的两个运算符,比如--,一般表示自减,var i = 5;while(i){console.log(i--);},会打印出5,4,3,2,1: > ...