x-loader代码不是很清楚

时间:2015-01-11 20:34:04

标签: c linux embedded-linux boot u-boot

大家好我是stackoverflow的新手 我一直在研究我的项目中的x-loader代码,并试图将现有的正在运行的x-loader移植到另一个芯片上(这几乎只是改变了一些gpios)。     但是我在理解x-loader和u-boot程序流程以及这些行的要求方面遇到的问题很少 这是来自lib / board.c的行

if ((get_mem_type() == MMC_ONENAND) || (get_mem_type() == MMC_NAND)){
        // First Try for NAND Boot
        for (i = NAND_UBOOT_START; i < NAND_UBOOT_END; i+= NAND_BLOCK_SIZE){
            if (!nand_read_block(buf, i))
                buf += NAND_BLOCK_SIZE; /* advance buf ptr */
        }
        fio_pbias_init();
        if( *((int *)CFG_LOADADDR) != 0xEA000012 ){
            printf("NAND Does not have U-boot\n");
            buf = (uchar*) CFG_LOADADDR;
            buf += mmc_boot(buf);
        }
    }
  1. 什么是MMC_ONENAND,我用谷歌搜索但它告诉它也是一个nand,那么为什么另一个MMC_NAND

  2. 这些宏是什么

                NAND_UBOOT_START=0x0080000
                NAND_UBOOT_END=0x0100000
    

    为什么我们要在x-loader中检查u-boot,不应该先为x-loader完成任务。

  3. 有人可以用外行的方式解释这个nand_block_read,我对内存分配和东西不太好,因为我无法理解为什么只有这个地址!!

  4. 此检查的目的是什么

           if( *((int *)CFG_LOADADDR) != 0xEA000012 )
    
  5. 这里CFG_LOADADDR = 0x80008000

    我已经对所有这些进行了一些研究,但是就像总是写得如此完美,以至于我没有任何意义。 也许这些都是非常基本或愚蠢的问题,但我对此也很陌生。我需要以外行的方式了解事物,为什么我们需要这些东西作为它们在实际来源中的方式。 P.S当我编译代码时,我在运行时从这个函数中得到了一些错误

                 omap_enable_hwecc_bch4(buf, &ecc_calc[0]);
    

    这是一个驱动程序。我搜索了它,它说要报告NAND内存中的错误。这应该是什么意思,因为相同的代码与先前的芯片没有任何错误完美无瑕。

1 个答案:

答案 0 :(得分:0)

  

什么是MMC_ONENAND,我用Google搜索,但它告诉它也是一个nand,然后   为什么是另一个MMC_NAND

另一种类型的NAND存储器必须与MMC_NAND配置不同。

  

这些宏是什么

            NAND_UBOOT_START=0x0080000
            NAND_UBOOT_END=0x0100000
     

为什么我们要在x-loader中检查u-boot,不应该先为x-loader完成任务。

这些定义了要搜索U-Boot的NAND存储器中的地址范围;启动U-Boot是X-Loader的任务,因此难怪X-Loader必须检查U-Boot所在的位置。

  

有人可以用外行的话解释这个nand_block_read,我不是   很好的内存分配和东西,因为我无法理解为什么   只有这个地址!!

我认为你的意思是nand_read_block

/* read a block data to buf
 * return 1 if the block is bad or ECC error can't be corrected for any page
 * return 0 on sucess
 */ 
int nand_read_block(unsigned char *buf, ulong block_addr)

这里没有内存分配; buf指向的内存从CFG_LOADADDR开始。

  

此检查的目的是什么

   if( *((int *)CFG_LOADADDR) != 0xEA000012 )
     

这里CFG_LOADADDR = 0x80008000

这比较加载块开始时的4字节字(大概sizeof (int)为4),值为0xEA000012。显然,这是为了检查是否已将有效的U-Boot代码块读入内存 - 在ARM CPU上,0xEA000012是分支操作码。

相关问题