关于TI 的RTSC wizard 介绍请查看TI 官方网站上的RTSC Codec Package Wizard FAQ 介绍,还有一个是Server 的,先介绍codec wizard 的使用。
首先设置XDCPATH 变量 ,用到xdc 时会从这些目录找到对应工具与package.
exportXDCPATH="/home/newton/dvsdk_3_00_02_44/ceutils_1.06/packages;/home/newton/dvsdk_3_00_02_44/codec_engine_2_24/packages;/home/newton/dvsdk_3_00_02_44/codec_engine_2_24/examples/ti/sdo/ce/examples;/home/newton/dvsdk_3_00_02_44/xdais_6_24/packages;/home/newton/dvsdk_3_00_02_44/bios_5_33_06/packages;/home/newton/dvsdk_3_00_02_44/dsplink_1_61_03/packages;/home/newton/dvsdk_3_00_02_44/biosutils_1_01_00/packages;/home/newton/dvsdk_3_00_02_44/framework_components_2_24/packages;/home/newton/workspace/RTSC/fkrtsc_wizard"
有些可能是多余的,但是多了总比少了好,呵呵。
开始工作了, xs ti.sdo.codecutils.genpackage -g ,运行向导,如果提示 package not found 肯定是前面的 XDCPATH 设置有问题。
Step 1: 如图 1 所示
Package Name 是包名,完成之后会在 repository, 也就是最后一项的路径下面产生 wenxin/omap3530/codecs/viddec_copy 目录, viddec_copy 为 base directory,repository 就称为库名吧。
Module: 模块名,会生成 VIDDEC_COPY.xdc
Version: 版本号
Codec Class: 编解器类型,跟 XDCPATH 有关 ( 这里新版本 DVSDK 最好设置为 video2.IVIDEC2)
Instruction Set Architecture: 设置指令集类型,我想用在 Omap3530 上,就选 v5T 了。
Create ce content: 是否产生 CE 子目录, TI 是这样解释的: If this box is checked, the wizard will generate Codec Engine specific content, which includes a ce directory with
four files(package.bld, package.xdc, MODULE.xs, and MODULE.xdc). If unchecked, the wizard will only generate
the base package content.
所以我选上了 。
Step2: 如图 2 所示
watermark: 决定是产生 production 还是 evaluation 。如果要产生 evaluation ,则为 true, 并且双击 Library, 添加 evalution library 。
Step3: 如图 3 所示
添加必要文件和文件夹,我是按照那个 ceutils 里面的那个例子来的,添加了两个文件和两个文件夹。
Step4: 如图 4 所示
是一些工具目录,前两项默认就可以了, nm6x 设置 dvsdk_3_00_02_44/cg6_0/bin/nm6x
它会查询前面那个库的一些属性。
Step5: 如图 5 所示:
这里需要进行一些配置,我注意到如果前面的第四步没有设置 nm6x, 则这一步不会自动出现 ialgFxns 为 VIDDECCOPY_TI_IALG. 并且这里的设置会出现在 ce 目录下的 VIDDEC_COPY.xdc 文件里。
Step6: 如图 6 所示
这一步的作用是产生 link.xdt, 我没发法编辑,最后手动修改了。
这是最后产生的文件:
剩下的最后一步是打包了,新建一个 config.bld :
var remarks = " " +
"-pden " + // enumerate remarks
"-pds=681 " + // call cannot be inlined
"-pds=452 " + // long long type is not standard
"-pds=195 " + // zero used for undefined preprocessing id (setjmp.h)
"";
var C64P = xdc.useModule('ti.targets.C64P');
C64P.platform = "ti.platforms.evmDM6446";
C64P.ccOpts.prefix += " --no_compress --mem_model:data=far --disable:sploop " + remarks;
C64P.rootDir = "/home/newton/dvsdk_3_00_02_44/cg6_0";
/*
* ======== Linux host target ========
*/
var Linux86 = xdc.useModule('gnu.targets.Linux86');
Linux86.lnkOpts.suffix = "-lpthread " + Linux86.lnkOpts.suffix;
Linux86.rootDir = "/usr";
Linux86.ccOpts.prefix += " -Wall";
Linux86.includeOpts += " -isystem /usr/lib/gcc/i486-linux-gnu/4.3.3/include ";
var MVArm9 = xdc.useModule('gnu.targets.arm.GCArmv5T');
MVArm9.ccOpts.prefix += " "
+ "-Wall "
+ "-fno-strict-aliasing "
;
MVArm9.platform = "ti.platforms.evm3530";
MVArm9.LONGNAME = "bin/arm-none-linux-gnueabi-gcc";
MVArm9.rootDir = "/home/newton/toolchain/arm-2008q1";
MVArm9.lnkOpts.suffix = MVArm9.lnkOpts.suffix.replace("-lstdc++", "");
MVArm9.lnkOpts.suffix = "-lpthread " + MVArm9.lnkOpts.suffix;
/* add search path for DaVinci lsp driver header files */
MVArm9.includeOpts = "-isystem /home/newton/workdir/opt/linux-2.6.28-omap/include " + MVArm9.includeOpts;
/*
* ======== Pkg.attrs.profile ========
*/
Pkg.attrs.profile = "release";
/*
* ======== Pkg.libTemplate ========
* Set default library version template to be used by all packages
*/
Pkg.libTemplate = "ti/sdo/ce/utils/libvers.xdt";
/*
* ======== Build.targets ========
* list of targets (ISAs + compilers) to build for
*/
Build.targets = [
C64P,
MVArm9
];
var paths = [];
paths["EXEC_DIR"]="/home/user/workdir/filesys/opt/workshop";
这个是参照 workshop 里面的 config.bld 修改的,设置了 targets,platform,rootDir
最后执行 XDCBUILDCFG=../../../../config.bld xdc release -PR . 注意 -PR 与- PD 的区别,- PR 会递归打包,比如本例子中的 ce 里面也会打包,如果是- PD 只是在那个路径下打包和所依赖的包。 Xdc –help 可以看下帮助,另外注意最后一个 '.' 不要忘了,表示要打包的路径, '.' 代表当前路径。
至此 Codec 的步骤已经全部完成了,接着是第二个步骤, RTSC wizard server
输入命令 xs ti.sdo.codecutils.genserver -g
Codec Package Name: 这里是 codec 包名,就设置为之前创建的 codec package name, 如果忘了,可以在 package.xdc 中找到
Modeule Name: 模块名,会自动填充第一项 '.' 后面的内容,变成大写
platform: 我用的 Devkit8000 就选 ti.platforms.evm3530 了
Server Package Name: 这里是 server 包名,会根据第一项 codec package name 自动更改的
Repository: 这里是生成 server 的位置了,跟 codec 作用一样。
Ok 了,最后打包: XDCBUILDCFG = ../../../../config.bld xdc release -PD . 最后会生成 .X64P 文件,这就是我们最终想要得到的 DSP 可运行的可执行程序。
终于大功告成了,还有些 Warnning 可能是 link.xdt 没有设置,机子没法联网, 装一些包什么的特麻烦,下了一大堆东西还是没装上。
./ofd6x -xg --xml_indent=0 --obj_display=none,header,optheader --dwarf_display=none,dinfo /home/newton/workspace/RTSC/viddec_copy_unpackaged/lib/viddec_copy_eval.a64P | perl ../ofd/call_graph.pl
Can't locate XML/Simple.pm in @INC (@INC contains: /home/newton/dvsdk_3_00_02_44/cg_xml_v2_12_00/ofd /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at /home/newton/dvsdk_3_00_02_44/cg_xml_v2_12_00/ofd/XML_TI_OFD.pm line 519.
最后总结一些可能遇到的问题:
1.Undefined symbol VIDDECCOPY_TI_IALG
这个是链接错误,查看 will link with 看是否有那个 codec 里面的 lib 文件,如果没有修改一下 package.xs 里面的 getlibs() 函数
2.Undefined symbol VIDDEC_SKEL
基本上就是应该选择 viddeo2_VIDDEC2 的原因了,新版本的 DVSDK 导致的吧。也可能是 MOD.xdc 里面没加什么 inherit??