This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6747关于Nand启动与二次Boot,RBL



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

  • 1. 对于大的程序并不一定需要二次boot,因为C6747支持AIS格式,可以在boot时将PLL,SDRAM等做配置,然后RBL可以将代码加载到任意位置。

    2. AIS是带有格式的文件,结尾是有一个Jump命令跳转到程序的入口并开始运行。并不会把NAND内的所有内容搬到内存。再说,按这种理解,RBL怎么能知道NAND里的文件到底有多大。

    3.UBL搬应用代码是用户代码自己定义的。自己定义应用代码的存放格式,则以相应的方式来搬移。

    4. DSP对中断向量的位置没有规定,可以通过ISTP设置。

  • 非常感谢!!

    到底还是对手册没能完成理解呀!!