图像识别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=$(PLATFORM_CFG)_$(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=$(PLATFORM_CFG)_$(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是一件很痛苦的事情,现在产品生命周期很短,抓紧时间抢占市场才是王道,否则到后期产品打价格战,后来推出没价格优势的平台会输得很惨。