Davinci DM6446 Codec Engine雙核通信環境的搭建
根據前幾篇文章,一個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例子的目錄——e.g. 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 <target files> <XDCPATH> <XDCBUILDCFG>
target files: 指編譯產生的目標文件。可以通過命令腳本來指定要產生哪些目標文件;
XDCPTH: 編譯時所要查找的目錄;
XDCBUILDCFG: 由"config.bld"文件指定,包含了與平台有關的編譯指令。後麵細說。
以上命令模式可能在參數過多是很複雜,通常把它寫成shell腳本來運行。
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。
首先確保以下關鍵元素可以編譯通過:
編譯通不過的原因就是相關的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是談生意和項目合作、技術支持的,是為客戶服務的。寫技術文章,就是培養一種技術氛圍。技術氛圍是一個很廣泛的東西,沒有這種良好氛圍,科技就會發展很慢,浮躁急功近利的氛圍,隻有被動挨打,任人宰割。任何科技發明,科技創新,都需要良好的技術氛圍。學習別人先進的東西,總會沒錯的,否則浮躁急功近利,隻會變成實實在在的機器工人,而不是有思維、有創造力的人。
最後更新:2017-04-03 16:48:40
上一篇:
如何編譯linux第一個模塊 hellomod.ko
下一篇:
GM8180_gpio內核模塊調試
SQL優化器原理 - Join重排
【C/C++學院】(1)分支結構/熊貓燒香/自我刪除/switch/循環結構/break/contine/goto/遞歸
收藏!程序猿治愈係表白圖來了!
php實現驗證碼的識別(中級篇)
《Servlet、JSP和Spring MVC初學指南》——1.2 Servlet
C++麵試中string類的一種正確寫法
馬雲押寶量子計算,雲棲大會公告量子計算雲平台正式上線!
Android 打勾顯示輸入的密碼 --EditText與setTransformationMethod
java反射中getDeclaredMethods和getMethods的區別
Python學習筆記之淺拷貝和深拷貝