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应用程序。

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 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开发板图片放到他们公司网站上,欺骗其他人,我们桐烨科技从来没有想到让其他公司做代理。

DAVINCI DM3730开发攻略——xload-1.51移植相关推荐

  1. DAVINCI DM3730开发攻略——U-BOOT-2010.06的移植

    说来惭愧,又很长时间没更新文章了,本来这篇文章可以春节过来搞定的,结果春节回到公司,大客户一直要求抓紧时间设计DM3730平台的720P宽动态低照度相机产品,和另外两款多网口的DM3730产品的样机, ...

  2. DAVINCI DM3730开发攻略——应用程序例程分析

    过完2015年春节回来了,利用上班前的几天时间,先把这篇文章写完,本来是先写<DAVINCI DM3730开发攻略--linux-2.6.32移植>,但是那篇文章涉及内核的东西太多,不太好 ...

  3. DAVINCI DM3730开发攻略——开发环境篇

    深圳的春天,梧桐山上绿意浓浓,山花醉人香,蜂蝶采蜜忙!现在只能在山上看到这些生机勃勃的景象了,山下的水污染完了,空气也不咋样.但相对北方的兄弟姐妹长期生活在灰霾和沙尘的环境,这里也很难得了,地下水的污 ...

  4. DAVINCI DM3730开发攻略——DVSDK4_03和双核CODEC机制介绍

    在上篇介绍了DM3730的开发环境,我们现在可以进入设计阶段了.再次声明:本人写这些文章只是给那些爱好DAVINCI的朋友提供一些技术上的支持,缩短大家的学习的时间,让大家有更多剩余的时间做其他有益的 ...

  5. DAVINCI DM3730开发攻略——序

    [原文:http://zjbintsystem.blog.51cto.com/964211/1108225]         走进2013年了,去年长长一年没有时间写博客,因为两个大客户定制的板子一直 ...

  6. Davinci DM6446开发攻略——linux-2.6.18移植

      TI DAVINCI 使用最新的内核是 montavista linux-2.6.18 ,之前说过,国内很多公司,包括开发板的软件包,一直在使用 montavista linux-2.6.10 , ...

  7. davinci DM365-DM368开发攻略—linux-2.6.32移植

    本文最始出自http://www.360doc.com/content/12/0318/16/532901_195392228.shtml 一.介绍linux-2.6.32: Linux-2.6.32 ...

  8. Davinci DM6446开发攻略——u-boot-1.3.4移植(1)

    UBOOT的版本更新速度比较快,截止今天,稳定正式的版本是u-boot-2009.11-rc2,而TI最新的EVM开发包里的UBOOT是1.2.0版本,国内很多公司还一直使用u-boot-1.1.4和 ...

  9. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写

    很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-boot ...

最新文章

  1. hdu 4263(有限制的生成树)
  2. wex5 教程 之 图文讲解 智能数据库设计 之(1) 触发器
  3. 【Linux】一步一步学Linux——systemctl命令(147)
  4. cocos2d-x游戏实例(18)-纵版射击游戏(5)
  5. 【最全解析】1050 螺旋矩阵 (25分)
  6. 利用DHT22和Arduino测量温湿度并显示在串口和OLED显示屏上
  7. Vue入门 ---- 组件式开发
  8. Java 读取 INI 配置文件的方法
  9. python分配问题_1.1python解决数学建模之席位分配问题
  10. python基础01day
  11. FISCO BCOS (六)———ubantu安装mysql5.7
  12. 毕业设计基于SpringBoot框架的作业查重系统
  13. c语言盆子接球游戏,适合幼儿园孩子的70个感统训练游戏(开发右脑)
  14. Python 复数类型(详解)
  15. 华硕路由域名访问_使用金万维宽带通云解析实现用友T+异地访问
  16. android studio DDMS debug process 无法激活,小虫子灰色
  17. 记录在使用类加载器的时候遇到的一个错误:java.lang.LinkageError
  18. 访达前往文件夹_(苹果电脑excle没有查找全部)苹果笔记本有没有自带excel
  19. android 手机文件及文件夹目录详解
  20. 北京到平谷石林峡旅游包车攻略

热门文章

  1. ArcGIS制作四色地图
  2. 两种常见电商sku的设计
  3. javascript设计模式-代理模式
  4. kafka-eagle 使用
  5. mysql怎么给用户加权限_mysql怎么给用户加权限
  6. C语言已经被淘汰了吗,编程入门的最佳选择已经不是C语言了吗?
  7. 浅析Activity启动模式
  8. html控制智能家居,一种基于数据库中间件和HTML5的智能家居控制软件系统
  9. python豆瓣历史评分_基于Python的豆瓣电影评分查询器
  10. NASM import win32api