图像识别DM8127开发攻略 ——RDK软件架构浅析及编译
上上一篇文章《圖像識別DM8127開發(fā)攻略——開發(fā)環(huán)境搭建》介紹了DM8127的開發(fā)環(huán)境搭建,那么本篇開始描述整個IPNC RDK的架構(gòu),如果這個IPNC RDK都不熟悉,后面的移植工作基本無法進行下去,也無法深入學習和掌握DM8127的開發(fā)流程。要熟悉APPRO DM8127 軟件架構(gòu),先看IPNC_RDK_InstallGuide.pdf,然后再去看看RDK包里Collaterals文件目錄下的兩個重要文件:IPNC_RDK_McFW_UserGuide.pdf和IPNC_RDK_Application_DesignGuide.pdf,我們下面的介紹會提到這些文件里面的內(nèi)容。
IPNC_RDK里面的軟件包Source文件夾內(nèi)容,這里還是以截圖的方式去了解DM8127的軟件架構(gòu)更合適。
上圖是RDK軟件包最核心的東西,ipnc_rdk和ti_tools。
其中ipnc_rdk主要有4個文件夾,以及最重要的總Makefile和總的Rules.make,那些build_xx_xx.sh腳本是本人自己加的。
而ti_tools目錄下有很多TI 的工具包,見下圖:
一、ti_tools介紹
我們先介紹ti_tools,這里面是TI 提供的很多編譯工具包和LIB文件,
1、 其中:ipnc_psp_arago存放了我們需要移植的u-boot(u-boot-2010.06)和kernel(linux-2.6.37)源碼。u-boot的編譯和移植,kernel的編譯和移植后面的文章再介紹。這個文件夾下面還有個docs的文件夾,里面有很多和驅(qū)動移植有關(guān)文檔。
2、iss_03_80_00_00:也是需要移植的軟件包,所有調(diào)試CMOS SENSOR驅(qū)動(比如添加一款新的SONY IMX、OV、ON等CMOS SENSOR)都需要在這個軟件包里面去調(diào)試,包括LVDS接口采集RAW DATA,并行口驅(qū)動采集RAW DATA,BT656接口采集YUV422 DATA,BT1120接口采集YC DATA啊等等,還有CMOS 2A(自動白平衡,自動曝光)算法,降噪處理,都在這個iss_03_80_00_00目錄下去移植調(diào)試,重點去看iss_03_80_00_00/packages/ti/psp/目錄下的源碼,這個和以前的DM6446啊,DM3730啊在內(nèi)核添加的V4L2這些驅(qū)動做法完全不一樣了。DM8127跟DM8147-8148-8168的差別就在這個iss模塊,DM8127帶有ISP功能,可以接RAW DATA格式的CMOS。?
3、Linux_devkit是DM8127平臺的ARM交叉編譯工具,APPRO集成在這個ti_tools里面來了。
4、其他ti_tools軟件包都是現(xiàn)成的LIB 或者DSP編譯工具,兩個ARM CORTEX-M3核的編譯工具也在這里,這些工具不需要我們?nèi)ヒ浦查_發(fā),大家可以進到對應(yīng)的文件夾里面去了解。
二、ipnc_rdk介紹
1、ipnc_rdk/ipnc_app目錄下:
上圖里面的都是最上層的linux app應(yīng)用程序,其中ty_app是本人自己添加的,里面有自己寫的gpio應(yīng)用程序,rs232測試程序,rs485測試程序,等等,其他的APP介紹可以看看IPNC_RDK_Application_DesignGuide.pdf,里面有詳細的描述。DM8127 RDK運行DEMO程序的時候,一般是先從sys_server源碼開始運行的,我們不妨從NFS 文件系統(tǒng)即ipnc_rdk/target/filesys/etc/init.d/finish_ubifs.sh的腳本了解:
cd /opt/ipnc
./init.sh
./system_server
sleep 7
./autorun_ipnc.sh
執(zhí)行system_server就是執(zhí)行sys_server編譯的應(yīng)用程序。
其他的web服務(wù)器程序,network程序(包括大家非常熟悉的boa和live555)這種常用的應(yīng)用程序就不要介紹了,一看就明白這些功能,運行system_server的時候也可以同時運行這些應(yīng)用程序,就在autorun_ipnc.sh里面執(zhí)行。
2、 target目錄
這個目錄下的filesys就是我們開發(fā)的時候使用的NFS文件系統(tǒng),在上上一篇《圖像識別DM8127——開發(fā)環(huán)境搭建》有介紹。
3、 tftp
這個文件我們沒有用到,也可以當作一個臨時保存BIN文件的文件夾。而我們的TFTP SERVER放在linux ubuntu主機/tftpboot目錄下。
4、 最重點的ipnc_mcfw
Mcfw: Multi Channel Framework多通道幀同步工作機制,我們要配合IPNC_RDK_McFW_UserGuide.pdf一起分析這個mcfw,主要是掌握視頻數(shù)據(jù)流是如何在VPSS CORTEX-M3, VIDEO CORTEX-M3, CORTEX-A8 還有C674X DSP四個核之間是如何同步工作的;?
A、ipnc_mcfw/bin?
ipnc_mcfw/bin/ti814x里面有編譯mcfw模塊出來的對應(yīng)的一些可執(zhí)行文件,LIB,驅(qū)動文件KO,另外scripts有對應(yīng)的運行腳本,大家可以進去看看就明白了。這編譯得到的可執(zhí)行文件,LIB,驅(qū)動文件KO, scripts里面的運行腳本,還有init.sh腳本都會COPY到NFS文件系統(tǒng)target/filesys/opt/ipnc目錄下,后面編譯描述會提到。
B、ipnc_mcfw/build
這個文件夾存放了編譯mcfw大部分的臨時文件,.obj文件,還有一些LIB文件,驅(qū)動臨時文件。4個核編譯的臨時文件都放在這個目錄下,這樣管理本人比較喜歡,不像UBOOT和KERNEL這些編譯的臨時文件都放在同樣的文件下面,不好備份。
C、ipnc_mcfw/demos/
重點看mcfw_api_demos/ multich_usecase和stream文件夾下面的源碼,這些都是IPNC DEMO的應(yīng)用程序。
D、ipnc_mcfw/makerules/
四個核的編譯規(guī)則級編譯腳本,非常重要,本人花了一些時間去研究這4個核是如何編譯的,還有在DSP端移植C++算法的時候,是如何支持.cpp源文件編譯,都需要在這些腳本下面修改,怕修改錯就先bk備份一下再修改,這些編譯規(guī)則腳本有些參數(shù)看不懂,可以看看同一個目錄下的docs文件夾的makerules_spec.doc。
E、ipnc_mcfw/mcfw
整個DM8127 RDK 最有用的核心部分就是這個mcfw了。4個核配合工作的源碼,其中M3 VPSS、M3 VIDEO和C674X DSP都是使用BIOS編譯,所以他們的代碼都放在src_bios6,而CORTEX-A8 放在src_linux里面。比如自己添加DSP算法可以放到links_c6xdsp/alg目錄下,要在M3 VPSS做一些CMOS SENSOR前端采集的程序可以在links_m3vpss處理,要在H264壓縮和解碼之前做一些代碼移植可以進到M3 VIDEO,即 links_m3video目錄下去工作,比如我們在M3 VPSS核添加自己公司(ty)的任務(wù):links_m3vpss/tyLink/tyLink_tsk.c和tyLink_priv.h,然后修改上一級目錄的SRC_FILES.MK讓tyLink_tsk.c被編譯到。而links_common里面的源碼是可以被DSP核,M3 VPSS核,M3 VIDEO核共用,這個需要注意。網(wǎng)上已經(jīng)有一篇其他網(wǎng)友的文章如何在這個mcfw目錄下去添加DSP 端運行算法的例子(http://blog.csdn.net/guo8113/article/details/20149191),那篇文章主要在DM8148/DM8168平臺上實現(xiàn)的,其實和DM8127完全一樣,可以直接借鑒。還有一種直接使用TI?現(xiàn)成的links_common/null/nullLink_tsk.c基礎(chǔ)上去添加DSP接口,讓nullLink_tsk.c被DSP 單獨編譯,而不是作為M3 的程序去編譯,然后去src_linux/mcfw_api/usecases/xxxx.c去System_linkCreate()這個任務(wù)就可以了。
我們可以使用下面這個圖更深入了解:
上圖就是一個很經(jīng)典的視頻數(shù)據(jù)流的在4個核之間的通信,
A)、首先 從CMOS SENSOR采集到1080P的RAW DATA圖像數(shù)據(jù),在M3 VPSS這個核建立CAMERA LINK,去處理圖像數(shù)據(jù),先把RGB格式轉(zhuǎn)換成YUV格式;
B)、然后ISS使用兩個Resizer,即Resizer A和Resizer B,對YUV格式再進一步處理,Resizer-A把1080P的數(shù)據(jù)轉(zhuǎn)換成YUV420SP(Y分量獨立保存,UV交叉獨立保存),統(tǒng)一保存到dup[0]這個緩存隊列(其實就是一大塊獨立的內(nèi)存空間);Resizer-B也在對初始的YUV格式進行Resizer縮小成720480這個標清圖像,也是YUV420SP(Y分量獨立保存,UV交叉獨立保存),并且統(tǒng)一保存到dup[1]另外一個獨立的緩存隊列,和上面的dup[0]是分開的。也就是說,dup[0]的1080P 數(shù)據(jù)拿去M3 VIDEO 核去H264編碼,dup[1]的720480數(shù)據(jù)拿去給DSP核 做視頻分析。
C)、通過一種link機制,M3 VPSS 核輸出數(shù)據(jù)給M3 VIDEO核,M3 VIDEO核拿到dup[0]的數(shù)據(jù)(其實就是一個指針隊列,共享內(nèi)存方式),再進行H264編碼,與此同時也通過link機制,把dup[0]數(shù)據(jù)直接輸出給HDMI接口。另外一條數(shù)據(jù)dup[1]通過link機制,把指針傳給DSP TSK,比如我們使用nullLink_tsk.c這種接口去調(diào)用我們的算法,或者通過link機制把標清720*480輸出到CVBS接口進行display,當然CVBS的格式是YUV422,這點需要注意。
D)、Dup[0]的數(shù)據(jù)經(jīng)過H264 Enc編碼后,以BIT流的方式,通過link機制,傳給CORTEX-A8,那么A8運行的應(yīng)用程序,比如live555就可以拿到這個bit流進行WEB播放。
有關(guān)上面提到的link機制,需要去看TI MCFW的用戶手冊,配合程序來分析??傊斫馔晟蠄D的講解,應(yīng)該對DM8127 MCFW的架構(gòu)有初步的了解,而不是滿頭霧水。本人能力一般,剛拿到APPRO 板子的時候,也不知如何去學習,即使看了很多遍那一大堆文檔,還是沒有掌握上圖的精髓,然后就是去搞大客戶的產(chǎn)品設(shè)計,這一塊就暫停了。后來有時間,配合程序分析,經(jīng)過高人蜻蜓點水講解,才對這個MCFW的數(shù)據(jù)流有了很好的認識,特別是高薪招了一個做過DM385的項目經(jīng)理,他對這個mcfw和相關(guān)link機制比較熟悉,幫本人解決了很多問題,我們相互配合,很快就把以前DM3730的視頻分析算法移植過來了,而且跑得還比較穩(wěn)定,算法運行效率當然比DM3730 定點DSP高多了,DM8127 浮點DSP就是好,很多浮點運算根本不要考慮優(yōu)化,整個浮點DSP就專門跑視頻分析算法,把分析出來的目標坐標和其他參數(shù)傳出來給其他核就OK了,根本不用去做多余的任務(wù)。
三、總的Rules.make和Makefile介紹
ipnc_rdk/Rules.make和ipnc_rdk/Makefile是整個RDK軟件包的最重要的編譯腳本,必須要吃透。
1、我們先介紹Rules.make:
SYSTEM_PLATFORM := IPNC (APPRO IPNC_RDK是針對高清網(wǎng)絡(luò)攝像機產(chǎn)品來設(shè)計的,而不是 DM8148那種TI 自己開發(fā)板的EVM開發(fā)包)
APP_BUILD_CFG := release (表示編譯RDK的時候是編譯的程序是產(chǎn)品release模式,可以去掉很多調(diào)試信息,如果使用debug則表示在編程編譯調(diào)試運行的時候需要)
BINARY_MODE := nand (表示編譯的uboot min是NAND FLASH模式,編譯出來的uboot min和uboot是要燒寫到NAND里面去的。如果是:=sd表示編譯的uboot min是MLO文件,放到SD卡里面,用在工廠生產(chǎn)和NAND 無程序時候調(diào)試用)
IPNC_DEVICE := DM8127 (選擇DM8127平臺,這個RDK當然也支持DM385和DM388不帶DSP的平臺)
IPNC_CONFIG := FULL_FEATURE (我們使用DSP 而且是必須CORETEX-A8 跑1G頻率,DSP 跑750MHz的模式)
MEMORY_CONFIG := 512MB (我們桐燁科技DM8127核心板使用512MB 字節(jié)的DDR3內(nèi)存,256MB根本不夠,因為我們帶DSP)
MTD_UTILS_MODE := 32bit (這個針對ipnc_rdk / target/ mtd-utils的編譯問題,如何你的linux開發(fā)主機是64bit的,則這里選擇64bit,我們這里的虛擬機還是使用32bit,所以這里選擇32bit,不要搞錯)
IMGS_ID := IMGS_MICRON_AR0330 (這里打個比方,你如果使用便宜的AR0330 200萬CMOS SENSOR,這里就定義這個宏定義,RDK里面的源碼一些頭文件需要加入這個宏定義,iss模塊里面到時候會去編譯iss_03_80_00_00/packages/ti/psp/devices/ ar0330相關(guān)驅(qū)動)
WDR_ON := YES (如果你的CMOS SENSOR支持寬動態(tài),使能這個)
LOW_POWER_OPP100_MODE := NO (這個選擇NO表示電源管理模式使用全速 ,非低功耗,和上面的FULL_FEATURE類似,如果選擇YES,DM8127 CORTEX-A8 跑600M, DSP 跑500MHz)
AES_MODULE_MODE := OFF (表示編譯的RDK包里面的各種程序模塊是否需要采用AES加密方式發(fā)布)
BUILD_WARNINGS_AS_ERROR := NO(這里本公司選擇NO,是因為編譯RDK的時候,如果選擇YES,有些定義的變量沒有用到,編譯器會把這種warning認為是錯誤,停止往下編譯,很煩人)
CAPTURE_DISPLAY_MODE_ON := YES
RAMES_TO_A8 := NO
(這里就是用戶要使用什么模式去用這個IPNC RDK的程序,這里的選擇對應(yīng)src_linux/mcfw_api/usecases/multich_capturedisplay.c這個例子,支持這個IPNC設(shè)備實現(xiàn)采集CMOS SENSOR 1080P和1080P HDMI顯示輸出的例子)
其他全局編譯宏定義可以直接使用RDK默認的,另外需要注意的是那些路徑宏定義,很重要比如:
BASE_INSTALL_DIR := $(shell pwd)/..
#Defining the install base directory for IPNC RDK
IPNC_INSTALL_DIR := $(BASE_INSTALL_DIR)/ipnc_rdk
TOOLS_INSTALL_DIR := $(BASE_INSTALL_DIR)/ti_tools
#The directory that points to the Linux Support Package
lsp_PATH := $(TOOLS_INSTALL_DIR)/ipnc_psp_arago
KERNELDIR := $(lsp_PATH)/kernel
UBOOTDIR := $(lsp_PATH)/u-boot
#The directory that points to where filesystem is mounted
FILESYS_INSTALL_DIR := $(IPNC_INSTALL_DIR)/target
TARGET_FS := $(FILESYS_INSTALL_DIR)/filesys //NFS 文件系統(tǒng)路徑
TARGET_APP := $(FILESYS_INSTALL_DIR)/ipnc
TARGET_FS_DIR := $(TARGET_FS)
MTD_UTILS := $(FILESYS_INSTALL_DIR)/mtd-utils/$(MTD_UTILS_MODE)
#The directory that points IPNC RDK source code
MCFW_ROOT_PATH := $(IPNC_INSTALL_DIR)/ipnc_mcfw
IPNC_DIR := $(IPNC_INSTALL_DIR)/ipnc_app
#The directory to root file system
ROOT_FILE_SYS:= $(TARGET_FS)
#target filesystem.
EXEC_DIR:=$(TARGET_FS)/opt/ipnc //NFS 文件系統(tǒng)對應(yīng)可執(zhí)行文件保存路徑
Rules.make后面的那些定義看看就明白了,比較好理解,定義一些全局變量的路徑,和宏定義。
2、介紹總的Makefile
總的Makefile一開頭就先include 上面介紹的總的Rules.make和ipnc_mcfw/makerules/下的腳本。
然后下面有很多編譯模塊(目標),4個核的程序編譯都在這個總Makefile, 去定義編譯。每個模塊編譯都是:
Xxxx:
Xxxx_clean:
Xxxx_all:
模式
如果對一些腳本定義不是很了解,可以在Makefile里面插入:
比如:echo "Hardware Platform : $(IPNC_DEVICE) $(SYSTEM_PLATFORM)"
這種方式去打印編譯信息,注意echo前需要tab鍵。
總的Makefile 編譯需要結(jié)合IPNC_RDK_InstallGuide.pdf 這個文件來看。
其實一個總的:make sysall,就可以編譯完所要開發(fā)的各個模塊,但是開發(fā)的時候不可能都去make sysall,這樣太浪費時間了,根本不用去開發(fā)軟件了。我們只好把make sysall涉及到的模塊全部分開來編譯,這樣需要開發(fā)到哪個模塊再去編譯。make sysall 后面會把編譯得到的應(yīng)用程序啊,BIN文件啊,LIB等等COPY到NFS 文件系統(tǒng)對應(yīng)的文件夾,見:
fsupdate:
cp -R $(TARGET_MCFW_DIR)/?$(EXEC_DIR)/.
chmod 755 $(EXEC_DIR)/.sh
這里需要提到一個APPRO自己做的一個腳本,在編譯ipnc_app(即make app)的時候,會去執(zhí)行inpc_app/ root_filesys/Makefile,我們第一可以讓他執(zhí)行這個Makefile,見下圖,它會COPY對應(yīng)的文件到我們NFS文件系統(tǒng)對應(yīng)的文件夾。但是當我們調(diào)試NFS一些腳本的時候,做了修改,比如target/ filesys/etc/ init.d/ finish_ubifs.sh ,target/ filesys/opt/ipnc/init.sh等腳本修改,如果再執(zhí)行make sysall,如果不備份,又把我們修改好的NFS 文件系統(tǒng)的腳本內(nèi)容覆蓋,很討厭,這點要注意。我們是做了一次這個inpc_app/ root_filesys/Makefile,以后,直接把這個inpc_app/ root_filesys/Makefile里面的內(nèi)容屏蔽,后面就不需要多次重復(fù)覆蓋了,下圖就是inpc_app/ root_filesys/Makefile,執(zhí)行完一次就可以屏蔽里邊的install操作。
四、SDK編譯過程
上圖是本人根據(jù)總的Makefile,自己單獨做的編譯腳本,把各個模塊分離出來,這樣便于各個模塊開發(fā)編譯,編譯build加上1-2-3-4-5-6-7等數(shù)字,讓大家一目了然,知道整個RDK軟件要如何編譯開發(fā)。在上一篇《圖像識別DM8127開發(fā)攻略 ——板子啟動過程》已經(jīng)描述過DM8127的硬件啟動流程,這里編譯的流程也和那篇文章對應(yīng)。所有的這些build的腳本,都必須在上圖對應(yīng)路徑下編譯,也就是:
/home/davinci/dm8127/v3.8.0/Source/ipnc_rdk/
包括自己手動使用make xxxxx,都是在這個路徑下去執(zhí)行編譯。
build_1_uboot-min-nand.sh 腳本內(nèi)容:make ubootmin
就是編譯ubootmin,顧名思義,專門用來燒寫到NAND FLASH上的BIN文件。
對應(yīng)總的Makefile內(nèi)容是:
ubootmin:
$(MAKE) ubootclean
$(MAKE) ubootbuild MAKE_TARGET=$(PLATFORMCFG)$(SYSTEM_CFG)min$(BINARY_MODE)
$(MAKE) ubootbuild MAKE_TARGET=u-boot.ti
ifeq ($(BINARY_MODE),sd)
cp $(UBOOTDIR)/u-boot.min.$(BINARY_MODE) $(TFTP_HOME)/MLO
cp $(UBOOTDIR)/u-boot.min.$(BINARY_MODE) $(UBOOTDIR)/MLO
else
cp -f $(UBOOTDIR)/u-boot.min.$(BINARY_MODE) $(TFTP_HOME)/u-boot.min.$(BINARY_MODE)
cp -f $(UBOOTDIR)/u-boot.min.$(BINARY_MODE) $(UBOOTDIR)/u-boot.min.$(BINARY_MODE).bk
cp -f $(UBOOTDIR)/u-boot.min.$(BINARY_MODE) /tftpboot/dm8127_min.bin
endif
build_1_uboot-min-sd.sh 腳本內(nèi)容:make uboot_ty_sd
同時編譯ubootmin和uboot,只不過是編譯得到MLO和u-boot.bin文件,COPY 到SD卡里,使用SD卡BOOT板子。
對應(yīng)總的Makefile內(nèi)容是(自己添加修改的):
uboot_ty_sd:
$(MAKE) ubootclean
$(MAKE) ubootbuild MAKE_TARGET=$(PLATFORMCFG)$(SYSTEM_CFG)_min_sd
$(MAKE) ubootbuild MAKE_TARGET=u-boot.ti
cp -f $(UBOOTDIR)/u-boot.min.sd $(IPNC_INSTALL_DIR)/tftp/$(IPNC_DEVICE)/sd/MLO
cp -f $(UBOOTDIR)/u-boot.min.sd $(UBOOTDIR)/MLO
$(MAKE) ubootclean
$(MAKE) ubootbuild MAKE_TARGET=$(PLATFORMCFG)$(SYSTEM_CFG)_config_nand
$(MAKE) ubootbuild MAKE_TARGET=u-boot.ti
cp -f $(UBOOTDIR)/u-boot.bin $(IPNC_INSTALL_DIR)/tftp/$(IPNC_DEVICE)/sd/
build_2_uboot-all.sh 腳本內(nèi)容:make ubootbin
編譯uboot,得到dm8127_uboot.bin用于燒寫到NAND FLASH。
ubootbin:
$(MAKE) ubootclean
$(MAKE) ubootbuild MAKE_TARGET=$(PLATFORMCFG)$(SYSTEM_CFG)config$(BINARY_MODE)
$(MAKE) ubootbuild MAKE_TARGET=u-boot.ti
cp -f $(UBOOTDIR)/u-boot.bin $(TFTP_HOME)/u-boot.bin
cp -f $(UBOOTDIR)/u-boot.bin $(UBOOTDIR)/dm8127_uboot.bin.bk
cp -f $(UBOOTDIR)/u-boot.bin /tftpboot/dm8127_uboot.bin
build_2_uboot-tmp.sh 腳本內(nèi)容:make uboot_ty
也是編譯uboot,得到dm8127_uboot.bin用于燒寫到NAND FLASH。只不過用在移植開發(fā)UBOOT的時候,只修改某個.c或.h文件,這時編譯的時候,就沒必要再使用ubootclean把所有的OBJ清空再全部編譯一次,太耗時間。
對應(yīng)總的Makefile內(nèi)容是:
uboot_ty:
$(MAKE) ubootbuild MAKE_TARGET=$(PLATFORMCFG)$(SYSTEM_CFG)config$(BINARY_MODE)
$(MAKE) ubootbuild MAKE_TARGET=u-boot.ti
cp -f $(UBOOTDIR)/u-boot.bin $(TFTP_HOME)/u-boot.bin
cp -f $(UBOOTDIR)/u-boot.bin $(UBOOTDIR)/dm8127_uboot.bin.bk
cp -f $(UBOOTDIR)/u-boot.bin /tftpboot/dm8127_uboot.bin
build_3_kernel-menuconfig.sh 腳本內(nèi)容:make lspmenu
對應(yīng)總的Makefile內(nèi)容是:
lspbuild:
make -C$(KERNELDIR) ARCH=arm CROSS_COMPILE=$(BUILD_TOOL_PREFIX) $(MAKE_TARGET)
lspmenu:
make lspbuild MAKE_TARGET=menuconfig
這個熟悉的配置內(nèi)核選項的界面就不多說了。選擇某些功能和模塊后,save 配置文件,會在kernel這個文件夾下面得到.config文件,本人喜歡備份:
cp -f $(KERNELDIR)/.config $(KERNELDIR)/dm8127_2017xxxxaaa.config
然后再把這個備份文件覆蓋$(KERNELDIR)/arch/arm/configs/ti8148_ipnc_ubifs_defconfig這個文件:
cp -f $(KERNELDIR)/dm8127_2017xxxx.config $(KERNELDIR)/arch/arm/configs/ti8148_ipnc_ubifs_defconfig
后面的內(nèi)核編譯都是使用這個ti8148_ipnc_ubifs_defconfig配置文件。
build_3_kernel-all.sh 腳本內(nèi)容:make lsp_ty
對應(yīng)總的Makefile內(nèi)容是:
cmem:
make -C$(linuxutils_PATH)/packages/ti/sdo/linuxutils/cmem/src/interface \
LINUXKERNEL_INSTALL_DIR=$(KERNELDIR) MVTOOL_PREFIX=$(BUILD_TOOL_PREFIX)
make -C$(linuxutils_PATH)/packages/ti/sdo/linuxutils/cmem/src/module \
LINUXKERNEL_INSTALL_DIR=$(KERNELDIR) MVTOOL_PREFIX=$(BUILD_TOOL_PREFIX)
cmemclean:
make -C$(linuxutils_PATH)/packages/ti/sdo/linuxutils/cmem/src/module clean
make -C$(linuxutils_PATH)/packages/ti/sdo/linuxutils/cmem/src/interface clean
lspcfg:
make lspbuild MAKE_TARGET=$(PLATFORMCFG)$(SYSTEMCFG)$(FS_CFG)_defconfig
lsp:
cp $(linuxutils_PATH)/packages/ti/sdo/linuxutils/cmem/src/module/cmemk.o $(KERNELDIR)/drivers/char/
make lspcfg
make lspbuild MAKE_TARGET=uImage
make lspbuild MAKE_TARGET=modules
cp $(KERNELDIR)/arch/arm/boot/uImage $(TFTP_HOME)/uImage
cp $(KERNELDIR)/arch/arm/boot/uImage $(KERNELDIR)/dm8127_kernel.bin.bk(本人自己添加)
cp -f $(KERNELDIR)/arch/arm/boot/uImage /tftpboot/dm8127_kernel.bin(本人自己添加)
-mkdir -p $(TARGET_MCFW_DIR)/kermod
cp $(KERNELDIR)/drivers/video/ti81xx/vpss/vpss.ko $(TARGET_MCFW_DIR)/kermod/.
cp $(KERNELDIR)/drivers/video/ti81xx/ti81xxfb/ti81xxfb.ko $(TARGET_MCFW_DIR)/kermod/.
cp $(KERNELDIR)/drivers/video/ti81xx/ti81xxhdmi/ti81xxhdmi.ko $(TARGET_MCFW_DIR)/kermod/.
cp $(KERNELDIR)/drivers/usb/gadget/g_file_storage.ko $(EXEC_DIR)
cp $(KERNELDIR)/block/sbull/sbull.ko $(EXEC_DIR)
lspclean:?
make lspbuild MAKE_TARGET=distclean
lsp_ty:
#make binariesclean
make cmemclean
make lspclean
make lspcfg?
make -C $(KERNELDIR) ARCH=arm CROSS_COMPILE=$(BUILD_TOOL_PREFIX) prepare
make -C $(KERNELDIR) ARCH=arm CROSS_COMPILE=$(BUILD_TOOL_PREFIX) modules_prepare
make cmem
make lsp
從上面的腳本可以看出,編譯內(nèi)核之前,必須編譯cmem模塊(ARM+DSP最重要的共享內(nèi)存機制),這個和DM6446-DM3730一樣,只不過那些是獨立編譯的,內(nèi)核編譯也是獨立的,現(xiàn)在DM8127把這個cmem整合在一起編譯。還有內(nèi)核那些選項為(M)的驅(qū)動模塊,也整合在一個腳本編譯,然后把對應(yīng)的.ko文件COPY到對應(yīng)的路徑。還有注意一下,編譯kernel之前,必須先編譯好UBOOT,因為使用UBOOT里面一個image工具,如果uboot被clean完臨時文件,到這里編譯內(nèi)核最后步驟會通不過的。
build_3_kernel-tmp.sh 腳本內(nèi)容:make lsp
對應(yīng)總的Makefile內(nèi)容是:見上面描述。也就是編譯某個源文件,沒編譯又把整個內(nèi)核clean再重新編譯,太浪費自己的生命時間。
build_4_syslink.sh 腳本內(nèi)容:make syslinkall
對應(yīng)總的Makefile內(nèi)容是:
syslinkbuild:
cp $(MCFW_ROOT_PATH)/makerules/syslink_products.mak $(syslink_PATH)/products.mak
make -C$(syslink_PATH) $(TARGET)
syslink:
make syslinkbuild DEVICE=$(syslink_DEVICE) TARGET=syslink
-mkdir -p $(TARGET_MCFW_DIR)/kermod
cp $(syslink_OUT_DIR)/syslink.ko $(TARGET_MCFW_DIR)/kermod/.
syslinkclean:
make syslinkbuild DEVICE=$(syslink_DEVICE) TARGET=clean
syslinkall: syslinkclean syslink
DM8127 4個核之間需要link機制協(xié)調(diào)工作,這個模塊就是底層的源碼,只不過TI 屏蔽這些底層的東西,我們只需要編譯好就可以了,不需要去修改這樣復(fù)雜模塊的源碼。
build_5_ipncapp-all.sh 腳本內(nèi)容:make all
對應(yīng)總的Makefile內(nèi)容是:
ipncapp: app hdvpss iss mcfw fsupdate?
clean: appclean hdvpssclean issclean mcfwclean?
all: clean ipncapp
applibs:
ifneq ($(MAKE_TARGET), depend)
$(MAKE) -C$(IPNC_DIR) ARCH=arm CROSS_COMPILE=$(BUILD_TOOL_PREFIX) $(MAKE_TARGET)
endif
appclean:
$(MAKE) applibs MAKE_TARGET=clean
appdepend:
$(MAKE) applibs MAKE_TARGET=depend?
appinstall:
$(MAKE) applibs MAKE_TARGET=install
app: appdepend applibs appinstall
hdvpss:
$(MAKE) -C $(hdvpss_PATH)/packages/ti/psp/vps $(TARGET) CORE=m3vpss
$(MAKE) -C $(hdvpss_PATH)/packages/ti/psp/i2c $(TARGET) CORE=m3vpss
$(MAKE) -C $(hdvpss_PATH)/packages/ti/psp/devices $(TARGET) CORE=m3vpss
$(MAKE) -C $(hdvpss_PATH)/packages/ti/psp/platforms $(TARGET) CORE=m3vpss
$(MAKE) -C $(hdvpss_PATH)/packages/ti/psp/proxyServer $(TARGET) CORE=m3vpss
hdvpssclean:
$(MAKE) hdvpss TARGET=clean
hdvpssall: hdvpssclean hdvpss
iss:
$(MAKE) -C $(iss_PATH)/packages/ti/psp/iss $(TARGET) CORE=m3vpss
issclean:
$(MAKE) iss TARGET=clean
issall: issclean iss
mcfw_linux:
make -fMAKEFILE.MK -C $(MCFW_ROOT_PATH)/mcfw/src_linux
make -fMAKEFILE.MK -C $(MCFW_ROOT_PATH)/demos
mcfw_linux_clean:
make -fMAKEFILE.MK -C $(MCFW_ROOT_PATH)/mcfw/src_linux clean
make -fMAKEFILE.MK -C $(MCFW_ROOT_PATH)/demos clean
mcfw_linux_all: mcfw_linux_clean mcfw_linux
mcfw_bios6:?
$(MAKE) -fMAKEFILE.MK -C $(MCFW_ROOT_PATH)/mcfw/src_bios6 $(TARGET)
mcfw_bios6_clean:
$(MAKE) -fMAKEFILE.MK -C $(MCFW_ROOT_PATH)/mcfw/src_bios6 clean
mcfw_bios6_all: mcfw_bios6_clean mcfw_bios6
mcfw: mcfw_linux mcfw_bios6?
mcfwclean: mcfw_linux_clean mcfw_bios6_clean?
mcfwall: mcfwclean mcfw
fsupdate:
cp -R $(TARGET_MCFW_DIR)/?$(EXEC_DIR)/.
chmod 755 $(EXEC_DIR)/.sh
ifeq ($(APP_BUILD_CFG),release)
$(STRIP470) $(TARGET_FS)/opt/ipnc/firmware/ipnc_rdk_fw_m3video.xem3
$(STRIP470) $(TARGET_FS)/opt/ipnc/firmware/ipnc_rdk_fw_m3vpss.xem3
ifeq ($(PLATFORM),ti814x-evm)
$(STRIP6x) $(TARGET_FS)/opt/ipnc/firmware/ipnc_rdk_fw_c6xdsp.xe674
endif
chmod 755 $(TARGET_FS)/opt/ipnc/firmware/.
endif
編譯RDK 的MCFW模塊涉及到APPRO 設(shè)計的app,hdvpss、iss、mcfw_linux、mcfw_bios6和最后把編譯得到的可執(zhí)行文件APP、BIN、LIB等COPY到文件系統(tǒng)路徑。注意上面的mcfw_bios6除了編譯我們熟悉的DSP算法外,還編譯M3 VPSS和M3 VIDEO。Iss模塊就是編譯CMOS 接口驅(qū)動了。算法工程師只修改算法的時候,可以直接單獨使用mcfw_bios6_clean和mcfw_bios6,其他模塊可以到后面整合再編譯。
build_5_ipncapp-tmp.sh 腳本內(nèi)容:make ipncapp
對應(yīng)總的Makefile內(nèi)容是:
見上面build_5_ipncapp-all.sh同樣內(nèi)容。也是修改某個模塊某個源文件,只需要編譯對應(yīng)的模塊,沒必要全部clean再編譯,這個好的電腦全部編譯一次都需要耗時40分鐘以上。
build_6_ty_app.sh 腳本內(nèi)容:make ty_app_all
對應(yīng)總的Makefile內(nèi)容是:
ty_app_clean:
$(MAKE) -C $(IPNC_DIR)/ty_app/ ARCH=arm CROSS_COMPILE=$(BUILD_TOOL_PREFIX) clean
ty_app_build:
$(MAKE) -C $(IPNC_DIR)/ty_app/ ARCH=arm CROSS_COMPILE=$(BUILD_TOOL_PREFIX)
ty_app_install:
$(MAKE) -C $(IPNC_DIR)/ty_app/ ARCH=arm CROSS_COMPILE=$(BUILD_TOOL_PREFIX) install
ty_app_all: ty_app_clean ty_app_build ty_app_install
編譯ipnc_rdk/ipnc_app里面的各個應(yīng)用程序。
build_7_ubifs.sh 腳本內(nèi)容: make ubifs_ty
對應(yīng)總的Makefile內(nèi)容是:
ubifs_ty:
rm -f $(TFTP_HOME)/dm8127_ubifs.bin
mkdir -p $(IPNC_INSTALL_DIR)/tmp
$(MTD_UTILS)/mkfs.ubifs -r $(FILESYS_INSTALL_DIR)/ filesys -F -o ./tmp/ubifs.img -m 2048 -e 126976 -c 2047
$(MTD_UTILS)/ubinize -o $(TFTP_HOME)/dm8127_ubifs.bin -m 2048 -p 128KiB -s 2048 -O 2048 $(IPNC_INSTALL_DIR)/ubinize.cfg
rm -rf $(IPNC_INSTALL_DIR)/tmp
cp -f $(TFTP_HOME)/dm8127_ubifs.bin /tftpboot/dm8127_ubifs.bin
把調(diào)試好的NFS 文件系統(tǒng),使用腳本制作ubifs bin文件燒寫到板子NAND FLASH上。當然除了ubifs文件系統(tǒng)外,本公司也支持squashfs文件系統(tǒng)的移植,即build_7_squashfs.sh。
參加10月29日到11月1日深圳會展中心第16屆安博會回來后,這些天都在忙公司網(wǎng)站改版,公司舊的網(wǎng)站已經(jīng)停止運行,新的網(wǎng)站重新上線,原來的域名(網(wǎng)址不變)。安博會幾乎每個展臺的視頻相關(guān)產(chǎn)品都要加上“智能”兩個字,不帶“智能”兩個字都不好展出,可見現(xiàn)在市場競爭如此激烈。但實際上視頻分析得出的效果和精確度良莠不齊。很多展臺號稱在嵌入式平臺使用深度學習算法,估計有些也是忽悠人,畢竟能跑復(fù)雜深度學習算法的嵌入式平臺不多,無外呼就是英偉達(NVIDIA)的 Jetson TX1 和 Jetson TX2(單個核心板2800元左右,這兩年不適合嵌入式大規(guī)模生產(chǎn)),還有就是ARM+FPGA,兩個成本都比較貴。至于TI 的DSP,有些公司也拿TDAx或者DM505M來做深度學習,但是這種深度學習復(fù)雜度還不是很高。想想2015年深圳安防展有好幾個展臺都使用我們桐燁生產(chǎn)的DM3730板子,到現(xiàn)在2017年深度學習概念瘋狂展現(xiàn),傳統(tǒng)的視頻分析產(chǎn)品不多了,我們感覺壓力很大。TI TDAx和DM505M都帶有多個C66X 浮點DSP+多個EYE(Embedded Vision Engine),這個EYE類似以色列自動駕駛汽車技術(shù)公司Mobileye EyeQ ,已經(jīng)被Intel收購。TI 除了用這些平臺做自動駕駛外,也可以用來做深度學習的。個別公司還用AM5728(CORTEX-A15+雙C66X DSP)做簡單的深度學習算法,但從算法的角度講,AM5728 絕對不如TDAx和DM505M。TI 是打算在下一代的TDAx平臺硬件升級支持深度學習算法(2018年?)。我們公司的DM8127平臺只能用在傳統(tǒng)的機器視覺算法,深度學習算法的平臺公司現(xiàn)在比較糾結(jié),因為還沒發(fā)覺有性價比很好的嵌入式平臺,太貴的太復(fù)雜的我們也做不來。買了一套NVIDIA Jetson TX2玩了一下就不玩了,核心板全部得跟NVIDIA進口,太貴。嵌入式前端沒有好的平臺運行復(fù)雜深度學習算法不要緊,其實可以通過傳統(tǒng)機器視覺來分析出運動的人,然后抓拍通過有線和無線網(wǎng)絡(luò)傳回服務(wù)器后臺去做深度學習也是一種非常可行的辦法,后臺大數(shù)據(jù)服務(wù)器這些超級CPU+GPU足以處理復(fù)雜的深度學習算法,在一些場合還是可以用這種思路去配合做。
本文轉(zhuǎn)自 zjb_integrated 51CTO博客,原文鏈接:http://blog.51cto.com/zjbintsystem/2043380,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的图像识别DM8127开发攻略 ——RDK软件架构浅析及编译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vsCode搜索中文, 正则匹配
- 下一篇: 想象未来人工智能的发展,人工智能构建未来