大家好我是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);
}
}
什么是MMC_ONENAND,我用谷歌搜索但它告诉它也是一个nand,那么为什么另一个MMC_NAND
这些宏是什么
NAND_UBOOT_START=0x0080000
NAND_UBOOT_END=0x0100000
为什么我们要在x-loader中检查u-boot,不应该先为x-loader完成任务。
有人可以用外行的方式解释这个nand_block_read,我对内存分配和东西不太好,因为我无法理解为什么只有这个地址!!
此检查的目的是什么
if( *((int *)CFG_LOADADDR) != 0xEA000012 )
这里CFG_LOADADDR = 0x80008000
我已经对所有这些进行了一些研究,但是就像总是写得如此完美,以至于我没有任何意义。 也许这些都是非常基本或愚蠢的问题,但我对此也很陌生。我需要以外行的方式了解事物,为什么我们需要这些东西作为它们在实际来源中的方式。 P.S当我编译代码时,我在运行时从这个函数中得到了一些错误
omap_enable_hwecc_bch4(buf, &ecc_calc[0]);
这是一个驱动程序。我搜索了它,它说要报告NAND内存中的错误。这应该是什么意思,因为相同的代码与先前的芯片没有任何错误完美无瑕。
答案 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
是分支操作码。