h85968099 发表于 2010-10-28 11:08:39

今天在linux上遇到一个非常神奇的问题。。。

呵呵,我一直在搞东芝ARM9的开发和linux移植,遇到了很多问题,也谢谢这里的大哥们以前的帮忙。。。
一般的ARM9启动都支持NAND和NOR,
NOR是直接跑NOR里面的BOOTloader程序,然后进行内核引导
NAND是将NAND里面的的BOOTloader程序拷贝到内存中,然后进行内核引导
内核引导,其实不管是什么启动,只要BOOTloader起来了,都是一样的,至少我这里是一样的,都是直接把内核从nand里面拷贝到一个内存里面,然后BOOTM

两个启动方式中,我的BOOTLOADER ,和内核uImage都是一模一样的,没有做任何的改变

我现在遇到了一个奇怪的问题
当我从NOR启动的时候,
上电
-》启动BOOTLOADER(UBOOT)
-》拷贝内核到内存(nand read 0x40600000 0x80000 0x280000\ )
-》启动内核;(bootm 0x406000000
-》成功,能够启动内核

当我从NAND启动的时候,
-》拷贝BOOTloader到内存 (成功)
-》启动BOOTLOADER(UBOOT)(成功)
-》拷贝内核到内存(nand read 0x40600000 0x80000 0x280000\ )(成功)
-》启动内核;(bootm 0x406000000
-》问题出现在这里
console enabled
Calibrating delay loop... 0.81 BogoMIPS (lpj=4096)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency:
跑到这里就死掉了。。。但是从NOR里面启动和引导的时候
console enabled
Calibrating delay loop... 95.84 BogoMIPS (lpj=479232)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
这里是正常跑过去的
这像内核的问题,但是我NOR启动和NAND启动的内核,BOOTLOADER都一摸一样,这个问题真是让我无解啊

h85968099 发表于 2010-10-28 13:04:32

前辈你在哪里呀?

mcu.runner 发表于 2010-10-28 14:06:17

可能是SDRAM初始化不对。从nandflash启动时,SDRAM初始化在nandflash boot程序中完成,nandflash boot初始化SDRAM后,把UBoot从nandflash中取出来放到SDRAM中运行。后面的处理和norflash启动一样。

可以查查看nandflash boot程序中初始化SDRAM的部分是否和norflash启动时的一致。

h85968099 发表于 2010-10-28 15:59:07

回复【2楼】mcu.runner
-----------------------------------------------------------------------

MCU,我有点不明白,BOOTLOADER都是同样的代码,我需要在哪里查看呢?

jiaweijing 发表于 2010-10-28 16:35:13

mark

siemeni 发表于 2010-10-28 16:56:54

这个问题可能和你的读NANDFLASH代码有关,虽然bootloader是一样的,但是CPU运行bootloader代码的过程是不一样的,一个是从NOR拷贝到SDRAM,另一个是从NAND拷贝到SDRAM。NAND的操作比NOR要复杂,有坏块处理,每个page还包含spare信息,你可以查查看。

mcu.runner 发表于 2010-10-28 16:57:37

回复【3楼】 h85968099
----------------------------------------

nandflash boot过程是这样的:

1、ARM9 先把nandflash开始的若干页的内容(一般是4KB)读到片上SRAM中(片上SRAM不用作特别的初始化)。这步由ARM9自动完成。然后,ARM9跳到这段代码的起始位置开始执行。这段代码,一般称为nandflash bootloader。
2、nandflash bootloader完成SDRAM的初始化,并且把 Uboot 从 nandflash 中读出来放到 SDRAM中,然后从 U-Boot 开始执行。

上面初始化SDRAM的过程是在 nandflash bootloader 中完成的。如果选择从norflash启动,U-Boot 可以直接放到norflash中运行。这时候,SDRAM的初始化过程由 U-Boot 完成。

所以,可以比较一下 nandflash bootloader 的SDRAM初始化过程和U-Boot的SDRAM初始化过程是否一致。

你说的"Bootloader都是同样的代码",可能还暗含有:nandflash启动时,U-Boot 重复初始化 SDRAM的嫌疑。U-Boot本身还在SDRAM中,此时重复初始化SDRAM很危险的。

h85968099 发表于 2010-10-28 17:48:22

回复【6楼】mcu.runner
-----------------------------------------------------------------------

哦,这样啊,知道了,在NAND启动的时候,在UBOOT之前是有一个小程序,AUTOBOOT程序,呵呵,我去查阅一下,谢谢
页: [1]
查看完整版本: 今天在linux上遇到一个非常神奇的问题。。。