DAVINCI DM3730开发攻略——DVSDK4_03和双核CODEC机制介绍
在上篇介紹了DM3730的開發環境,我們現在可以進入設計階段了。再次聲明:本人寫這些文章只是給那些愛好DAVINCI的朋友提供一些技術上的支持,縮短大家的學習的時間,讓大家有更多剩余的時間做其他有益的事,本人確實沒時間做到單個人技術支持,請理解,這年頭大家都不容易。
本來想寫x-laod這方面的移植,但是發覺整個開發包比較復雜,東西很多,所以還是先把DVSDK4_03的開發包介紹一下。畢竟DM3730比DM6446\DM642\DM6437等強大,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的開發包的內在關系:
注意藍色標的元素是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_03\packages\ti\xdais\dm里邊ividenc.h進行ARM傳參數給DSP和DSP給ARM傳參數,還改了dmai_2_20_00_15\packages\ti\sdo\dmai\ce里邊的Venc.c和Venc.h,然后在dvsdk-demos_4_02_00_01\omap3530\encode例子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_07\dsp\libs里邊有很多優化的LIB,適合圖像處理和分析。這個東西非常有用,包括DM8168和DM8148這些平臺的軟件都有這個東西。c6accel_1_01_00_07\dsp\libs里邊的C64P_LIBPLUS.lib、fastrts64x.lib、IQmath_c64x+.lib、IQmath_RAM_c64x+.lib、vlib.l64p等等,凡是深入做過DSP算法的工程師對這些TI 優化的LIB肯定不陌生,以前開發DM6446是沒有這些好東西的。c6accel_1_01_00_07\dsp\alg提供算法的例子,按照CCS工程的模式管理,TI是照顧一下那些在CCS上開發算法的工程師的感受。
1.1.18★codec-engine_2_26_02_11 ★
? Codecengine是TI DAVINCI雙核的核心思想,codec-engine_2_26_02_11\packages\ti\sdo\ce里邊有很多算法接口,比DM6446多了一個vidanalytics,設計到圖像分析LIB;
1.1.19★codecs-omap3530_4_02_00_00 ★
這個codecs-omap3530_4_02_00_00是屬于codec-engine的一個特例,里邊有很多好東西,比如packages\ti\sdo\codecs 里邊的h264enc,h264dec ,jpegenc,g711enc。ty_video_copy是本公司的一個算法例子,是客戶學習如何添加自己的算法的好例子。packages\ti\sdo\server\cs就是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_03\codecs-omap3530_4_02_00_00\packages\ti\sdo\server\cs\server.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\ti\sdo\dmai\apps有很多如何直接在ARM調用DSP的例子,我們個dmai是使用TI DVSDK4_02的,和我們內核linux-2.6.32配合,注意如果你要編譯dmai\apps\video_encode_io的例子,就必須使用dmai\ce目錄下的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開發板圖片放到他們公司網站上,欺騙其他人,我們桐燁科技從來沒有想到讓其他公司做代理。
)
總結
以上是生活随笔為你收集整理的DAVINCI DM3730开发攻略——DVSDK4_03和双核CODEC机制介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: buck拓扑原理及仿真
- 下一篇: C#控件数组实现