您好,登錄后才能下訂單哦!
上上一篇文章《圖像識別DM8127開發攻略——開發環境搭建》介紹了DM8127的開發環境搭建,那么本篇開始描述整個IPNC RDK的架構,如果這個IPNC RDK都不熟悉,后面的移植工作基本無法進行下去,也無法深入學習和掌握DM8127的開發流程。要熟悉APPRO DM8127 軟件架構,先看IPNC_RDK_InstallGuide.pdf,然后再去看看RDK包里Collaterals文件目錄下的兩個重要文件:IPNC_RDK_McFW_UserGuide.pdf和IPNC_RDK_Application_DesignGuide.pdf,我們下面的介紹會提到這些文件里面的內容。
IPNC_RDK里面的軟件包Source文件夾內容,這里還是以截圖的方式去了解DM8127的軟件架構更合適。
上圖是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的文件夾,里面有很多和驅動移植有關文檔。
2、iss_03_80_00_00:也是需要移植的軟件包,所有調試CMOS SENSOR驅動(比如添加一款新的SONY IMX、OV、ON等CMOS SENSOR)都需要在這個軟件包里面去調試,包括LVDS接口采集RAW DATA,并行口驅動采集RAW DATA,BT656接口采集YUV422 DATA,BT1120接口采集YC DATA啊等等,還有CMOS 2A(自動白平衡,自動曝光)算法,降噪處理,都在這個iss_03_80_00_00目錄下去移植調試,重點去看iss_03_80_00_00/packages/ti/psp/目錄下的源碼,這個和以前的DM6446啊,DM3730啊在內核添加的V4L2這些驅動做法完全不一樣了。DM8127跟DM8147-8148-8168的差別就在這個iss模塊,DM8127帶有ISP功能,可以接RAW DATA格式的CMOS。
3、Linux_devkit是DM8127平臺的ARM交叉編譯工具,APPRO集成在這個ti_tools里面來了。
4、其他ti_tools軟件包都是現成的LIB 或者DSP編譯工具,兩個ARM CORTEX-M3核的編譯工具也在這里,這些工具不需要我們去移植開發,大家可以進到對應的文件夾里面去了解。
二、ipnc_rdk介紹
1、ipnc_rdk/ipnc_app目錄下:
上圖里面的都是最上層的linux app應用程序,其中ty_app是本人自己添加的,里面有自己寫的gpio應用程序,rs232測試程序,rs485測試程序,等等,其他的APP介紹可以看看IPNC_RDK_Application_DesignGuide.pdf,里面有詳細的描述。DM8127 RDK運行DEMO程序的時候,一般是先從sys_server源碼開始運行的,我們不妨從NFS 文件系統即ipnc_rdk/target/filesys/etc/init.d/finish_ubifs.sh的腳本了解:
cd /opt/ipnc
./init.sh
./system_server
sleep 7
./autorun_ipnc.sh
執行system_server就是執行sys_server編譯的應用程序。
其他的web服務器程序,network程序(包括大家非常熟悉的boa和live555)這種常用的應用程序就不要介紹了,一看就明白這些功能,運行system_server的時候也可以同時運行這些應用程序,就在autorun_ipnc.sh里面執行。
2、 target目錄
這個目錄下的filesys就是我們開發的時候使用的NFS文件系統,在上上一篇《圖像識別DM8127——開發環境搭建》有介紹。
3、 tftp
這個文件我們沒有用到,也可以當作一個臨時保存BIN文件的文件夾。而我們的TFTP SERVER放在linux ubuntu主機/tftpboot目錄下。
4、 最重點的ipnc_mcfw
Mcfw: Multi Channel Framework多通道幀同步工作機制,我們要配合IPNC_RDK_McFW_UserGuide.pdf一起分析這個mcfw,主要是掌握視頻數據流是如何在VPSS CORTEX-M3, VIDEO CORTEX-M3, CORTEX-A8 還有C674X DSP四個核之間是如何同步工作的;
A、ipnc_mcfw/bin
ipnc_mcfw/bin/ti814x里面有編譯mcfw模塊出來的對應的一些可執行文件,LIB,驅動文件KO,另外scripts有對應的運行腳本,大家可以進去看看就明白了。這編譯得到的可執行文件,LIB,驅動文件KO, scripts里面的運行腳本,還有init.sh腳本都會COPY到NFS文件系統target/filesys/opt/ipnc目錄下,后面編譯描述會提到。
B、ipnc_mcfw/build
這個文件夾存放了編譯mcfw大部分的臨時文件,.obj文件,還有一些LIB文件,驅動臨時文件。4個核編譯的臨時文件都放在這個目錄下,這樣管理本人比較喜歡,不像UBOOT和KERNEL這些編譯的臨時文件都放在同樣的文件下面,不好備份。
C、ipnc_mcfw/demos/
重點看mcfw_api_demos/ multich_usecase和stream文件夾下面的源碼,這些都是IPNC DEMO的應用程序。
D、ipnc_mcfw/makerules/
四個核的編譯規則級編譯腳本,非常重要,本人花了一些時間去研究這4個核是如何編譯的,還有在DSP端移植C++算法的時候,是如何支持.cpp源文件編譯,都需要在這些腳本下面修改,怕修改錯就先bk備份一下再修改,這些編譯規則腳本有些參數看不懂,可以看看同一個目錄下的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)的任務:links_m3vpss/tyLink/tyLink_tsk.c和tyLink_priv.h,然后修改上一級目錄的SRC_FILES.MK讓tyLink_tsk.c被編譯到。而links_common里面的源碼是可以被DSP核,M3 VPSS核,M3 VIDEO核共用,這個需要注意。網上已經有一篇其他網友的文章如何在這個mcfw目錄下去添加DSP 端運行算法的例子(http://blog.csdn.net/guo8113/article/details/20149191),那篇文章主要在DM8148/DM8168平臺上實現的,其實和DM8127完全一樣,可以直接借鑒。還有一種直接使用TI 現成的links_common/null/nullLink_tsk.c基礎上去添加DSP接口,讓nullLink_tsk.c被DSP 單獨編譯,而不是作為M3 的程序去編譯,然后去src_linux/mcfw_api/usecases/xxxx.c去System_linkCreate()這個任務就可以了。
我們可以使用下面這個圖更深入了解:
上圖就是一個很經典的視頻數據流的在4個核之間的通信,
A)、首先 從CMOS SENSOR采集到1080P的RAW DATA圖像數據,在M3 VPSS這個核建立CAMERA LINK,去處理圖像數據,先把RGB格式轉換成YUV格式;
B)、然后ISS使用兩個Resizer,即Resizer A和Resizer B,對YUV格式再進一步處理,Resizer-A把1080P的數據轉換成YUV420SP(Y分量獨立保存,UV交叉獨立保存),統一保存到dup[0]這個緩存隊列(其實就是一大塊獨立的內存空間);Resizer-B也在對初始的YUV格式進行Resizer縮小成720480這個標清圖像,也是YUV420SP(Y分量獨立保存,UV交叉獨立保存),并且統一保存到dup[1]另外一個獨立的緩存隊列,和上面的dup[0]是分開的。也就是說,dup[0]的1080P 數據拿去M3 VIDEO 核去H264編碼,dup[1]的720480數據拿去給DSP核 做視頻分析。
C)、通過一種link機制,M3 VPSS 核輸出數據給M3 VIDEO核,M3 VIDEO核拿到dup[0]的數據(其實就是一個指針隊列,共享內存方式),再進行H264編碼,與此同時也通過link機制,把dup[0]數據直接輸出給HDMI接口。另外一條數據dup[1]通過link機制,把指針傳給DSP TSK,比如我們使用nullLink_tsk.c這種接口去調用我們的算法,或者通過link機制把標清720*480輸出到CVBS接口進行display,當然CVBS的格式是YUV422,這點需要注意。
D)、Dup[0]的數據經過H264 Enc編碼后,以BIT流的方式,通過link機制,傳給CORTEX-A8,那么A8運行的應用程序,比如live555就可以拿到這個bit流進行WEB播放。
有關上面提到的link機制,需要去看TI MCFW的用戶手冊,配合程序來分析。總之理解完上圖的講解,應該對DM8127 MCFW的架構有初步的了解,而不是滿頭霧水。本人能力一般,剛拿到APPRO 板子的時候,也不知如何去學習,即使看了很多遍那一大堆文檔,還是沒有掌握上圖的精髓,然后就是去搞大客戶的產品設計,這一塊就暫停了。后來有時間,配合程序分析,經過高人蜻蜓點水講解,才對這個MCFW的數據流有了很好的認識,特別是高薪招了一個做過DM385的項目經理,他對這個mcfw和相關link機制比較熟悉,幫本人解決了很多問題,我們相互配合,很快就把以前DM3730的視頻分析算法移植過來了,而且跑得還比較穩定,算法運行效率當然比DM3730 定點DSP高多了,DM8127 浮點DSP就是好,很多浮點運算根本不要考慮優化,整個浮點DSP就專門跑視頻分析算法,把分析出來的目標坐標和其他參數傳出來給其他核就OK了,根本不用去做多余的任務。
三、總的Rules.make和Makefile介紹
ipnc_rdk/Rules.make和ipnc_rdk/Makefile是整個RDK軟件包的最重要的編譯腳本,必須要吃透。
1、我們先介紹Rules.make:
SYSTEM_PLATFORM := IPNC (APPRO IPNC_RDK是針對高清網絡攝像機產品來設計的,而不是 DM8148那種TI 自己開發板的EVM開發包)
APP_BUILD_CFG := release (表示編譯RDK的時候是編譯的程序是產品release模式,可以去掉很多調試信息,如果使用debug則表示在編程編譯調試運行的時候需要)
BINARY_MODE := nand (表示編譯的uboot min是NAND FLASH模式,編譯出來的uboot min和uboot是要燒寫到NAND里面去的。如果是:=sd表示編譯的uboot min是MLO文件,放到SD卡里面,用在工廠生產和NAND 無程序時候調試用)
IPNC_DEVICE := DM8127 (選擇DM8127平臺,這個RDK當然也支持DM385和DM388不帶DSP的平臺)
IPNC_CONFIG := FULL_FEATURE (我們使用DSP 而且是必須CORETEX-A8 跑1G頻率,DSP 跑750MHz的模式)
MEMORY_CONFIG := 512MB (我們桐燁科技DM8127核心板使用512MB 字節的DDR3內存,256MB根本不夠,因為我們帶DSP)
MTD_UTILS_MODE := 32bit (這個針對ipnc_rdk / target/ mtd-utils的編譯問題,如何你的linux開發主機是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相關驅動)
WDR_ON := YES (如果你的CMOS SENSOR支持寬動態,使能這個)
LOW_POWER_OPP100_MODE := NO (這個選擇NO表示電源管理模式使用全速 ,非低功耗,和上面的FULL_FEATURE類似,如果選擇YES,DM8127 CORTEX-A8 跑600M, DSP 跑500MHz)
AES_MODULE_MODE := OFF (表示編譯的RDK包里面的各種程序模塊是否需要采用AES加密方式發布)
BUILD_WARNINGS_AS_ERROR := NO(這里本公司選擇NO,是因為編譯RDK的時候,如果選擇YES,有些定義的變量沒有用到,編譯器會把這種warning認為是錯誤,停止往下編譯,很煩人)
CAPTURE_DISPLAY_MODE_ON := YES
RAMES_TO_A8 := NO
(這里就是用戶要使用什么模式去用這個IPNC RDK的程序,這里的選擇對應src_linux/mcfw_api/usecases/multich_capturedisplay.c這個例子,支持這個IPNC設備實現采集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 文件系統路徑
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 文件系統對應可執行文件保存路徑
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 編譯需要結合IPNC_RDK_InstallGuide.pdf 這個文件來看。
其實一個總的:make sysall,就可以編譯完所要開發的各個模塊,但是開發的時候不可能都去make sysall,這樣太浪費時間了,根本不用去開發軟件了。我們只好把make sysall涉及到的模塊全部分開來編譯,這樣需要開發到哪個模塊再去編譯。make sysall 后面會把編譯得到的應用程序啊,BIN文件啊,LIB等等COPY到NFS 文件系統對應的文件夾,見:
fsupdate:
cp -R $(TARGET_MCFW_DIR)/ $(EXEC_DIR)/.
chmod 755 $(EXEC_DIR)/.sh
這里需要提到一個APPRO自己做的一個腳本,在編譯ipnc_app(即make app)的時候,會去執行inpc_app/ root_filesys/Makefile,我們第一可以讓他執行這個Makefile,見下圖,它會COPY對應的文件到我們NFS文件系統對應的文件夾。但是當我們調試NFS一些腳本的時候,做了修改,比如target/ filesys/etc/ init.d/ finish_ubifs.sh ,target/ filesys/opt/ipnc/init.sh等腳本修改,如果再執行make sysall,如果不備份,又把我們修改好的NFS 文件系統的腳本內容覆蓋,很討厭,這點要注意。我們是做了一次這個inpc_app/ root_filesys/Makefile,以后,直接把這個inpc_app/ root_filesys/Makefile里面的內容屏蔽,后面就不需要多次重復覆蓋了,下圖就是inpc_app/ root_filesys/Makefile,執行完一次就可以屏蔽里邊的install操作。
四、SDK編譯過程
上圖是本人根據總的Makefile,自己單獨做的編譯腳本,把各個模塊分離出來,這樣便于各個模塊開發編譯,編譯build加上1-2-3-4-5-6-7等數字,讓大家一目了然,知道整個RDK軟件要如何編譯開發。在上一篇《圖像識別DM8127開發攻略 ——板子啟動過程》已經描述過DM8127的硬件啟動流程,這里編譯的流程也和那篇文章對應。所有的這些build的腳本,都必須在上圖對應路徑下編譯,也就是:
/home/davinci/dm8127/v3.8.0/Source/ipnc_rdk/
包括自己手動使用make xxxxx,都是在這個路徑下去執行編譯。
build_1_uboot-min-nand.sh 腳本內容:make ubootmin
就是編譯ubootmin,顧名思義,專門用來燒寫到NAND FLASH上的BIN文件。
對應總的Makefile內容是:
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 腳本內容:make uboot_ty_sd
同時編譯ubootmin和uboot,只不過是編譯得到MLO和u-boot.bin文件,COPY 到SD卡里,使用SD卡BOOT板子。
對應總的Makefile內容是(自己添加修改的):
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 腳本內容: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 腳本內容:make uboot_ty
也是編譯uboot,得到dm8127_uboot.bin用于燒寫到NAND FLASH。只不過用在移植開發UBOOT的時候,只修改某個.c或.h文件,這時編譯的時候,就沒必要再使用ubootclean把所有的OBJ清空再全部編譯一次,太耗時間。
對應總的Makefile內容是:
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 腳本內容:make lspmenu
對應總的Makefile內容是:
lspbuild:
make -C$(KERNELDIR) ARCH=arm CROSS_COMPILE=$(BUILD_TOOL_PREFIX) $(MAKE_TARGET)
lspmenu:
make lspbuild MAKE_TARGET=menuconfig
這個熟悉的配置內核選項的界面就不多說了。選擇某些功能和模塊后,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
后面的內核編譯都是使用這個ti8148_ipnc_ubifs_defconfig配置文件。
build_3_kernel-all.sh 腳本內容:make lsp_ty
對應總的Makefile內容是:
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
從上面的腳本可以看出,編譯內核之前,必須編譯cmem模塊(ARM+DSP最重要的共享內存機制),這個和DM6446-DM3730一樣,只不過那些是獨立編譯的,內核編譯也是獨立的,現在DM8127把這個cmem整合在一起編譯。還有內核那些選項為(M)的驅動模塊,也整合在一個腳本編譯,然后把對應的.ko文件COPY到對應的路徑。還有注意一下,編譯kernel之前,必須先編譯好UBOOT,因為使用UBOOT里面一個image工具,如果uboot被clean完臨時文件,到這里編譯內核最后步驟會通不過的。
build_3_kernel-tmp.sh 腳本內容:make lsp
對應總的Makefile內容是:見上面描述。也就是編譯某個源文件,沒編譯又把整個內核clean再重新編譯,太浪費自己的生命時間。
build_4_syslink.sh 腳本內容:make syslinkall
對應總的Makefile內容是:
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機制協調工作,這個模塊就是底層的源碼,只不過TI 屏蔽這些底層的東西,我們只需要編譯好就可以了,不需要去修改這樣復雜模塊的源碼。
build_5_ipncapp-all.sh 腳本內容:make all
對應總的Makefile內容是:
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 設計的app,hdvpss、iss、mcfw_linux、mcfw_bios6和最后把編譯得到的可執行文件APP、BIN、LIB等COPY到文件系統路徑。注意上面的mcfw_bios6除了編譯我們熟悉的DSP算法外,還編譯M3 VPSS和M3 VIDEO。Iss模塊就是編譯CMOS 接口驅動了。算法工程師只修改算法的時候,可以直接單獨使用mcfw_bios6_clean和mcfw_bios6,其他模塊可以到后面整合再編譯。
build_5_ipncapp-tmp.sh 腳本內容:make ipncapp
對應總的Makefile內容是:
見上面build_5_ipncapp-all.sh同樣內容。也是修改某個模塊某個源文件,只需要編譯對應的模塊,沒必要全部clean再編譯,這個好的電腦全部編譯一次都需要耗時40分鐘以上。
build_6_ty_app.sh 腳本內容:make ty_app_all
對應總的Makefile內容是:
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里面的各個應用程序。
build_7_ubifs.sh 腳本內容: make ubifs_ty
對應總的Makefile內容是:
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
把調試好的NFS 文件系統,使用腳本制作ubifs bin文件燒寫到板子NAND FLASH上。當然除了ubifs文件系統外,本公司也支持squashfs文件系統的移植,即build_7_squashfs.sh。
參加10月29日到11月1日深圳會展中心第16屆安博會回來后,這些天都在忙公司網站改版,公司舊的網站已經停止運行,新的網站重新上線,原來的域名(網址不變)。安博會幾乎每個展臺的視頻相關產品都要加上“智能”兩個字,不帶“智能”兩個字都不好展出,可見現在市場競爭如此激烈。但實際上視頻分析得出的效果和精確度良莠不齊。很多展臺號稱在嵌入式平臺使用深度學習算法,估計有些也是忽悠人,畢竟能跑復雜深度學習算法的嵌入式平臺不多,無外呼就是英偉達(NVIDIA)的 Jetson TX1 和 Jetson TX2(單個核心板2800元左右,這兩年不適合嵌入式大規模生產),還有就是ARM+FPGA,兩個成本都比較貴。至于TI 的DSP,有些公司也拿TDAx或者DM505M來做深度學習,但是這種深度學習復雜度還不是很高。想想2015年深圳安防展有好幾個展臺都使用我們桐燁生產的DM3730板子,到現在2017年深度學習概念瘋狂展現,傳統的視頻分析產品不多了,我們感覺壓力很大。TI TDAx和DM505M都帶有多個C66X 浮點DSP+多個EYE(Embedded Vision Engine),這個EYE類似以色列自動駕駛汽車技術公司Mobileye EyeQ ,已經被Intel收購。TI 除了用這些平臺做自動駕駛外,也可以用來做深度學習的。個別公司還用AM5728(CORTEX-A15+雙C66X DSP)做簡單的深度學習算法,但從算法的角度講,AM5728 絕對不如TDAx和DM505M。TI 是打算在下一代的TDAx平臺硬件升級支持深度學習算法(2018年?)。我們公司的DM8127平臺只能用在傳統的機器視覺算法,深度學習算法的平臺公司現在比較糾結,因為還沒發覺有性價比很好的嵌入式平臺,太貴的太復雜的我們也做不來。買了一套NVIDIA Jetson TX2玩了一下就不玩了,核心板全部得跟NVIDIA進口,太貴。嵌入式前端沒有好的平臺運行復雜深度學習算法不要緊,其實可以通過傳統機器視覺來分析出運動的人,然后抓拍通過有線和無線網絡傳回服務器后臺去做深度學習也是一種非常可行的辦法,后臺大數據服務器這些超級CPU+GPU足以處理復雜的深度學習算法,在一些場合還是可以用這種思路去配合做。
(本人QQ: 2505133162,有需要開發板或者合作交流的網友可以通過QQ交流或者技術博客留言交流。)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。