C6747上电复位后从0x11700000处开始执行芯片内固化的Boot,也即RBL。根据Boot引脚的配置到相应的Falsh中拷贝程序到RAM中运行!!
如果我的程序很大,我就要写二次BootLoader程序,也就是所谓的UBL。我的想法是这样的:上电复位RBL把我写的下载在NandFlash 中的UBL拷贝到内部或外部RAM,UBL运行起
来后再从NandFlash中把剩余的程序拷贝到RAM中继续运行。现在我有这样一个疑问:
UBL和应用程序都得下下载到NandFlash,那RBL在拷贝Nand中程序的时候会不会把UBL和应用程序一起都给拷贝过去???或者说在将UBL下载到Nand中的时候要加入一些信息,告
知RBL ,UBL拷贝完成,然后转到Ram中运行UBL,由UBL引导拷贝Nand中剩余的应用程序??那么加入的信息又是什么呢??
以前给TI-China发邮件询问NandWrite工程时,他给了我一个关于RBL, UBL, ABL的介绍的链接:
processors.wiki.ti.com/.../DM355_DVEVM_NAND_Reloading
里面有这样一段话:First, the RBL in the DaVinci starts executing. It examines Page 0 of the first 24 blocks of NAND flash, starting at block 1 looking for
the magic number of the UBL Descriptor. If a UBL Descriptor is found, the RBL loads the UBL into the internal ARM RAM and jumps to the entry point and
starts execution of the UBL.
c6747的RBL应该和这个差不多,这个似乎可以解答我上面的问题,但同时又给了我另外两个困惑:
1、在开发板商提供的NandWrite工程里,UBL 描述字符赋值如下:
gNandBoot.magicNum = UBL_MAGIC_SAFE; //工程中赋值 0xA1ACED00
gNandBoot.block = DEVICE_NAND_RBL_SEARCH_START_BLOCK;
gNandBoot.page = 0;
gNandBoot.numPage = numPagesUBL;
gNandBoot.entryPoint = 0x800066c0;
gNandBoot.ldAddress = 0;
UBL的入口地址设置成0x800066c0,但是在应用程序的工程中在.cmd文件中向量表是放在0x80000000开始的地址处,这两个不一致呀,通过这个工程下载的程序能正常运行!!!
当然下载的程序很小没有UBL而是直接下载的应用程序!!!
现有AISgen生成的bin文件,4128字节,而我的Nand是第页2k字节的,下载时按理只要3页就可以了,用这个NandWrite工程下载程序时会在第四页写入UBL字符:
0x26000220 0xA1ACED00 0x800066C0 0x00000003 0x00000001 0x00000001 0x00000000
除第一个字外,剩下的几个字刚好就是下面这个结构体的内容
typedef struct
{
Uint32 magicNum; // Expected magic number 0xA1ACED00
Uint32 entryPoint; // Entry point of the user application 0x800066C0
Uint32 numPage; // Number of pages where boot loader is stored 0x00000003
Uint32 block; // Starting block number where User boot loader is stored 0x00000001
Uint32 page; // Starting page number where boot-loader is stored 0x00000001 ???
//数据明明是从Block1的第0页开始写的,不知为什么这里却写入了1??
Uint32 ldAddress; // Starting RAM address where image is to copied - XIP Mode 0x00000000
} NANDWRITER_Boot;
2、我自己另外又写了一个写Nand的工程,我就没有定义 UBL描述字符也就没有往nand写入UBL描述字符,但是通过我自己写的这个工程下载的程序也能正常运行!!!cmd文件中
向量表还是放在0x80000000开始的地址处,但是我没有指定UBL(当然这里是我的应用程序)的入口地址entrypoint呀!那它又是怎样实现跳转的??
不知有没有C6747 RBL 相关文档??
RBL