DM6441的開機選項
Power on,根據BOOTCFG register,共有四種開機選項:
1.BOOTCFG=0x01, EMIFA boot mode, 直接從NOR flash(0x02000000)開始執行。
2.BOOTCFG=0x00, NAND boot mode, 從internal ROM執行RBL,RBL將UBL從NAND載入internal RAM, UBL將u-boot從NAND載入DDR,u-boot將uImage載入DDR,執行權交給OS。
3.BOOTCFG=0x02, HPI boot mode, External CPU透過HPI(I2C, SPI, USB2.0, VLYNQ) 將UBL載入,餘同 上。
4.BOOTCFG=0x03, UART boot mode, Host透過serial port將UBL載入,餘同上。
DM6441的開機流程
1.RBL不能修改,而真正做hardware initial與load kernel image的是u-boot,所以只要是從internal ROM開機,就需要在RBL的search path上放置它讀得懂的code(UBL),讓UBL去load boot loader。
2.Internal RAM只有16kb,但UBL目前有14kb,u-boot則是96~115kb不等,所以想要把u-boot結合UBL放進internal RAM有困難。
3.可以考慮直接從NOR flash執行u-boot開機,減少search NAND flash與驗證的時間。但有hardware成本問題。
4.可以考慮使用u-boot做為updater,因為u-boot執行期間OS/Driver/GUI都還沒載入,所以可以update完直接開機。
5.恐怕Service Center需要可以off-line操作且具有GUI的updater,可能還需要support USB與SD card driver與file system,這樣就得porting Angelus I所使用的updater給Angelus II使用。
6.恐怕工廠的selftester也會有跟updater一樣的需求,而且selftester可能需要載入大多數的driver。
VanHelsing EVM board的開機流程
UBL的程序设计,相对UBOOT、KERNEL、ROOTFS、设备驱动、DSP开发来说,还是比较简单。我们先从DAVINCI的启动说起,了解UBL在DAVIN系统中的位置和作用。对于固件程序烧写在NAND FLASH 的Davinci dm644x嵌入式系统, 上电启动的过程如下:
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的顺序图。) UBL的移植,比较简单,当然,前提条件你已经搭好交叉编译环境。进入UBL文件包最上层的文件夹,使用make 就可以编译出:ubl_davinci_nand.bin。UBL主要有: ubl.c dm644x.c util.c nand.c nandboot.c nor.c norboot.c uart.c uartboot.c ubl_davinci.lds 相关的*.h 文件和两个makefile文件。如果最上层的makefile选择$(MAKE) -C src FLASH=nand,表示使用ARM nand flash boot模式,这时NOR,UART BOOT模式相关的c文件不会编译。 介绍一下: ubl_davinci.lds: 指定UBL的SECTIONS及UBL本身的入口地址; ubl.c:从selfcopy函数开始运行,COPY自己到RAM,然后跳到正常入口地址,执行boot(),main()等函数,调用DM644xInit(),COPY UBOOT到RAM相关地址,最后执行UBOOT的入口地址(EntryPoint),这时UBOOT就可以运行了。 dm644x.c:主要配置最小系统,比如关中断、PLL1、PLL2设置、DDR2 时序设置、UART设置,等等。 util.c:是一些相关的malloc等公共函数。 nand.c:主要是NAND FLASH的驱动; nandboot.c:主要是实现NAND_Copy,把UBOOT从NAND COPY到相应的DDR2(RAM)里。 UBL要移植的东西不是很多,主要是在dm644x.c里要定义好: Uint32 PLL1_Mult = 22; // DSP=594 MHz for DM6446,DM6441一般使用Uint32 PLL1_Mult = 19; // DSP=513 MHz。在PLL2Init()函数里,使用不同型号的DDR,要设置不同的参数,即时序参数等,这是关键的地方。 Nand.c及nand.h主要移植就是定义好UBOOT在NAND的存储地址,不同型号的NAND FLASH ,比如SMALL PAGE(512字节)和LARGE PAGE(2048字节)这些都要修改除非你的NAND的类型和TI EVM 兼容。 nandboot.c主要任务就是如何把u-boot.bin或带有头的u-boot.img正确COPY到DDR里,这里最容易出问题,编译出来的U-BOOT文件一般带有Valid magic number(MAGIC_NUMBER_VALID),入口地址entrypaoit,这些信息不对都使UBOOT 运行不起来,建议看一下或COPY UBOOT的image.h。 本人在自己设计的开发板上实现UBL的移植。UBL把UBOOT运行起来,很多事情都可以做了,LINUX KERNEL,ROOTFS,NFS,DSP,设备驱动,应用等等,都可开始按部就班开发。
本文出自 “集成系统-踏上文明的征程” 博客,请务必保留此出处http://zjbintsystem.blog.51cto.com/964211/279709
留言列表