zhouning201 发表于 2011-12-2 19:28

DM6446开发攻略:UBL移植 (转帖)

<DIV>&nbsp;&nbsp;&nbsp; UBL的程序设计,相对UBOOT、KERNEL、ROOTFS、设备驱动、DSP开发来说,还是比较简单。我们先从DAVINCI的启动说起,了解UBL在DAVIN系统中的位置和作用。对于固件程序烧写在NAND FLASH 的Davinci dm644x嵌入式系统, 上电启动的过程如下:
<DIV>&nbsp;<IMG src="http://www.faxplus.com.cn/html/UploadFile/201121716476421.JPG"></DIV>
<DIV>&nbsp;</DIV>
<DIV>RBL(ARM ROM Boot Loader)在芯片出厂的时候就已经烧写到ROM里了,这不需要大家关心,上电后,RBL会自动从EMIFA EM_CS2 memory space (0x0200 0000). 执行指令,这个地址就是NAND FLASH 或NOR FLASH的片选起始地址。当你的系统设置为NAND BOOT的时候,UBL(User Boot Loader)是必不可少的,否则RBL不能直接把UBOOT给BOOT起来,因为RBL只支持14K NAND FLASH 的 BOOT程序,而UBOOT编译出来后的bin文件一般都大于80K,特别是版本越高,UBOOT的代码越大,所以这时候就需要写一个UBL。UBL 从NAND FLASH 读取UBOOT,然后把UBOOT COPY 到 DDR2(RAM)的相关地址上,然后把UBOOT 给BOOT 起来。根据TI DAVIN RBL的规定,不同型号的NAND FLASH,UBL保存的地址是不同的,512字节PAGE 的NAND(即SMALL PAGE),保存的地址是:0x00004000;2048字节PAGE的NAND (即LARGE PAGE)保存的地址是:0x20000。至于如何通过XDS560仿真器烧写UBL或通过UART BOOT烧写UBL,本人放在DAVINCI UBOOT移植的文章介绍。(提示:RBL和UBL不要混淆!多看看BOOT的顺序图。)</DIV>
<DIV>UBL的移植,比较简单,当然,前提条件你已经搭好交叉编译环境。进入UBL文件包最上层的文件夹,使用make 就可以编译出:ubl_davinci_nand.bin。UBL主要有:</DIV>
<DIV>ubl.c</DIV>
<DIV>dm644x.c</DIV>
<DIV>util.c</DIV>
<DIV>nand.c</DIV>
<DIV>nandboot.c</DIV>
<DIV>nor.c</DIV>
<DIV>norboot.c</DIV>
<DIV>uart.c</DIV>
<DIV>uartboot.c</DIV>
<DIV>ubl_davinci.lds</DIV>
<DIV>相关的*.h 文件和两个makefile文件。如果最上层的makefile选择$(MAKE) -C src FLASH=nand,表示使用ARM nand flash boot模式,这时NOR,UART BOOT模式相关的c文件不会编译。</DIV>
<DIV>介绍一下:</DIV>
<DIV>ubl_davinci.lds: 指定UBL的SECTIONS及UBL本身的入口地址;</DIV>
<DIV>ubl.c:从selfcopy函数开始运行,COPY自己到RAM,然后跳到正常入口地址,执行boot(),main()等函数,调用DM644xInit(),COPY UBOOT到RAM相关地址,最后执行UBOOT的入口地址(EntryPoint),这时UBOOT就可以运行了。</DIV>
<DIV>dm644x.c:主要配置最小系统,比如关中断、PLL1、PLL2设置、DDR2 时序设置、UART设置,等等。</DIV>
<DIV>util.c:是一些相关的malloc等公共函数。</DIV>
<DIV>nand.c:主要是NAND FLASH的驱动;</DIV>
<DIV>nandboot.c:主要是实现NAND_Copy,把UBOOT从NAND COPY到相应的DDR2(RAM)里。</DIV>
<DIV>UBL要移植的东西不是很多,主要是在dm644x.c里要定义好:</DIV>
<DIV>Uint32 PLL1_Mult = 22;&nbsp; // DSP=594 MHz for DM6446,DM6441一般使用Uint32 PLL1_Mult = 19;&nbsp; // DSP=513 MHz。在PLL2Init()函数里,使用不同型号的DDR,要设置不同的参数,即时序参数等,这是关键的地方。</DIV>
<DIV>Nand.c及nand.h主要移植就是定义好UBOOT在NAND的存储地址,不同型号的NAND FLASH ,比如SMALL PAGE(512字节)和LARGE PAGE(2048字节)这些都要修改除非你的NAND的类型和TI EVM 兼容。</DIV>
<DIV>nandboot.c主要任务就是如何把u-boot.bin或带有头的u-boot.img正确COPY到DDR里,这里最容易出问题,编译出来的U-BOOT文件一般带有Valid magic number(MAGIC_NUMBER_VALID),入口地址entrypaoit,这些信息不对都使UBOOT 运行不起来,建议看一下或COPY UBOOT的image.h。</DIV>
<DIV>UBL把UBOOT运行起来,很多事情都可以做了,LINUX KERNEL,ROOTFS,NFS,DSP,设备驱动,应用等等,都可开始按部就班开发。</DIV></DIV>

blookking 发表于 2016-11-14 13:59

转载要说明出处,这是桐烨科技老板写的!

blookking 发表于 2016-11-14 14:00

转载的也没有转载全,想看的去51blog上看
页: [1]
查看完整版本: DM6446开发攻略:UBL移植 (转帖)