【问题标题】:x-loader code is not very clearx-loader 代码不是很清楚
【发布时间】:2015-03-09 14:47:56
【问题描述】:

大家好,我是 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,我google了一下,说也是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 )
    

这里 CFG_LOADADDR=0x80008000

我已经对所有这些进行了一些研究,但和往常一样,事情写得如此完美,以至于我无法理解。 也许这些是非常基本或愚蠢的问题,但我对此也很陌生。我需要以通俗的方式了解事物,以及为什么我们需要将这些事物作为它们在实际来源中的方式。 P.S 当我编译代码时,我在运行时从这个函数得到一些错误

             omap_enable_hwecc_bch4(buf, &ecc_calc[0]);

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

【问题讨论】:

  • 您想将 U-Boot 移植到哪个部分?
  • 当我编译代码时,我在运行时从这个函数得到了一些错误 这是什么意思?是你编译的时候,还是它在运行时?

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


【解决方案1】:

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

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

这些宏是什么

            NAND_UBOOT_START=0x0080000
            NAND_UBOOT_END=0x0100000

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

这些定义了 NAND 内存中要搜索 U-Boot 的地址范围;启动 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 是一个分支操作码。

【讨论】:

    猜你喜欢
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2016-01-07
    • 2011-10-26
    相关资源
    最近更新 更多