我编写了TQ2440的启动代码,在完成各个部件的初始化后,调用自己写的C程序Copy2SDRAM把在Nand flash中以0x1f0000开始,大小为0x00200000的linux内核拷贝到内存中0x30008000处,然后ldr pc , =0x30008000.
在终端上显示:
#starting application at 0x30000000
Uncompressing Linux.......................................
.......................done , booting kernel.
然后就停住了。
请问问题会在那里呢?引导linux前,有那些必要的准备工作?
"booting kernel."是你的程序打印的吧?是否还没到LINUX?
如果是这样的话就要查一下从NAND复制程序到RAM的过程中是否正确完成,建议在跳转语句前加一个使用串口输入命令便执行while(1)的代码,或者干脆就在此加上while(1),然后通过ADS看下0x30008000处的代码与LINUX的代码是否一致,每个512字节看一段,查看是否数据都对。
楼上说的对。
想办法验证下自己拷贝的代码是否正确无误。
MARK.
首先确定你在NAND FLASH中的内容是不是有问题,也就是说起码数据时没有问题的,才能谈到拷贝之后的跳转没有问题。
确定SOURCE数据没有问题之后,再看看你的C数据搬移代码是不是有问题,搬移的地址和搬移的方法是否正确。可以自己写一个函数把0x30008000之后的内容打印出来,也可以采用系统的方法来看。
都没有问题了,还不好用,只能怀疑你加载的内核有问题了。
如果是 u-boot启内核
u-boot会读取kernel img的 kernel header 分析margic number判断系统类型等
这里一般分打印系统的一些信息的
完了 跳到kernel start entry然后交给kernel控制
你这个是直接ldr的 问题不会在bootloader块 内核的问题 原先内核可否正常启动
写到nand中内核数据对不对 dump出来对比下
读出来的又对不对
在网上查了查有几个要求
CPU是SVC模式,IRQ与FIQ要关闭。
MMU关闭
数据Cache关闭
寄存器R0等于0
R1等于machine type
R2等于kernel parameter list的物理地址。
你在用UBOOT启动前需要关注很多事情。比如寄存器状态。不是一句代码就搞定的事情。
现在就是想知道怎么设置
R1-----machine type
R2-----kernel parameter list的物理地址。
哈哈哈哈,引导成功。做了两件事。
1,关闭IRQ于FIQ
2,把R0清零
3,把R2赋值168
4,R3的tag表地址,到现在也没明白是什么意思,我就直接没管他。
然后就引导成功了。
感谢各位,喝喝。
还要补充一点。
我的这个引导程序只能是在由uboot下载到SDRAM中时才能成功引导linux,如果下载到nand由那个
“steppingstone"来启动,就又不工作了。我猜测是启动参数的问题,就是那个tag数据结构。可能uboot初始化了这个结构,所以在经由uboot的时候能用。而且传说这个数据结构一定要在0x30000100处。