【原文:http://zjbintsystem.blog.51cto.com/964211/1199430】
在上篇介绍了DM3730
的开发环境,我们现在可以进入设计阶段了。再次声明:本人写这些文章只是给那些爱好DAVINCI
的朋友提供一些技术上的支持,缩短大家的学习的时间,让大家有更多剩余的时间做其他有益的事,本人确实没时间做到单个人技术支持,请理解,这年头大家都不容易。
本来想写x-laod
这方面的移植,但是发觉整个开发包比较复杂,东西很多,所以还是先把DVSDK4_03
的开发包介绍一下。毕竟DM3730
比DM6446DM642DM6437
等强大,1G
的COTEX-A8
更比DM6467T-500MHz
的ARM926EJS
强大多了,跑一些网络视频服务器应用软件非常适合!
1.1DVSDK4_03软件包及元素介绍
注意:DVSDK
每个软件包里边都有对应的docs
文件夹或者说明,要深入了解每个包的特性必须好好研究这些文档,包括文档里边提示到的网站链接,等等。
1.1.1 docs文件夹
我们要具体了解整个DVSDK4_03
,就必须认真读读TMS320DM3730_Software_Developers_Guide.pdf
,里边非常详细介绍整个DVSDK
的结构。而dvsdk_4_03_00_06_dm3730_Release_Notes.pdf
只是介绍这个DVSDK4_03
的特点。
1.1.2总的 Makefile和Rules.make
在/home/davinci/dm3730/dvsdk4_03
这个目录里,这个Makefile
文件告诉你如何编译整个开发包各个元素,而Rules.make
里边脚本定义很重要的各个元素所处的路径、名字。使用在/home/davinci/dm3730/dvsdk4_03
目录下直接gedit
Makefile
和gedit Rules.make
看看就明白一切,这里特别指出,那些make xxxx_install
命令会把对应编译出来的*.ko
、cs.x64P
和应用程序COPY
到EXEC_DIR=/home/davinci/dm3730/dvsdk4_03/filesystem/dm3730rootfs/opt/dvsdk
的路径下,而对应的*.ko
(特别是cmemk.ko
,dsplinkk.ko
,lpm_omap3530.ko
,sdmak.ko
)会直接COPY
到/home/davinci/dm3730/dvsdk4_03/filesystem/dm3730rootfs/opt/dvsdk/dsp
的目录下,自动的,我们已经在总的Makefile
改好路径了。你在开发X-LAODER,U-BOOT,LINUX-2.6.32,DVSDK等等会发觉这个omap3530、omap3、OMAP34XX、或者omap3630类似名字,是因为DM3730的架构和它们类似,同一个家族的,TI
DM3730的软件开发都是在他们前身不断开发出来的,这一点搞得很乱。
1.1.3 build_dvsdk.sh
make cmem_clean
make cmem
make cmem_install
echo "......build sdma......"
read $CMDNAME
make sdma_clean
make sdma
make sdma_install
echo "......build dsplink......"
read $CMDNAME
make dsplink_clean
make dsplink
make dsplink_install
echo "......build lpm......"
read $CMDNAME
make lpm_clean
make lpm
make lpm_install
echo "......build c6run......"
read $CMDNAME
make c6run_clean
make c6run
make c6run_examples
#make c6run_install
echo "......build c6ccel......"
read $CMDNAME
make c6accel_clean
make c6accel
#make c6accel_install
echo "......build ceexamples......"
read $CMDNAME
make ceexamples_clean
make ceexamples
echo "......build codecs......"
read $CMDNAME
make codecs_clean
make codecs
make codecs_install
echo "......build dmai......"
read $CMDNAME
make dmai_clean
make dmai
#make dmai_install
make demos_clean
make demos
#make demos_install
这个文件是我们自己写的脚本,我们使用read $CMDNAME命令停顿一下,便于分析编译的正确性,回车往下继续编译。运行这个./build_dvsdk.sh之前,一定要先编译内核linux-2.6.32!就是说,如果你的linux-2.6.32
使用make
distclean
或make clean
等命令,或刚刚拿到我们的光盘安装,一定要先编译linux-2.6.32
,内核编译正常后,会在对应的目录生产很多临时文件,编译CMEM
等元素就会去读这些内核临时文件,才能往下编译。只要这个内核有这些临时文件,就可以编译CMEM
了,不需要每次都编译一次内核。编译内核方法后面再介绍。在总的Makefile
里边提到:
Linux àcmem àsdma àdsplink àlpm àc6run àc6accelàcodecs àdmai àdemos
上面的编译顺序是不能颠倒的。当然有些元素只需要编译一次,因为我们大部分开发是codecs
,dmai
, demos
,当然,你对这些元素使用clean
的命令或者全部使用clean_dvsdk.sh
,那就得按上面的顺序编译。这里为什么强调,是因为在做DM6446
的时候,很多人一直没有正常编译dmai
啊demos
啊,是因为他们根本没看手册,根本不了解这些元素的编译顺序。
build_codec.sh
和build_dmai.sh
是我们单独开发这两个元素的直观快捷编译脚本,执行这两个操作前提是你已经做了LINUX,CMEM,SDMA,DSPLINK,LPM,C6RUN,C6ACCEL
的编译了,打开看看就明白了。你可以像我们这样生成一些其他编译脚本,./xxxx.sh
,方便编译和操作。最笨的办法就是使用总Makefile
提示的make
xxxxx_clean make xxxxx make xxxxx_install
。
下面介绍DVSDK
元素包:
见TMS320DM3730_Software_Developers_Guide.pd
里第11
页,读懂这个框图就读懂整个DVSDK
的开发包的内在关系:
注意蓝 {MOD}标的元素是TI
自己开发的Software
。整个图从上到下逐层调用,有些直接调用DSP
,有些是需要中间件等等。
1.1.4 bin文件夹
这个是安装DVSDK4_03
的时候,用到的安装脚本,可以打开看看这些脚本理解,和编译无关。
1.1.5 biosutils_1_02_02文件夹
这个进去看看doc
文件夹里边的pdf
文件和release_notes.html
就可以了解,biao
相关LIB
,不需要我们单独编译和开发。
1.1.6 cgt6x_6_1_14
这个也不需要我们编译,但是是很重要的LIB
和编译工具;
1.1.7 dspbios_5_41_03_17
这个也不需要我们编译,dspbios
的重要性就不要详细说了,TI DSP
必备LIB
;
1.1.8 edma3lld_01_11_02_05
这个也不需要我们编译,NX
的人可以去修改对应的驱动;
1.1.9 framework-components_2_26_00_01
这个也不需要我们编译,NX
的人可以去修改对应的驱动;
1.1.10 xdais_6_26_01_03
这个就是被中国一些DSP
工程师称为万恶的XDAIS
算法接口,把中国很多只会使用CCS
调试程序的工程师搞得半死,很多人一直停留在DM642
这种单核的状态。其实多使用和研究透这个XDAIS
,就发觉TI
的良苦用心。本人改了xdais_6_26_01_03packages ixdaisdm
里边ividenc.h
进行ARM
传参数给DSP
和DSP
给ARM
传参数,还改了dmai_2_20_00_15packages isdodmaice
里边的Venc.c
和Venc.h
,然后在dvsdk-demos_4_02_00_01omap3530encode
例子capture.c
里举例如何在ARM
端调用DSP
的算法Venc_process()
。
1.1.11 xdctools_3_16_03_36
这个是整个DVSDK
的编译工具。
1.1.12★psp★
本公司使用u-boot-2010.06
和linux-2.6.32
内核,;
x-load-1.51
是支持NAND BOOT
的;
x-load-1.51-mmc
是我们自己改出来的版本,是支持SD
卡BOOT
的,适合生产和产品维修,使用这个编译的文件进行SD
卡BOOT
;
user_app
是本公司开发的应用程序,有rs232
,rs485
,gpio
,软件watchdog
,硬件hw_reboot
和VIDEO
的loopback
的例子;
注意:u-boot-2010.06-psp04.02.00.07.sdk
、linux-driver-examples-psp04.02.00.07
和linux-2.6.37-psp04.02.00.07.sdk
是TI
DVSDK4_03
安装的原始软件包,我们没有修改。
1.1.13★linuxutils_2_26_02_05★
编译这个cmem
和sdma
元素之前,必须先编译内核linux-2.6.32
;
1.1.14★dsplink_1_65_01_05_eng★
得到dsplink.ko
文件,非常重要;
1.1.15★local-power-manager_1_24_03_10_eng★
这个元素是OMAP
系列电源管理驱动,低功耗芯片特有的驱动。
1.1.16★c6run_0_98_03_03文件夹★
这个是一个重要的元素,你开发demos
的时候用到,见TMS320DM3730_Software_Developers_Guide.pd
里第16
页。
1.1.17★c6accel_1_01_00_07文件夹★
这个是一个重要的元素,你开发demos
的时候用到,见TMS320DM3730_Software_Developers_Guide.pd
里第18
页。c6accel_1_01_00_07dsplibs
里边有很多优化的LIB
,适合图像处理和分析。这个东西非常有用,包括DM8168
和DM8148
这些平台的软件都有这个东西。c6accel_1_01_00_07dsplibs
里边的C64P_LIBPLUS.lib
、fastrts64x.lib
、IQmath_c64x+.lib
、IQmath_RAM_c64x+.lib
、vlib.l64p
等等,凡是深入做过DSP
算法的工程师对这些TI
优化的LIB
肯定不陌生,以前开发DM6446
是没有这些好东西的。c6accel_1_01_00_07dspalg
提供算法的例子,按照CCS
工程的模式管理,TI
是照顾一下那些在CCS
上开发算法的工程师的感受。
1.1.18★codec-engine_2_26_02_11 ★
Codecengine
是TI DAVINCI
双核的核心思想,codec-engine_2_26_02_11packages isdoce
里边有很多算法接口,比DM6446
多了一个vidanalytics
,设计到图像分析LIB
;
1.1.19★codecs-omap3530_4_02_00_00 ★
这个codecs-omap3530_4_02_00_00
是属于codec-engine
的一个特例,里边有很多好东西,比如packages isdocodecs
里边的h264enc
,h264dec
,jpegenc
,g711enc
。ty_video_copy
是本公司的一个算法例子,是客户学习如何添加自己的算法的好例子。packages isdoservercs
就是DSP
SERVER
的配置,我们对MEM
等做了修改,注意里边的相关脚本文件。
至于CODECS
机制的原理,以前在DM6446
开发攻略已经介绍到,里边提到几个pdf
文档(
sprued5.pdf、sprued6.pdf、spruec8.pdf、sprue67.pdf、spraae7.pdf)
,TMS320
DSPAlgorithm Standard
算法标准提到的:SPRU352.pdf
、SPRU360.pdf
、SPRU361.pdf
、spru424.pdf
估计也没有人去下载看,这个spraae7.pdf文档还提到一个CODEC
机制的例子spraae7b.zip
。要想成为骨灰级双核算法工程师入门,这些都需要好好看看。当然,我们给客户做的板子一般都提供一个ty_video_copy
例子,包括内存申请。很多人问在这个CODECS
机制里DSP
算法能不能使用malloc
申请内存,我们说这是可以,它指向dvsdk4_03codecs-omap3530_4_02_00_00packages isdoservercsserver.tcf
里的定义的bios.DDR2.heapSize
= 0x500000
(TI
默认很小才128K
,所以你malloc
大于128K
就崩溃了),而DDR2
的段在memmap.tci
定义。不过大的空间申请TI
不建议这样使用。
1.1.20★dmai_2_20_00_15★
这个是一个重要的元素,你开发demos
的时候用到,见TMS320DM3730_Software_Developers_Guide.pd
里第20
页。里边packages isdodmaiapps
有很多如何直接在ARM
调用DSP
的例子,我们个dmai
是使用TI
DVSDK4_02
的,和我们内核linux-2.6.32
配合,注意如果你要编译dmaiappsvideo_encode_io
的例子,就必须使用dmaice
目录下的Venc_org.c_bk
和Venc_org.h_bk
(记得改回名字Venc.c
和Venc.h
),而当前Venc.c
和Venc.h
被我们修改过满足从ARM
端传输参数给DSP
了,和encode
例子配合的,更完美。
1.1.21★dvsdk-demos_4_02_00_01★
encode
是进行H264 encode
的D1
例子,可以D1 encode
和音频输入G711
encode
,带显示输出;
decode
可以进行H264 DECODE
和G711 DECODE
;
edge_detection
是一个如何使用c6accel
的例子,如何使用VLIB
;
1.1.23★filesystem★
DM3730
的文件系统,包括NFS
文件系统和对应生成ubifs
的工具;
1.1.24 dvtb_4_20_18
这个也是一个CODEC
应用的特例。
1.1.25 example-applications
有关matrix-gui-e-1.3
的开发包;
1.1.26 graphics-sdk_4.03.00.02
有关图像显示的开发包,没认真研究,可以看看readme.txt
;
1.1.27 gstreamer-ti_svnr919
一个很有用的东西,这里没时间研究,请看看TMS320DM3730_Software_Developers_Guide.pd
里第23
页。网上也有网友写过这东西,GOOGLE
和度娘一下。
总的来说,dvsdk-demos_4_02_00_01
里边的例子就是LINUX
的上层应用软件,而DMAI
是中间件,也是LINUX
深一层的应用程序,是上层应用软件通过DMAI
调用codec-engine、dsplink、framework的等元素。其实双核就是ARM
是HOST
,而DSP
只是一个屏蔽的外围设备,ARM
端通过初始化和调用一个函数就可以访问DSP
了,DSP
处理的结果就放到共享内存里供ARM
使用。
总结:
TI
的DSP
是个强大的好东西,特别非常适合自己开发算法的中国工程师(当然绝大部分算法都是COPY
移植过来的),因为编程灵活,支持C
语言,开发成本非常低(相对FPGA
)。在嵌入式领域,处理数字信号算法等等,目前COTEX-A15
1.4G
都跑不赢800MHz
的C64+
。当然支持浮点的C674X
和C66X
系列DSP
就更恐怖了。跟我们桐烨科技合作的一些博导,对这方面感触非常深。其实,应用TI DSP
,他们还没有完全达到骨灰级的水平,因为很多片上资源和优化LIB
都没用上。在DAVINCI
开发领域,前合众达深圳总经理老刘是这样认为:中国的高手相当少,基本都是二流水平(本人连二流都不算,呵呵,所以在这里献丑了)。
(声明:
桐烨科技DM3730/DM6446的板子和其他公司的开发板不一样,特别是DM3730的板子,目前国内好多家公司都只提供ARM端(CORTEX-A8)的应用例子,很少介绍如何添加客户自己的算法到DSP端的例子,有些需要做DSP算法的人贪便宜,结果买这些便宜的板子回去花大量时间来学习,迟迟搞不清楚整个架构,浪费的这些时间难道不是资金吗?我们桐烨科技的板子都帮你采集好YUV格式的视频图像,并教会你如何把这个原始的图像数据放到DSP端进行处理,然后再教会你如何传处理过的图像数据和参数到ARM端。同时提醒客户还要注意一些冒牌的公司,特别是杭州有家没道德的公司直接拿我们桐烨科技的DM3730开发板图片放到他们公司网站上,欺骗其他人,我们桐烨科技从来没有想到让其他公司做代理。
)
本文出自 “
集成系统-踏上文明的征程” 博客,请务必保留此出处
http://zjbintsystem.blog.51cto.com/964211/1199430