DM3730开发攻略已经停顿了一段时间,本人和公司其他软件工程师都在忙攻克客户定制的DM3730+OV的一款720P高清低照度产品和TVP5158 2路D1同时采集软件,现在基本收尾工作,挤点时间,继续写开发攻略,希望对在这方面开发的朋友有帮助。本篇文章是基于本公司(桐烨科技)DM3730超级开发板上面进行描述的,估计和TI EVM有点差别,或者和其他开发板公司有些差别,但问题不大,都有参考作用。
1、DM3730启动流程介绍
前面3篇文章已经从总体介绍DAVINCI低功耗芯片DM3730的性能、特点、开发环境和软件开发包,等等。下面就可以进入编程开发阶段了。DM3730 boot软件是Xloader和U-BOOT,这个和DM36X、DM6446、DM6467T(UBL+U-BOOT)有点不一样,和DM8148、DM8168系列的(U-BOOT MINI+UBOOT)又不一样。本来想把把xload和uboot一起写,现在觉得还是分开好,有时写太长的东西怕没这么多精力,还有u-boot-2010.06要移植的东西也比较多。这篇文章从软件角度重点如何让板子BOOT起来。开发驱动和系统软件前,有个DM3730非常重要的文件必须要介绍,这个文件就是DM3730系统开发技术参考手册——sprugn4q.pdf,或者TI已经把版本升级为sprugn4(x).pdf了,这个文件3673页,比较恐怖,里边很详细介绍整个DM3730的每个功能模块的结构和寄存器描述,等等,开发系统和驱动程序,绝对要认真看。
做好新的高频布线PCB板子回来,NAND FLASH里边是没有程序的,在保证板子电器特性稳定(主要是电源)稳定的情况下,如何让DM3730板子跑起来呢?这就要了解DM3730BOOT的过程。这一点在sprugn4q.pdf里边也有介绍,TI的图描述是这样的:
图-1 TI DM3730 BOOT初始化流程
图-1第一个Preinitialization预初始化是要求从硬件上设计出满足DM3730软件BOOT起来的环境,比如电源、时钟CLK、RESET、BOOT MODE选择电路等等。TI DAVINCI 芯片DM3730和DM81XX系列的电源管理相当复杂,TI专门为这些主CPU提供对应的电源管理芯片,比如DM3730使用Tps659xx系列的电源IC。时钟CLOCK电路涉及到外部晶振时钟和内部进行PLL时钟的设置,RESET复位电路涉及到冷复位和热复位等等,BOOT MODE选择涉及到是从NAND FLASH BOOT、MMC(SD卡) BOOT、USB BOOT、UART BOOT还是XIP BOOT等等,BOOT MODE选择可以使用电阻通过对sys_boot[5:0]信号脚上拉下拉,进行冷复位上电选择。
图-1 第2个框图描述的是DM3730系统电源、时钟、复位的上电复位时序,这个很讲究的,以前写DM6446、DM368开发攻略没有提到这点,其实这些芯片都有上电复位时序。而在DM3730中,电源管理芯片Tps659xx已经帮你实现这些时序的要求。
图-1 第3个框图说明DM3730内部的COTEX-A8会从片上的ROM代码区开始运行,这个ROM CODE已经存在芯片内部,然后根据BOOT MODE,去读取对应的NAND接口、MMC接口、UART接口、USB接口等等放置的代码——Xloader,而Xloader编译出来的文件是MLO文件。比如从MMC (SD卡)BOOT的时候,如果没有SD卡,ROM CODE会转到NAND FLASH上去找Xloader,如果NAND FLASH没有Xloader,就会去找UART接口,这个顺序有很多种,可以看看sprugn4q.pdf文档。举个例子,我们就把特殊格式化的SD卡或TF卡(使用TI要求的或提供的格式化软件),COPYMLO文件到SD卡上,这样一上电片上的ROM CODE就会把MLO给运行起来。下面本人把本公司的开发板上电串口信息COPY上来,让大家更加了解这个过程。
60 (这个60表明ROMCODE已经运行起来)
Texas Instruments X-Loader 1.51 (Jun 1 2013 - 15:31:34) (开始运行Xloader代码——MLO)
Starting X-loader on MMC (如果使用NAND BOOT,这里显示的信息不一样)
Reading boot sector
231524 Bytes Read from MMC (Xloader开始从SD卡读U-BOOT的代码)
Starting OS Bootloader from MMC...
Starting OS Bootloader...
U-Boot 2010.06-rc2 (Oct 29 2013 - 21:34:04) (开始运行U-BOOT)
OMAP34xx/35xx-GP ES2.1, CPU-OPP2 L3-165MHz
OMAP3 EVM board + LPDDR/NAND
I2C: ready
DRAM: 512 MiB
NAND: 512 MiB
*** Warning - bad CRC or NAND, using default environment
In: serial
Out: serial
Err: serial
Die ID #439600029e3800000149c75518033013
Net: resettingDM9000
dm9000
Hit ' ' or 'CR' or 'Esc' key to stop autoboot: 0 (一上电就回车或空格进入U-BOOT命令行)
DM3730->
DM3730->
上面就是SD卡或TF卡BOOT的过程,一般工厂生产的时候,通过跳线帽对BOOT MODE的sys_boot[5:0]进行电平设置,选择SD卡 BOOT或UART串口BOOT,毕竟NAND里边SMT贴片出来是没有程序的,当然有些超大批量生产会使用特殊的烧录器对NAND进行预先烧写。无程序的板子维修的时候一般也是使用跳线帽对sys_boot[5:0]进行电平设置,选择不同的BOOT MODE进行启动板子,目的就是让板子跑进U-BOOT再说,U-BOOT起来什么都好说。
图-1 第4个框图就是Xloader,第5个框图就是U-BOOT和后面跑起来的kernel、挂载文件系统(ubifs,yaffs2,jaffs2等)、各种linux应用程序。
2、xload-1.51移植
依据上篇《DAVINCI DM3730开发攻略——DVSDK4_03和双核CODEC机制介绍.doc》的介绍,在dvsdk4_03\psp目录下,有TI 提供的x-load-1.51-psp04.02.00.07.sdk源码,我们就在这个源码上就行修改移植。由于前面介绍DM3730支持好多种接口BOOT,我们做产品必须根据产品的特性选择不同的BOOT MODE,在这里我们公司使用NAND BOOT和MMC BOOT模式。
第一步,在dvsdk4_03\psp\目录下生成x-load-1.51和x-load-1.51-mmc两个文件,前面的x-load-1.51是要烧写进NAND FLASH的,而x-load-1.51-mmc编译出来的MLO是为了生产和测试维修使用的。然后把x-load-1.51-psp04.02.00.07.sdk里边的源码COPY过来,而x-load-1.51-psp04.02.00.07.sdk里边的源码保持不动,是出于备份和以后出问题的对比参照源码而考虑的。而x-load-1.51是我们要移植的,想怎么改都可以。
第一步,裁剪多余的文件夹和文件,在dvsdk4_03\psp\x-load-1.51\board目录下只保留omap3evm文件夹,其他OMAP芯片平台删除掉,dvsdk4_03\psp\x-load-1.51\include\configs目录下只保留omap3evm.h,没办法,本人追求简洁。
第三步,在dvsdk4_03\psp\x-load-1.51目录下生成build-x-load.sh的文件,内容如下:
#for building x-load
exportPATH=$PATH:/home/davinci/dm3730/dvsdk4_03/linux-devkit/bin:(这行可以不要)
make distclean
make omap3evm_config
make
./signGP x-load.bin
chmod 777 x-load.bin.ift
cp x-load.bin.ift dm3730_xload.bin
cp dm3730_xload.bin /tftpboot
就是编译的时候直接运行build-x-load.sh就可以得到我们想要的dm3730_xload.bin,这个dm3730_xload.bin就是要烧写到NAND FLASH的,到时候会通过U-BOOT进行烧写。Xloader放在NAND FLASH的地址范围是0x00000000-0x00080000,其实放到第一个BLOCK 0x00000000-0x00020000就够了,而从0x000080000的开始地方保存u-boot.bin,这个后面移植u-boot会提到。build-x-load.sh提到一个signGP的工具,这个一般卖开发板的公司都会提供这个工具,同时也把signGP放到这个x-load-1.51目录下。上面sh文件make后会直接生成x-load.bin,但是x-load.bin是不能直接被片上的ROM CODE识别的,所以就需要signGP转化一下,得到x-load.bin.ift,然后重新命名成dm3730_xload.bin并COPY到/tftpboot,到时候可以通过U-BOOT TFTP烧写,等等。
第四步,开始修改源码移植。为了使上面编译出来的dm3730_xload.bin烧到NAND FLASH能让ROM CODE识别,我们还得对x-load-1.51里边的源码进行修改,让这个x-load-1.51能够NAND BOOT,这里必须修改x-load-1.51\include\configs\omap3evm.h的一个宏定义:
/* Enable the below macro if MMC bootsupport is required */
//#define CONFIG_MMC 1 //Jingbo: for nand
就是要把#defineCONFIG_MMC给屏蔽掉。
x-load-1.51相对u-boot 来说,代码比较简单,文件也比较少,但是整个源码工程也是参考了u-boot的结构,很像u-boot的源码组织,主要关注x-load-1.51\Makefile,x-load-1.51\board\omap3evm\omap3evm.c和platform.S,x-load-1.51\include\configs\omap3evm.h。
先改x-load-1.51\Makefile:
第56行,
#CROSS_COMPILE = arm-none-linux-gnueabi- (屏蔽这个)
CROSS_COMPILE =arm-arago-linux-gnueabi- (使用开发环境篇介绍的linux-devkit交叉编译工具)
第149行的
omap3evm_config : unconfig
@./mkconfig$(@:_config=) arm omap3 omap3evm
这个就没必要改动了。Make编译就使用omap3evm_config。如果你喜欢改成你自己的板子也可以,和u-boot一样。
改动x-load-1.51\include\configs\omap3evm.h:
屏蔽第74行://#defineCONFIG_DDR_256MB_STACKED
根据自己板子的特性,如果使用UART1做为LINUX的调试口,则
#defineCFG_NS16550_COM1 OMAP34XX_UART1
/*
* select serial console configuration
*/
#defineCONFIG_SERIAL1 1 /* UART1 on OMAP3EVM */
#defineCONFIG_CONS_INDEX 1
不需要改动,如果是UART3什么的把那个1改成3就OK。
#defineNAND_UBOOT_START 0x0080000 /*Leaving first 4 blocks for x-load */
#defineNAND_UBOOT_END 0x0100000 /*Giving a space of 4 blocks = 512KB */
#defineNAND_BLOCK_SIZE 0x20000
这里的定义也需要注意,就是u-boot.bin到底要存放NAND FLASH什么地方,从什么地方开始,到什么地方结束,这在x-load-1.51 \lib\board.c里start_armboot()会用到。
改动x-load-1.51\board\omap3evm\platform.S:
这个汇编文件就是要做好DM3730最基本的初始化、设置PLL时钟,GPMC接口时序设置等等重要的东西,深入研究必须要看看sprugn4q.pdf里边有关COTEX-A8的主时钟设置,IVA2.2(C64+DSP)的时钟设置。在Xlaoder工程里,这个platform.S汇编代码就是COTEX-A8最开始运行的代码,它会调用到omap3evm.c\s_init的C函数。如果只是学习过程,可以不用改这个文件。
改动x-load-1.51\board\omap3evm\omap3evm.c:
这个文件主要配置DM3730最小系统的运行环境了,文件里边描述的MPU就是COTEX-A8,IVA就是C64+ DSP和图像协处理器,所以在这里设置MPU PLL,IVA PLL,DDR的时序配置,GPMC时序设置(就是NAND FLASH接口)。还有DM3730和OMAP3630 CPU基本一样,所以有些条件判断是CPU_OMAP36XX平台的也等同DM3730平台。
在s_init(void)函数里,我们要把
// if((get_mem_type() == GPMC_NAND) || (get_mem_type() == MMC_NAND))
// nand_init(); //Jingbo: disable
给屏蔽掉,因为我们使用MMC-NAND-UART3BOOT 模式。
DDR的配置在config_3430sdram_ddr()函数,可以配置165M的频率,也可以配置200M的频率,这里就不详细说了,看代码和手册。
per_clocks_enable(void)函数就是在Xloader里边就开始设置这些外边并行接口的时钟,比如UART3,I2C,MMC,等等。
然后重点说一下就是#defineMUX_DEFAULT()
DM3730有423脚和515脚的芯片,芯片封装又分为CUS、CBP、CBC等等。不同的封装的管脚描述是不一样的,而管脚复用更是不一样。DM81XX系列也一样,芯片越来越强大,管脚复用越来越复杂,这个让开发的人非常头疼。
set_muxconf_regs函数会用到#define MUX_DEFAULT()的定义,这里确定某个管脚是GPIO功能还是其他接口功能,都在这里定义
/*
*IEN - Input Enable
*IDIS - Input Disable
*PTD - Pull type Down
*PTU - Pull type Up
*DIS - Pull type selection is inactive
*EN - Pull type selection is active
*M0 - Mode 0
*The commented string gives the final mux configuration for that pin
*/
TI 源码给出这个说明,我想详细看看代码会明白如何修改#define MUX_DEFAULT()。这里还有看看DM3730的芯片DATASHEET第2章,里边说明每个功能管脚都有7种复用模式,比如GPIO使用M4模式。修改这个内容一定要搞清楚你的DM3730芯片是什么型号和封装。当然,你也可以不用在Xloader修改,因为在U-BOOT的代码里边还会有这个管脚复用修改表。同样在内核源码也有这个定义。其实就是重复设置了。
第五步,编译修改生产测试维修用的x-load-1.51-mmc,因为本公司做的产品都带SD卡或TF卡,所以我们的sys_boot[5:0]模式是默认MMC---NAND----UART3的模式(或者也可以类似做个x-load-1.51-uart的模式)。把x-load-1.51里边修改好的源码全部COPY过来,然后修改x-load-1.51-mmc\include\configs\omap3evm.h第47行:
/* Enable the below macro if MMC bootsupport is required */
#define CONFIG_MMC 1 //Jingbo MLO for mmc
就是要打开这个CONFIG_MMC
然后修改x-load-1.51-mmc\build-x-load.sh
exportPATH=$PATH:/home/davinci/dm3730/dvsdk4_03/linux-devkit/bin:
make distclean
make omap3evm_config
make
./signGP x-load.bin
chmod 777 x-load.bin.ift
cp x-load.bin.ift MLO
直接执行./ build-x-load.sh就得到我们想要的MLO。前面说过这个MLO和后面要讲到的u-boot.bin一起COPY到SD卡或TF卡里边,才能被DM3730片上ROM CODE运行起来,最后进入u-boot的命令行里进行其他烧写操作。这里我们需要使用SD卡或TF卡转USB接口的转接器,市场上面一般几块钱一个,然后使用特殊的格式化工具(比如HP USB Disk Storage Format Tool),进行格式化,绝对不能用XP或WIN7自带的方法直接FAT32格式化,否则DM3730不认。把带有MLO和u-boot.bin的sd卡插上,这两个文件名字不要乱改其他名字,然后给板子上电,出现前面的串口信息才是OK的。
好了,到这里整个DM3730 BOOT过程和Xloader的移植也说完了,具体的操作还需要亲自编译调试烧写等工作才能更好的掌握。这里确实没太多精力为每个函数都得去介绍。由于时间紧,估计有些问题没时间详细描述,其实都需要看手册、代码、DDR NAND芯片手册就可以搞定。后面还会写到u-boot的移植,内核的移植,关键要看看给其他客户定制的项目进展如何,更高级的高清浮点CPU项目研发进展如何,或者春节有时间写写,明年就要写更高级的CPU开发攻略了。
(声明:
桐烨科技DM3730/DM6446的板子和其他公司的开发板不一样,特别是DM3730的板子,目前国内好多家公司都只提供ARM端(CORTEX-A8)的应用例子,很少介绍如何添加客户自己的算法到DSP端的例子,有些需要做DSP算法的人贪便宜,结果买这些便宜的板子回去花大量时间来学习,迟迟搞不清楚整个架构,浪费的这些时间难道不是资金吗?我们桐烨科技的板子都帮你采集好YUV格式的视频图像,并教会你如何把这个原始的图像数据放到DSP端进行处理,然后再教会你如何传处理过的图像数据和参数到ARM端。同时提醒客户还要注意一些冒牌的公司,特别是杭州有家没道德的公司直接拿我们桐烨科技的DM3730开发板图片放到他们公司网站上,欺骗其他人,我们桐烨科技从来没有想到让其他公司做代理。
)