1. 程式人生 > >圖像識別DM8127開發攻略——UBOOT的移植說明

圖像識別DM8127開發攻略——UBOOT的移植說明

DM8127 開發攻略 UBOOT移植 圖像識別

圖像識別DM8127開發攻略——UBOOT的移植說明

根據前幾篇文章的介紹,想必大家對DM8127軟件架構有了全局的認識,下面我們從開發的角度進行裁剪移植最基本的BOOT軟件包,嵌入式開發人員拿到一個新的板子,就是要如何讓板子能跑得起自己編譯和移植的程序,這才有價值,否則直接拿別人的BIN文件直接燒寫到板子上沒啥意思。

一、DM8127 UBOOT編譯說明
DM8127 的UBOOT的版本是u-boot-2010.06, UBOOT代碼 和 以前的DM6446-DM368-DM3730平臺稍微不同,以前的DM6446-DM368分離UBL和UBOOT兩個軟件包,DM3730 分離出XLOADR和UBOOT兩個軟件包,而現在的DM8127是一個UBOOT軟件包,裏面包含了UBOOTMIN和UBOOT,通過宏來編譯得到不同的BIN文件,這裏有3個大的宏來區分不同的編譯模式。編譯UBOOTMIN 和 UBOOT命令和腳本見《圖像識別DM8127開發攻略——RDK軟件架構淺析及編譯》提到的總Makefile和U-BOOT文件夾對應的u-boot\Makefile文件第3320行開始看 ti8148_ipnc_config,同時也要結合看include/configs/ti8148_ipnc.h。

A、#define CONFIG_TI814X_MIN_CONFIG
編譯得到UBOOTMIN(u-boot.min.nand 或者 MLO);
對應RDK總的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-nand.sh就是調用上面的腳本執行else這種模式,得到u-boot.min.nand(dm8127_min.bin),這個是針對nand FLASH的情況,是要燒寫到板子NAND FLASH上面的。
而我們的build_1_uboot-min-sd.sh也是調用上面的腳本執行ifeq ($(BINARY_MODE),sd),得到MLO,工廠生產,軟件調試,最需要這個文件,因為剛做出來的板子NAND 是沒有程序的,需要把這個MLO文件和後面編譯總的U-BOOT得到的u-boot.bin一起COPY到SD卡(TF卡)。

B、#define CONFIG_TI814X_OPTI_CONFIG
編譯得到u-boot.opti.nand這個也是類似UBOOTMIN的宏編譯,只不過編譯得到的BIN文件是通過串口下載到板子上啟動。
對應RDK總的Makefile編譯腳本:
ubootopti:
$(MAKE) ubootclean
$(MAKE) ubootbuild MAKE_TARGET=$(PLATFORM_CFG)_ipnc_opti_nand
$(MAKE) ubootbuild MAKE_TARGET=u-boot.ti
cp $(UBOOTDIR)/u-boot.opti.nand $(TFTP_HOME)/u-boot.opti.nand
我們的build_1_uboot-min-opt.sh就是調用到這個腳本執行,得到u-boot.opti.nand,這個是通過PC端的串口軟件下載到板子上面去,有些產品設計的時候,由於特殊原因沒有SD卡,那麽可以使用這種模式去軟件調試新生產出來的板子。編譯這種模式要註意修改u-boot/Include/configs/ti8148_ipnc.h這個文件,把很多沒用的功能屏蔽掉,比如:
#undef CONFIG_CMD_BDI
#undef CONFIG_GZIP
#undef CONFIG_ZLIB
#undef CONFIG_CMD_LOADB
#undef CONFIG_CMD_LOADS
#undef CONFIG_CMD_NFS
#undef CONFIG_CMD_SETGETDCR
#undef CONFIG_CMD_XIMG
#undef CONFIG_CMD_MISC
#undef CONFIG_CMD_ITEST
#undef CONFIG_CMD_FPGA
#undef CONFIG_CMD_EDITENV
#undef CONFIG_BOOTM_NETBSD
#undef CONFIG_BOOTM_RTEMS
#undef CONFIG_CMD_MISC
#undef CONFIG_CMD_IMI
#undef CONFIG_CMD_ITEST
#undef CONFIG_CMD_SOURCE
#undef CONFIG_CMD_IMLS
#undef CONFIG_CMD_ECHO
使用#undef裁剪u-boot的功能,保留網絡功能和NAND功能,如果不裁剪,得到的u-boot.opti.nand過大,是不能在DM8127片內的RAM運行的,u-boot.opti.nand和上面提到的MLO都是在DM8127片內的RAM運行,因為外存DDR3都還沒初始化!
那麽軟件調試新生產出來的板子時,給板子選定串口BOOT模式(NAND沒程序就是自動默認其他BOOT模式),上電,按下圖使用串口工具比如SecureCRT,選擇編譯得到的u-boot.opti.nand,如果串口穩定,一般下載100%正常,回車進入熟悉的u-boot命令行模式。
技術分享圖片

上圖有時使用X modem 傳輸文件不成功,可以再使用Ymodem模式,波特率使用115200。

C、如果CONFIG_TI814X_MIN_CONFIG和CONFIG_TI814X_OPTI_CONFIG都沒有選上,那麽就是編譯正常的UBOOT,得到u-boot.bin(dm8127_uboot.bin)
對應RDK總的Makefile編譯腳本:
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-all.sh就是調用上面的腳本,第一次編譯正常的UBOOT必須使用ubootclean,還有我們的build_2_uboot-tmp.sh是上面的腳本把$(MAKE) ubootclean去掉,在第一次編譯build_2_uboot-all.sh後,後面修改源碼某個文件,我們不需要每次都調用ubootclean,再重新對所有的文件編譯,太浪費時間。
提示:上面3種大的宏編譯模式,一定要結合RDK總Makefile和U-BOOT文件夾對應的u-boot\Makefile文件第3320行開始的內容來理解。

二、UBOOT的裁剪和移植

1、 修改u-boot\Makefile
以前寫過的其他DAVINCI平臺開發攻略都說過,第一步就是刪除不相關的文件,這樣才好理解這個DM8127平臺有哪些相關的文件和文件夾,哪些是不相關的,一目了然。
SUBDIRS = tools \
#examples/standalone \ (屏蔽,不要)
#examples/api (屏蔽,不要)
…….
#LIBS += api/libapi.a (屏蔽)

2、回到u-boot目錄下,把nand_spl和onenand_ipl文件夾去掉。
3、Include/configs/只保留ti8148_ipnc.h,其他全部刪除。
4、arch只保留arm文件
而arm/cpu文件裏面只保留arm_cortexa8
arm_cortexa8文件裏只保留
技術分享圖片
arch/arm/ Include/asm裁剪截圖見下圖:
技術分享圖片

5、board文件夾只保留提ti文件夾,ti下面只保留ti8148_ipnc
技術分享圖片
經過上面幾個步驟的暴力刪除,DM8127平臺的UBOOT簡潔了很多,保存備份很方便。

6、u-boot/include/configs/ti8148_ipnc.h重點修改
對於新手玩一個DEMO板來說,要把板子跑起程序來,其實移植工作很大一部分在這個文件下去修改,其他外設驅動初始化,則還沒有那麽著急。等你弄熟DEMO板,然後再去開發自己設計的板子,比如使用新的DDR3啊,NAND FLASH啊,網口芯片啊等等。
下面本人直接把本公司的開發板u-boot源碼對於的/include/configs/ti8148_ipnc.h放上來逐步分析。
#ifndef __CONFIG_TI8148_IPNC_H
#define __CONFIG_TI8148_IPNC_H

/
#define CONFIG_TI814X_NO_RUNTIME_PG_DETECT
/
/
Display CPU info /
#define CONFIG_DISPLAY_CPUINFO 1 (允許串口打印CPU信息)
/
In the 1st stage we have just 110K, so cut down wherever possible */
#ifdef CONFIG_TI814X_MIN_CONFIG (使用make ubootmin,就編譯這裏面的定義)

/ enable d-cache only on 2nd stage /
#define CONFIG_SYS_DCACHE_OFF

#define CONFIG_CMD_MEMORY / for mtest /
#define CONFIG_CMD_MISC / Misc functions like sleep etc/(支持sleep 1這種腳本命令)
#undef CONFIG_GZIP (ubootmin不需要過多的其他功能,使用#undef處理)
#undef CONFIG_ZLIB
#undef CONFIG_SYS_HUSH_PARSER
#define CONFIG_CMD_LOADB / loadb /
#define CONFIG_CMD_LOADY / loady /
#define CONFIG_SETUP_PLL
#define CONFIG_TI814X_CONFIG_DDR(在ubootmin裏面必須對DDR3進行初始化,否則無法運行uboot)
#define CONFIG_TI814X_EVM_DDR3
#define CONFIG_ENV_SIZE 0x400 (ubootmin也有自己的boot 參數,字節很少)
#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + (8 * 1024))
#define CONFIG_SYS_PROMPT "TI-MIN#" (ubootmin命令行,不過一般只用於開發調試)*
/
set to negative value for no autoboot /
#define CONFIG_BOOTDELAY 0 (ubootmin在開發調試可以為1,ubootmin穩定後產品化為0)
#if defined(CONFIG_SPI_BOOT) /
Autoload the 2nd stage from SPI /
#error 1 (ubootmin不需要SPI BOOT的話,這裏面不編譯)
#define CONFIG_SPI 1
#if defined(CONFIG_TI81XX_PCIE_BOOT)
#define CONFIG_CMDLINE_TAG 1 /
enable passing of ATAGs /
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_INITRD_TAG 1 /
Required for ramdisk support /
#define CONFIG_CMD_SOURCE
#define CONFIG_EXTRA_ENV_SETTINGS \
"verify=yes\0" \
"bootcmd=source 0x80400000\0" \
""
/
user can override default size configuration here.

  • it will only come in effect if TI81xx_NO_PIN_GPMC
  • is defined in include/asm/arch/pcie.h
    */
    #define CONFIG_BAR1_32 (0x1000000ULL)
    #define CONFIG_BAR2_32 (0x800000ULL)
    #define CONFIG_BAR3_32 (0xfffULL)
    #define CONFIG_BAR4_32 (0x1001ULL)
    #define CONFIG_REG2_64 (0x1000000ULL)
    #define CONFIG_REG4_64 (0x2000000ULL)

#else //(CONFIG_TI81XX_PCIE_BOOT) (ubootmin不需要PCIE BOOT的話,這裏面不編譯)
#define CONFIG_EXTRA_ENV_SETTINGS \
"verify=yes\0" \
"bootcmd=sf probe 0; sf read 0x81000000 0x20000 0x40000; go 0x81000000\0" \

#endif //(CONFIG_TI81XX_PCIE_BOOT)

#elif defined(CONFIG_NAND_BOOT) / Autoload the 2nd stage from NAND /
//#error 2 //built: build_1_uboot-min-nand.sh sleep 1 (ubootmin需要NAND BOOT,一定 要編譯)
#define CONFIG_NAND 1
#define CONFIG_EXTRA_ENV_SETTINGS \
"verify=yes\0" \
"bootcmd=mw.b 0x81000000 0x00 0x20000;nand read 0x81000000 0x20000 0x40000;go 0x81000000\0" \
(ubootmin存放在0x0—0x20000空間,uboot存放在0x20000---0x180000,這裏ubootmin把uboot給跑起來,讀取NAND FLASH的UBOOT放到DDR3地址0x81000000,然後go命令BOOT起來)
#elif defined(CONFIG_SD_BOOT) / Autoload the 2nd stage from SD /
//#error 3 //built: build_1_uboot-min-sd (ubootmin需要SD BOOT的話,調試模式和生產模式,要編譯)
#define CONFIG_MMC 1
#define CONFIG_EXTRA_ENV_SETTINGS \
"verify=yes\0" \
"bootcmd=mmc rescan 0; fatload mmc 0 0x80800000 u-boot.bin; go 0x80800000\0" \
(ubootmin從SD卡讀讀u-boot.bin,然後跑起來)
#elif defined(CONFIG_UART_BOOT) / stop in the min prompt /
#define CONFIG_EXTRA_ENV_SETTINGS \
"verify=yes\0" \
"bootcmd=\0" \

#elif defined(CONFIG_ETH_BOOT) / Auto load 2nd stage from server /
#define CONFIG_EXTRA_ENV_SETTINGS \
"verify=yes\0" \
"bootcmd=setenv autoload no;dhcp; tftp 0x81000000 u-boot.bin; go 0x81000000\0"

#endif //defined(CONFIG_SPI_BOOT)

#elif defined(CONFIG_TI814X_OPTI_CONFIG) / Optimized code / (對應本文前面的介紹OPTI串口下載模式,需要這種編譯宏,對應make ubootopti)
#include <config_cmd_default.h> (這個.h裏面的一些宏定義也可以進去屏蔽掉)

#define CONFIG_ZERO_BOOTDELAY_CHECK
#define CONFIG_ENV_SIZE 0x2000
#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + (32 1024))
#define CONFIG_ENV_OVERWRITE
#define CONFIG_SYS_LONGHELP
#define CONFIG_SYS_PROMPT "TI8127_OPTI#"
#define CONFIG_CMDLINE_TAG 1 /
enable passing of ATAGs /
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_INITRD_TAG 1 /
Required for ramdisk support /
#define CONFIG_BOOTDELAY 3 /
set to negative value for no autoboot */
#define CONFIG_NAND 1
#define CONFIG_SETUP_PLL
#define CONFIG_TI814X_CONFIG_DDR
#define CONFIG_TI814X_EVM_DDR3
#define CONFIG_SYS_DCACHE_OFF
#define CONFIG_SYS_ICACHE_OFF

#define CONFIG_CMD_BDI / bdinfo /
#define CONFIG_CMD_BOOTD / bootd /
#define CONFIG_CMD_CONSOLE / coninfo /
#define CONFIG_CMD_ECHO / echo arguments /
#define CONFIG_CMD_EDITENV / editenv /
#define CONFIG_CMD_FPGA / FPGA configuration Support /
#define CONFIG_CMD_IMI / iminfo /
#define CONFIG_CMD_ITEST / Integer (and string) test /
#ifndef CONFIG_SYS_NO_FLASH
#define CONFIG_CMD_FLASH / flinfo, erase, protect /
#define CONFIG_CMD_IMLS / List all found images /
#endif
#define CONFIG_CMD_LOADB / loadb /
#define CONFIG_CMD_LOADS / loads /
#define CONFIG_CMD_MEMORY / md mm nm mw cp cmp crc base loop mtest /
#define CONFIG_CMD_MISC / Misc functions like sleep etc/
#define CONFIG_CMD_NET / bootp, tftpboot, rarpboot /
#define CONFIG_CMD_NFS / NFS support /
#define CONFIG_CMD_RUN / run command in env variable /
#define CONFIG_CMD_SAVEENV / saveenv /
#define CONFIG_CMD_SETGETDCR / DCR support on 4xx /
#define CONFIG_CMD_SOURCE / "source" command support /
#define CONFIG_CMD_XIMG / Load part of Multi Image /

#undef CONFIG_CMD_BDI
#undef CONFIG_GZIP
#undef CONFIG_ZLIB
#undef CONFIG_CMD_LOADB
#undef CONFIG_CMD_LOADS
#undef CONFIG_CMD_NFS
#undef CONFIG_CMD_SETGETDCR
#undef CONFIG_CMD_XIMG
#undef CONFIG_CMD_MISC
#undef CONFIG_CMD_ITEST
#undef CONFIG_CMD_FPGA
#undef CONFIG_CMD_EDITENV
#undef CONFIG_BOOTM_NETBSD
#undef CONFIG_BOOTM_RTEMS
#undef CONFIG_CMD_MISC
#undef CONFIG_CMD_IMI
#undef CONFIG_CMD_ITEST
#undef CONFIG_CMD_SOURCE
#undef CONFIG_CMD_IMLS
#undef CONFIG_CMD_ECHO
(其實上面有些代碼是多余的,因為後面的#undef 是把前面定義的宏給取消了,本人這裏是不想破壞TI RDK的架構,讓大家明白這個過程。由於OPTI模式編譯的BIN也是在內部RAM運行,必須裁剪不需要的UBOOT功能,只保留TFTP網絡燒寫NAND FLASH的功能就OK了)
#define CONFIG_EXTRA_ENV_SETTINGS \
"verify=no\0" \
"bootdelay=0\0" \
"bootfile=uImage\0" \
"loadaddr=0x81000000\0" \
"bootargs=console=ttyO0,115200n8 mem=256M notifyk.vpssm3_sva=0xBF900000 vram=50M ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs rw rootwait=1 rw lpj=4997120 ip=${ipaddr}:${serverip}:${gateway}:${subnet}::eth0:off\0 "\
"eraseall=nand erase\0" \
"uboot_tftp=tftp 0x81000000 dm8127_uboot.bin; go 0x81000000 \0" \
#define CONFIG_BOOTCOMMAND \
"nboot 80007FC0 0 0x280000;bootm 80007FC0"
(本人這裏只使用網絡TFTP下載運行UBOOT,燒寫的任務交給這個新運行起來的dm8127_uboot.bin,而不是使用這個OPTI模式的UBOOT)

#else //CONFIG_TI814X_MIN_CONFIG (下面這些定義就是編譯正常UBOOT的宏了,很多工作在下面做)

#include <config_cmd_default.h>
#define CONFIG_SERIAL_TAG 1
#define CONFIG_REVISION_TAG 1
#define CONFIG_SKIP_LOWLEVEL_INIT / 1st stage would have done the basic init /
#define CONFIG_ENV_SIZE 0x20000 (用一個BLOCK保存UBOOT參數:bootargs)
#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + (32 1024))
#define CONFIG_ENV_OVERWRITE
#define CONFIG_SYS_LONGHELP
#define CONFIG_SYS_PROMPT "TI8127_IPNC#"
#define CONFIG_SYS_HUSH_PARSER /
Use HUSH parser to allow command parsing /
#define CONFIG_SYS_PROMPT_HUSH_PS2 "> "
#define CONFIG_CMDLINE_TAG 1 /
enable passing of ATAGs /(支持從UBOOT傳參數給內核)
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_INITRD_TAG 1 /
Required for ramdisk support /
#define CONFIG_BOOTDELAY 1 /
set to negative value for no autoboot /
#define CONFIG_CMD_AUTOTEST /
for autotest /
/
By default, 2nd stage will have MMC, NAND, SPI and I2C support */
#define CONFIG_MMC 1
#define CONFIG_NAND 1
#define CONFIG_SPI 1
#define CONFIG_I2C 1
#define CONFIG_EXTRA_ENV_SETTINGS \
"verify=yes\0" \
"bootfile=uImage\0" \
"ramdisk_file=ramdisk.gz\0" \
"loadaddr=0x81000000\0" \
"script_addr=0x80900000\0" \
"loadbootscript=fatload mmc 0 ${script_addr} boot.scr\0" \
"bootscript= echo Running bootscript from MMC/SD to set the ENV...; " \
"source ${script_addr}\0" \
"ubifsargs=setenv bootargs console=ttyO0,115200n8 mem=80M notifyk.vpssm3_sva=0xBFD00000 vram=4M " \
"cmemk.phys_start=0x85000000 cmemk.phys_end=0x89000000 cmemk.allowOverlap=1 earlyprintk " \
"ip=${ipaddr} " \
"rootfstype=ubifs root=ubi0:rootfs init=/init ubi.mtd=5,2048 " \
"rootwait=1 rw lpj=4997120\0" \
"nfsargs=setenv bootargs console=ttyO0,115200n8 mem=80M notifyk.vpssm3_sva=0xBFD00000 vram=4M cmemk.phys_start=0x85000000 cmemk.phys_end=0x89000000 cmemk.allowOverlap=1 earlyprintk lpj=4997120 " \
"ip=${ipaddr} " \
"root=/dev/nfs rw nfsroot=${serverip}:/home/davinci/dm8127/v3.8.0/Source/ipnc_rdk/target/filesys,nolock\0" \
"squashfsargs=setenv bootargs console=ttyO0,115200n8 mem=80M notifyk.vpssm3_sva=0xBFD00000 vram=4M cmemk.phys_start=0x85000000 cmemk.phys_end=0x89000000 cmemk.allowOverlap=1 earlyprintk lpj=4997120 " \
"ip=${ipaddr} " \
"noinitrd rootfstype=squashfs root=/dev/mtdblock4\0" \
"eraseall=nand erase\0" \
"erase_env=nand erase 180000 40000\0" \
"tftp_boot=ipnc_ff_init 1;tftpboot 0x81000000 dm8127_kernel.bin;bootm\0" \
"nfsboot=ipnc_ff_init 1;run nfsargs;nand read ${loadaddr} 1C0000 400000;bootm ${loadaddr}\0" \
"userboot=ipnc_ff_init 1;nand read ${loadaddr} 1C0000 400000;bootm ${loadaddr}\0" \
"squashfsboot=run squashfsargs;ipnc_ff_init 1;nand read ${loadaddr} 1C0000 400000; bootm ${loadaddr}\0" \
"ubifsboot=ipnc_ff_init 1;run ubifsargs;nand read ${loadaddr} 1C0000 400000;bootm ${loadaddr}\0" \
"uboot_tftp=ipnc_ff_init 1;tftp 0x81000000 dm8127_uboot.bin; go 0x81000000\0" \
"updatemin=mw.b 0x81000000 0xFF 0x20000;tftp 0x81000000 dm8127_min.bin;nand erase 0x0 0x20000;nand write.i 0x81000000 0x0 20000\0" \
"updateuboot=mw.b 0x81000000 0xFF 0x40000;tftp 0x81000000 dm8127_uboot.bin;nand erase 20000 160000;nand write.i 0x81000000 20000 ${filesize}\0" \
"updatekernel=tftp 0x81000000 dm8127_kernel.bin;nand erase 1C0000 640000;nand write.i 0x81000000 1C0000 ${filesize}\0" \
"updatebasefs=tftp 0x81000000 dm8127_basefs.bin;nand erase 800000 2300000;nand write.i 0x81000000 800000 ${filesize}\0" \
"updateubifs=tftp 0x81000000 dm8127_ubifs.bin;nand erase 2B00000 6E00000;nand write.i 0x81000000 2B00000 ${filesize}\0" \
""
#define CONFIG_BOOTCOMMAND "run squashfsboot" /or run ubifsboot /
(這裏定義上電UBOOT使用run ubifsboot或者 run nfsboot或者run userboot,可以在命令行使用:
Setenv bootcmd ‘run userboot’;saveenv去選擇默認上電啟動文件系統模式)
#define CONFIG_BOOTARGS \
"console=ttyO0,115200n8 mem=80M notifyk.vpssm3_sva=0xBF900000 vram=4M ubi.mtd=5 root=ubi0:rootfs rootfstype=ubifs rw rootwait=1 lpj=4997120 ip=${ipaddr}\0 "\

#endif
(
上面的有UBOOT 參數適合DDR3 為512M字節系統,我們為了方便NFS調試,定義了nfsargs,如果主文件系統使用squashfs文件系統,我們就使用squashfsargs。如果主文件系統使用ubifs,我們就使用ubifsargs。如果自己設置新的參數,可以setenv bootargs XXXXXXXX,然後使用上面的run userboot。
本公司DM8127開發板NAND FLASH分區信息:
0x000000000000-0x000000020000 : "U-Boot-min"
0x000000020000-0x000000180000 : "U-Boot"
0x000000180000-0x0000001c0000 : "U-Boot Env"
0x0000001c0000-0x000000800000 : "Kernel"
0x000000800000-0x000002b00000 : "Squash"
0x000002b00000-0x000009900000 : "ubifs"
0x000009900000-0x00000e900000 : "userapp"
0x00000e900000-0x000020000000 : "user data"
根據這個信息,我們再看看前面的run updatemin ; run updateuboot; run updatekernel;run updateubifs;
這些命令腳本是本公司自己寫的,
run updatemin 通過TFTPSERVER 下載dm8127_min.bin並燒寫到NAND FLASH;
run updateuboot下載dm8127_uboot.bin燒寫到NAND;
run updatekernel下載dm8127_kernel.bin燒寫到NAND;
run updateubifs下載dm8127_ubifs.bin燒寫到NAND。
上面有些參數就是cmem共享內存的定義,參考APPRO的定義就可以了,我們DM8127使用全速模式,不是低功耗模式,也不是內存DDR3只有256M那種。
)

#define CONFIG_IPADDR 192.168.1.188 (我們這裏定義開發環境的ipaddr)
#define CONFIG_SERVERIP 192.168.1.252 (我們這裏定義開發環境的serverip,比如tftp,NFS的主機IP)
#define CONFIG_GATEWAYIP 192.168.1.1
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_ETHADDR 00:11:22:33:44:55
(我們這裏定義板子的MAC地址,後面會在bootm.c添加代碼傳給kernel,見:
Arch/arm/lib/Bootm.c
在do_bootm_linux()加入:
#if 1 //added by jingbo
char buf1 = malloc(1024);
char
buf2 = malloc(32);

sprintf(buf2, "eth=%s", getenv ("ethaddr"));
sprintf(buf1, "%s %s", getenv ("bootargs"), buf2);
setup_commandline_tag (bd, buf1);

#endif
這段代碼就是如何把MAC地址通過bootargs傳給內核)

#ifndef CONFIG_TI814X_OPTI_CONFIG
#define CONFIG_AUTO_COMPLETE (UBOOT命令補全功能一定要打開,否則在uboot命令行無法使用tab鍵補全命令)
#define CONFIG_CMDLINE_EDITING(這個支持UBOOT命令行光標鍵查詢歷史命令,一般和CONFIG_AUTO_COMPLETE結合使用,一定要加上)
#endif

#define CONFIG_SYS_GBL_DATA_SIZE 128 / size in bytes reserved for
initial data
/

#define CONFIG_MISC_INIT_R 1
#ifndef CONFIG_TI814X_MIN_CONFIG
#define CONFIG_TI814X_ASCIIART 1 / The centaur /
#endif
#define CONFIG_SYS_AUTOLOAD "yes"
#ifndef CONFIG_TI814X_OPTI_CONFIG
#define CONFIG_CMD_CACHE
#define CONFIG_CMD_ECHO
#endif

/*

  • Miscellaneous configurable options
    */

/ max number of command args /
#define CONFIG_SYS_MAXARGS 32
/ Console I/O Buffer Size /
#define CONFIG_SYS_CBSIZE 512
/ Print Buffer Size /
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE \

  • sizeof(CONFIG_SYS_PROMPT) + 16)
    / Boot Argument Buffer Size /
    #define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE
    / memtest works on 8 MB in DRAM after skipping 32MB from start addr of ram disk/
    #define CONFIG_SYS_MEMTEST_START (PHYS_DRAM_1 + (64 1024 1024))
    #define CONFIG_SYS_MEMTEST_END (CONFIG_SYS_MEMTEST_START \
  • (8 1024 1024))
    #if defined(CONFIG_CMD_AUTOTEST)
    #define CONFIG_SYS_MEMTEST_SIZE 0x10000000 / autotest memory size/
    #endif
    #undef CONFIG_SYS_CLKS_IN_HZ / everything, incl board info, in Hz /
    #define CONFIG_SYS_LOAD_ADDR 0x81000000 / Default load address /
    #define CONFIG_SYS_HZ 1000 / 1ms clock /

/ Hardware related /

/**

  • Physical Memory Map(這裏定義2組DDR3的片選地址,每組256M,總共512M字節)
    /
    #define CONFIG_NR_DRAM_BANKS 2 /
    we have 2 banks of DRAM /
    #define PHYS_DRAM_1 0x80000000 /
    DRAM Bank #1 /
    #define PHYS_DRAM_1_SIZE 0x10000000 /
    256 MB /
    #define PHYS_DRAM_2 0xB0000000 /
    DRAM Bank #2 /
    #define PHYS_DRAM_2_SIZE 0x10000000 /
    256 MB */

/**

  • Platform/Board specific defs
    */
    #define CONFIG_SYS_CLK_FREQ 20000000
    #define CONFIG_SYS_TIMERBASE 0x4802E000

/*

  • NS16550 Configuration (定義串口的時鐘等等)
    /
    #define CONFIG_SERIAL_MULTI 1
    #define CONFIG_SYS_NS16550
    #define CONFIG_SYS_NS16550_SERIAL
    #define CONFIG_SYS_NS16550_REG_SIZE (-4)
    #define CONFIG_SYS_NS16550_CLK (48000000)
    #define CONFIG_SYS_NS16550_COM1 0x48020000 /
    Base EVM has UART0 */
    #define CONFIG_SYS_NS16550_COM2 0x48022000

#define CONFIG_BAUDRATE 115200
#define CONFIG_SYS_BAUDRATE_TABLE { 110, 300, 600, 1200, 2400, \
4800, 9600, 14400, 19200, 28800, 38400, 56000, 57600, 115200 }

/*

  • select serial console configuration
    */
    #define CONFIG_SERIAL1 1
    #define CONFIG_CONS_INDEX 1
    #define CONFIG_SYS_CONSOLE_INFO_QUIET

#if defined(CONFIG_NO_ETH)
#undef CONFIG_CMD_NET
#else
#define CONFIG_CMD_NET
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_PING
#endif

#if defined(CONFIG_CMD_NET)
#define CONFIG_DRIVER_TI_CPSW
#define CONFIG_MII
#define CONFIG_BOOTP_DEFAULT
#define CONFIG_BOOTP_DNS
#define CONFIG_BOOTP_DNS2
#define CONFIG_BOOTP_SEND_HOSTNAME
#define CONFIG_BOOTP_GATEWAY
#define CONFIG_BOOTP_SUBNETMASK
#define CONFIG_NET_RETRY_COUNT 10
#define CONFIG_NET_MULTI
#define CONFIG_PHY_GIGE
/ increase network receive packet buffer count for reliable TFTP /
#define CONFIG_SYS_RX_ETH_BUFFER 16
#endif

#if defined(CONFIG_SYS_NO_FLASH)
#define CONFIG_ENV_IS_NOWHERE
#endif

/ NAND support /
#ifdef CONFIG_NAND
#define CONFIG_CMD_NAND
#define CONFIG_NAND_TI81XX
//#define GPMC_NAND_ECC_LP_x16_LAYOUT 1 //Jingbo: for 16BIT NAND
#define GPMC_NAND_ECC_LP_x8_LAYOUT 1 //Jingbo: for 8bit NAND
#define NAND_BASE (0x08000000) (NAND FLASH芯片的片選地址 )
#define CONFIG_SYS_NAND_ADDR NAND_BASE / physical address /
/ to access nand /
#define CONFIG_SYS_NAND_BASE NAND_BASE / physical address /
/ to access nand at /
/ CS0 /
#define CONFIG_SYS_MAX_NAND_DEVICE 1 / Max number of NAND /
#endif / devices /

/ ENV in NAND /
#if defined(CONFIG_NAND_ENV)
#undef CONFIG_ENV_IS_NOWHERE
#define CONFIG_ENV_IS_IN_NAND 1
#ifdef CONFIG_ENV_IS_IN_NAND
#define CONFIG_SYS_MAX_FLASH_SECT 520 / max number of sectors in a chip /
#define CONFIG_SYS_MAX_FLASH_BANKS 2 / max number of flash banks /
#define CONFIG_SYS_MONITOR_LEN (256 << 10) / Reserve 2 sectors /
#define CONFIG_SYS_FLASH_BASE boot_flash_base
#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_FLASH_BASE
#define MNAND_ENV_OFFSET 0x180000 / environment starts here /(這裏我們定義uboot bootarg參數保存的起始地址)
#define CONFIG_SYS_ENV_SECT_SIZE boot_flash_sec
#define CONFIG_ENV_OFFSET boot_flash_off
#define CONFIG_ENV_ADDR MNAND_ENV_OFFSET
#endif

#ifndef ASSEMBLY
extern unsigned int boot_flash_base;
extern volatile unsigned int boot_flash_env_addr;
extern unsigned int boot_flash_off;
extern unsigned int boot_flash_sec;
extern unsigned int boot_flash_type;
#endif
#endif / NAND support /

#ifndef CONFIG_TI814X_OPTI_CONFIG
/ SPI support /
#ifdef CONFIG_SPI (如果使用SPI接口的FLASH,這個宏一定要編譯,我們公司板子沒用SPI FLASH)
#define CONFIG_OMAP3_SPI
#define CONFIG_MTD_DEVICE
#define CONFIG_SPI_FLASH
#define CONFIG_SPI_FLASH_WINBOND
#define CONFIG_CMD_SF
#define CONFIG_SF_DEFAULT_SPEED (75000000)
#define CONFIG_CODEC_AIC26 1
#endif

/ ENV in SPI /
#if defined(CONFIG_SPI_ENV)
#undef CONFIG_ENV_SIZE
#undef CONFIG_ENV_IS_NOWHERE
#define CONFIG_ENV_IS_IN_SPI_FLASH 1
#ifdef CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_SIZE 0x2000 /use a small env /
#define CONFIG_SYS_FLASH_BASE (0)
#define SPI_FLASH_ERASE_SIZE (4 1024) / sector size of SPI flash /
#define CONFIG_SYS_ENV_SECT_SIZE (2
SPI_FLASH_ERASE_SIZE) / env size /
#define CONFIG_ENV_SECT_SIZE (CONFIG_SYS_ENV_SECT_SIZE)
#define CONFIG_ENV_OFFSET (96 SPI_FLASH_ERASE_SIZE)
#define CONFIG_ENV_ADDR (CONFIG_ENV_OFFSET)
#define CONFIG_SYS_MAX_FLASH_SECT (1024) /
no of sectors in SPI flash /
#define CONFIG_SYS_MAX_FLASH_BANKS (1)
#endif
#endif /
SPI support */

/ ENV in MMC /
#if defined(CONFIG_MMC_ENV)
#undef CONFIG_ENV_IS_NOWHERE
#define CONFIG_ENV_IS_IN_MMC 1
#define CONFIG_SYS_MMC_ENV_DEV 0
#undef CONFIG_ENV_SIZE
#undef CONFIG_ENV_OFFSET
#define CONFIG_ENV_OFFSET (722931024)
#define CONFIG_ENV_SIZE (8
1024)
#endif / MMC support /

/ NOR support / (NOR FLASH芯片的支持,我們公司基本不用NOR FLASH了)
#if defined(CONFIG_NOR)
#undef CONFIG_CMD_NAND / Remove NAND support /
#undef CONFIG_NAND_TI81XX
#undef CONFIG_SKIP_LOWLEVEL_INIT
#define CONFIG_TI814X_CONFIG_DDR
#define CONFIG_SETUP_PLL
#define CONFIG_TI814X_EVM_DDR3
#undef CONFIG_ENV_IS_NOWHERE
#ifdef CONFIG_SYS_MALLOC_LEN
#undef CONFIG_SYS_MALLOC_LEN
#endif
#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE 1
#define CONFIG_SYS_MALLOC_LEN (0x100000)
#define CONFIG_SYS_FLASH_CFI
#define CONFIG_FLASH_CFI_DRIVER
#define CONFIG_FLASH_CFI_MTD
#define CONFIG_SYS_MAX_FLASH_SECT 512
#define CONFIG_SYS_MAX_FLASH_BANKS 1
#define CONFIG_SYS_FLASH_BASE (0x08000000)
#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_FLASH_BASE
#define CONFIG_ENV_IS_IN_FLASH 1
#define NOR_SECT_SIZE (128 1024)
#define CONFIG_SYS_ENV_SECT_SIZE (NOR_SECT_SIZE)
#define CONFIG_ENV_SECT_SIZE (NOR_SECT_SIZE)
#define CONFIG_ENV_OFFSET (2
NOR_SECT_SIZE)
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
#define CONFIG_MTD_DEVICE
#endif / NOR support /

/ No I2C support in 1st stage /
#ifdef CONFIG_I2C

#define CONFIG_CMD_I2C
#define CONFIG_CMD_DATE
#define CONFIG_I2C_MULTI_BUS (註意:DM8127支持I2C0,I2C1,I2C2幾個I2C總線)
#define CONFIG_SYS_RTC_BUS_NUM 0
#define CONFIG_TPS65911_I2C 1
#define CONFIG_RTC_TPS65911 1 (比如這裏電源管理芯片 使用I2C0總線)
#define CONFIG_CODEC_AIC3104 1
#define CONFIG_SENSOR_MT9J003 1
#define CONFIG_HARD_I2C 1
#define CONFIG_SYS_I2C_SPEED 100000 (I2C總線使用100K速率)
#define CONFIG_SYS_I2C_SLAVE 1
#define CONFIG_SYS_I2C_BUS 0
#define CONFIG_SYS_I2C_BUS_SELECT 1
#define CONFIG_DRIVER_TI81XX_I2C 1

/ EEPROM definitions /
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 3
#define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 6
#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 20

#endif

/ HSMMC support / (HSMMC這裏我們沒有用到)
#ifdef CONFIG_MMC
#define CONFIG_CMD_MMC 1
#define CONFIG_GENERIC_MMC
#define CONFIG_OMAP_HSMMC
#define CONFIG_DOS_PARTITION 1
#define CONFIG_CMD_FAT 1
#endif
#endif / CONFIG_TI814X_OPTI_CONFIG /
/ U-boot Version /
#define CONFIG_VERSION_VARIABLE
#ifdef CONFIG_TI814X_MIN_CONFIG
#define CONFIG_IDENT_STRING " DM8127_IPNC_3.80.00 min"
#else
#define CONFIG_IDENT_STRING " DM8127_IPNC_3.80.00"
#endif
/ Unsupported features /
#undef CONFIG_USE_IRQ

#endif / ! __CONFIG_TI8148_IPNC_H /

好了,u-boot/include/configs/ti8148_ipnc.h這個最重要的平臺信息匯總文件修改告一段落。

7、u-boot/arch/arm/lib/board.c和u-boot/board/ti/ti8148_ipnc/evm.c的修改
無論是ubootmin還是uboot,所有的DDR3初始化,NAND初始化,PLL初始化,外設芯片初始化,GPIO管腳復用設置,都在這兩個文件去修改。當然修改之前,一定要先了解DM8127的管腳復用,如果嵌入式軟件工程師特別是驅動工程師不了解這個管腳復用,根本就玩不轉DM8127。我們先看源碼:
u-boot/board/ti/ti8148_ipnc/mux.h
還要就是要看DM8127 芯片DATASHEET第153頁開始的表格(PINCNTLx Registers MUXMODE Functions),同時結合DM8127用戶手冊sprugz8g.pdf去分析DM8127功能模塊的復用情況。
這裏本人舉個例子:
/ 256-UART5_RXD 227-UART5_TXD /
/ldz_add (228)GP3_20:rs485_2_en/
/ -228 / BIT(0), BIT(5), BIT(5), BIT(7),
這裏是復用寄存器表從225到228對應的地址偏移,上面我們要把GP3_20設置成GPIO模式,使能UART5,那麽UART5對應PINCNTLx Registers MUXMODE Functions的管腳和對應的寄存器偏移地址是226和227,BIT(5)表示使用UART5,裏面的(5)標示第5種模式就是使用UART5,GP3_20要配置成GPIO模式必須設置228寄存器偏移地址為BIT(7),裏面的(7)表示GPIO模式。 (0)表示默認disable模式或者TI對應管腳默認模式。
上面提到的DM8127功能模塊初始化,我們需要看看board.c的sequence[]裏面的初始化函數和evm.c的board_init()函數。可以從這兩個文件去修改添加一些初始化,GPIO默認狀態初始化等等,看源代碼就清楚了,這裏不累贅。
DM8127的UBOOT裁剪和簡單移植上面基本介紹結束,本人這裏是介紹比較簡單,因為人家TI 第3方APPRO RDK軟件包做得很好了,比如在UBOOT測試一些外設硬件,可以看看common\ cmd_autotest.c,非常有用,當然你要在UBOOT添加很多功能,可以自己在這個RDK的UBOOT軟件包的基礎上深入去設計。有關DM8127開發攻略基本寫得差不多了,本人總發現時間不夠用,公司除了開發完DM8127各種客戶定義功能,還得忙開發廉價平臺海思平臺Hi3516A/D,這個廉價平臺1080P方案也基本開發結束。公司現在全力開發支持深度學習算法得一個新的嵌入式平臺,國內某個獨角獸公司已經推出類似產品了,還有其他大公司也開發出產品了,我們也不能落後太多,到時候再公布,為一些有好算法的公司提供可靠嵌入式平臺。本人這裏再次強調一下,DM8127適合傳統機器視覺算法運行,運行不了深度學習算法。在很多圖像分析方面,不一定要使用深度學習算法。還有, TI 的浮點DSP非常適合不同功能的C/C++算法移植,海思平臺的算法是固化到芯片,只能做某方面的圖像處理,而FPGA對很多只專長C/C++算法的而欠缺硬件知識來說,開發FPGA是一件很痛苦的事情,現在產品生命周期很短,抓緊時間搶占市場才是王道,否則到後期產品打價格戰,後來推出沒價格優勢的平臺會輸得很慘。

圖像識別DM8127開發攻略——UBOOT的移植說明