STEPLDR启动程序分析

     STEPLDR是用来加载EBOOT的,即引导EBOOT的启动。STEPLDR主要包括两部分:StartUp.s 与 main.c,StartUp.s 主要是初始化CPU,引导EBOOT的功能主要在main.C中完成,该部分结构和代码都比较简单,代码如下:

我们从头来看起,首先是一个SetupCopySection(pTOC),该函数是一个空函数,如下:

static BOOLEAN SetupCopySection(ROMHDR *const pTOC)
{
    // This code doesn't make use of global variables so there are no copy sections.
    // To reduce code size, this is a stub function...
    return(TRUE);
}

注释说这是一个stub function,不明白什么意思。接着是GPIO端口和LED指示灯的初始化,然后就是NAND FLASH的初始化。注意,这部分中没有初始化串口,主要是为了加快启动速度。若要在这部分输出信息就有进行串口初始化。

pBuf = (unsigned char *)LOAD_ADDRESS_PHYSICAL; 其中的“LOAD_ADDRESS_PHYSICAL”就是要将EBOOT下载到的地址,位于DRAM,值为0X20030000。初始化完成以后就开始加载EBOOT了:

    for (nPage = LOAD_IMAGE_PAGE_OFFSET; nPage < (LOAD_IMAGE_PAGE_OFFSET + LOAD_IMAGE_PAGE_COUNT) ; nPage++)
    {
        //Led_Display(0x1);
        nBlock = ((nPage / NAND_PAGES_PER_BLOCK) + nBadBlocks);

        if (!NAND_ReadPage(nBlock, (nPage % NAND_PAGES_PER_BLOCK), pBuf))
        {
            if ((nPage % NAND_PAGES_PER_BLOCK) != 0)
            {
                Led_Display(0x9);    // real ECC Error.
                //Uart_SendString("ECC Error./r/n");

                while(1)
                {
                    // Spin forever...
                }
            }

            // ECC error on a block boundary is (likely) a bad block - retry the page 0 read on the next block.
            nBadBlocks++;
            nPage--;

            continue;
        }

        pBuf += NAND_BYTES_PER_PAGE;
    }

其中EBOOT的大小事先定义好的。加载好EBOOT以后就要运行它了:((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))();其中的PFN_IMAGE_LAUNCH是一个定义的空函数指针:typedef void (*PFN_IMAGE_LAUNCH)();这种方式比较巧妙。这样EBOOT就运行起来了。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值