【原文:http://zjbintsystem.blog.51cto.com/964211/1346487】
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_03psp
目录下,有TI
提供的x-load-1.51-psp04.02.00.07.sdk
源码,我们就在这个源码上就行修改移植。由于前面介绍DM3730
支持好多种接口BOOT
,我们做产品必须根据产品的特性选择不同的BOOT
MODE
,在这里我们公司使用NAND BOOT
和MMC BOOT
模式。
第一步,在dvsdk4_03psp
目录下生成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_03pspx-load-1.51oard
目录下只保留omap3evm
文件夹,其他OMAP
芯片平台删除掉,dvsdk4_03pspx-load-1.51includeconfigs
目录下只保留omap3evm.h
,没办法,本人追求简洁。
第三步,在dvsdk4_03pspx-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.51includeconfigsomap3evm.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.51Makefile
,x-load-1.51oardomap3evmomap3evm.c
和platform.S
,x-load-1.51includeconfigsomap3evm.h
。
先改x-load-1.51Makefile
:
第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.51includeconfigsomap3evm.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 liboard.c
里start_armboot()
会用到。
改动x-load-1.51oardomap3evmplatform.S
:
这个汇编文件就是要做好DM3730
最基本的初始化、设置PLL
时钟,GPMC
接口时序设置等等重要的东西,深入研究必须要看看sprugn4q.pdf
里边有关COTEX-A8
的主时钟设置,IVA2.2
(C64+DSP
)的时钟设置。在Xlaoder
工程里,这个platform.S
汇编代码就是COTEX-A8
最开始运行的代码,它会调用到omap3evm.cs_init
的C
函数。如果只是学习过程,可以不用改这个文件。
改动x-load-1.51oardomap3evmomap3evm.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-mmcincludeconfigsomap3evm.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-mmcuild-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开发板图片放到他们公司网站上,欺骗其他人,我们桐烨科技从来没有想到让其他公司做代理。
)
本文出自 “
集成系统-踏上文明的征程” 博客,请务必保留此出处
http://zjbintsystem.blog.51cto.com/964211/1346487