DM3730开发攻略已经停顿了一段时间,本人和公司其他软件工程师都在忙攻克客户定制的DM3730+OV的一款720P高清低照度产品和TVP5158  2D1同时采集软件,现在基本收尾工作,挤点时间,继续写开发攻略,希望对在这方面开发的朋友有帮助。本篇文章是基于本公司(桐烨科技)DM3730超级开发板上面进行描述的,估计和TI EVM有点差别,或者和其他开发板公司有些差别,但问题不大,都有参考作用。


1、DM3730启动流程介绍


前面3篇文章已经从总体介绍DAVINCI低功耗芯片DM3730的性能、特点、开发环境和软件开发包,等等。下面就可以进入编程开发阶段了。DM3730 boot软件是XloaderU-BOOT,这个和DM36XDM6446DM6467TUBL+U-BOOT)有点不一样,和DM8148DM8168系列的(U-BOOT MINI+UBOOT)又不一样。本来想把把xloaduboot一起写,现在觉得还是分开好,有时写太长的东西怕没这么多精力,还有u-boot-2010.06要移植的东西也比较多。这篇文章从软件角度重点如何让板子BOOT起来。开发驱动和系统软件前,有个DM3730非常重要的文件必须要介绍,这个文件就是DM3730系统开发技术参考手册——sprugn4q.pdf,或者TI已经把版本升级为sprugn4(x).pdf了,这个文件3673页,比较恐怖,里边很详细介绍整个DM3730的每个功能模块的结构和寄存器描述,等等,开发系统和驱动程序,绝对要认真看。

做好新的高频布线PCB板子回来,NAND FLASH里边是没有程序的,在保证板子电器特性稳定(主要是电源)稳定的情况下,如何让DM3730板子跑起来呢?这就要了解DM3730BOOT的过程。这一点在sprugn4q.pdf里边也有介绍,TI的图描述是这样的:

DAVINCI DM3730开发攻略——xload-1.51移植_第1张图片

-1 TI DM3730 BOOT初始化流程

-1第一个Preinitialization预初始化是要求从硬件上设计出满足DM3730软件BOOT起来的环境,比如电源、时钟CLKRESETBOOT MODE选择电路等等。TI DAVINCI 芯片DM3730DM81XX系列的电源管理相当复杂,TI专门为这些主CPU提供对应的电源管理芯片,比如DM3730使用Tps659xx系列的电源IC。时钟CLOCK电路涉及到外部晶振时钟和内部进行PLL时钟的设置,RESET复位电路涉及到冷复位和热复位等等,BOOT MODE选择涉及到是从NAND FLASH BOOTMMCSD卡) BOOTUSB BOOTUART BOOT还是XIP BOOT等等,BOOT MODE选择可以使用电阻通过对sys_boot[5:0]信号脚上拉下拉,进行冷复位上电选择。

-1 2个框图描述的是DM3730系统电源、时钟、复位的上电复位时序,这个很讲究的,以前写DM6446DM368开发攻略没有提到这点,其实这些芯片都有上电复位时序。而在DM3730中,电源管理芯片Tps659xx已经帮你实现这些时序的要求。

-1 3个框图说明DM3730内部的COTEX-A8会从片上的ROM代码区开始运行,这个ROM CODE已经存在芯片内部,然后根据BOOT MODE,去读取对应的NAND接口、MMC接口、UART接口、USB接口等等放置的代码——Xloader,而Xloader编译出来的文件是MLO文件。比如从MMC SDBOOT的时候,如果没有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卡或TFBOOT的过程,一般工厂生产的时候,通过跳线帽对BOOT MODEsys_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应用程序。


2xload-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 BOOTMMC BOOT模式。

第一步,在dvsdk4_03\psp\目录下生成x-load-1.51x-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.binCOPY/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\Makefilex-load-1.51\board\omap3evm\omap3evm.cplatform.Sx-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改成3OK


#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.cstart_armboot()会用到。


改动x-load-1.51\board\omap3evm\platform.S

这个汇编文件就是要做好DM3730最基本的初始化、设置PLL时钟,GPMC接口时序设置等等重要的东西,深入研究必须要看看sprugn4q.pdf里边有关COTEX-A8的主时钟设置,IVA2.2C64+DSP)的时钟设置。在Xlaoder工程里,这个platform.S汇编代码就是COTEX-A8最开始运行的代码,它会调用到omap3evm.c\s_initC函数。如果只是学习过程,可以不用改这个文件。


改动x-load-1.51\board\omap3evm\omap3evm.c


这个文件主要配置DM3730最小系统的运行环境了,文件里边描述的MPU就是COTEX-A8IVA就是C64+ DSP和图像协处理器,所以在这里设置MPU PLLIVA PLLDDR的时序配置,GPMC时序设置(就是NAND FLASH接口)。还有DM3730OMAP3630 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里边就开始设置这些外边并行接口的时钟,比如UART3I2CMMC,等等。

然后重点说一下就是#defineMUX_DEFAULT()

DM3730423脚和515脚的芯片,芯片封装又分为CUSCBPCBC等等。不同的封装的管脚描述是不一样的,而管脚复用更是不一样。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的芯片DATASHEET2章,里边说明每个功能管脚都有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.h47行:

/* 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一起COPYSD卡或TF卡里边,才能被DM3730片上ROM CODE运行起来,最后进入u-boot的命令行里进行其他烧写操作。这里我们需要使用SD卡或TF卡转USB接口的转接器,市场上面一般几块钱一个,然后使用特殊的格式化工具(比如HP USB Disk Storage Format Tool),进行格式化,绝对不能用XPWIN7自带的方法直接FAT32格式化,否则DM3730不认。把带有MLOu-boot.binsd卡插上,这两个文件名字不要乱改其他名字,然后给板子上电,出现前面的串口信息才是OK的。


好了,到这里整个DM3730 BOOT过程和Xloader的移植也说完了,具体的操作还需要亲自编译调试烧写等工作才能更好的掌握。这里确实没太多精力为每个函数都得去介绍。由于时间紧,估计有些问题没时间详细描述,其实都需要看手册、代码、DDR NAND芯片手册就可以搞定。后面还会写到u-boot的移植,内核的移植,关键要看看给其他客户定制的项目进展如何,更高级的高清浮点CPU项目研发进展如何,或者春节有时间写写,明年就要写更高级的CPU开发攻略了。


(声明:

    桐烨科技DM3730/DM6446的板子和其他公司的开发板不一样,特别是DM3730的板子,目前国内好多家公司都只提供ARM(CORTEX-A8)的应用例子,很少介绍如何添加客户自己的算法到DSP端的例子,有些需要做DSP算法的人贪便宜,结果买这些便宜的板子回去花大量时间来学习,迟迟搞不清楚整个架构,浪费的这些时间难道不是资金吗?我们桐烨科技的板子都帮你采集好YUV格式的视频图像,并教会你如何把这个原始的图像数据放到DSP端进行处理,然后再教会你如何传处理过的图像数据和参数到ARM端。同时提醒客户还要注意一些冒牌的公司,特别是杭州有家没道德的公司直接拿我们桐烨科技的DM3730开发板图片放到他们公司网站上,欺骗其他人,我们桐烨科技从来没有想到让其他公司做代理。