先介绍一下NandFlash u-boot的启动说明:
当通过硬件跳线选择从NandFlash启动后,CPU首先读取第一页的代码,进行必要的硬件配置,然后将第二页的代码搬运到ESRAM中,由第二页的程序将UBOOT主程序搬运到目标地址:SDRAM的0x30700000地址,最后将PC切换到0x30700000,执行UBOOT程序,完成系统启动。
我要做的就是在第二页搬运代码中添加跳过坏块的程序,中间遇到很多问题,因为第二页的代码都是用ARM汇编来写,学了四年大学,可以说对汇编一点都不熟的,一些指令它认识我,我却不认识它,感到非常郁闷,没办法,只好重补汇编了,中间遇到很头疼的问题:立即数方式,每个立即数由一个8位的常数循环右移偶数位得到。一开始以为立即数可以随便写,可是这样总出错,问了一下师兄,才知道立即数应该这样写,感到很郁闷。比如:0xff,0x104,0xff0,0xff00这些都是立即数,而0x101,0x104,0xff1则都不是立即数。
还有一个比较头疼的地方是LDR是字数据读取指令,就是32位数,当我 执行
add r4, r7, #0x200
ldr r4, [r4,#0x5]
cmp r4, #0xff
的时候r4总是不能和0xff相等,后来用multi-ice把它读取出来看了一下,原来r4是0xffffffff,当然不可能和0xff相等的,后来查了一下书,ldrb才是字节数据读取指令,这才恍然大悟,在改过之后,如果中间不存在坏块的话,执行是没有问题的,但如果有坏块,出现了问题,它的r4还是0xff,当时很粗心大意,因为我没有真正把坏块标志写到nandflash中,只是把它读出来放到一个数组中,在数组中改它的坏块标志的,通过这次实验发现自己有很多地方需要注意,需要改进,比如:粗心大意,不会自己独立寻找问题所在等等都是很大的问题,通过这次,我一定要更加努力了,加油!
文章评论(0条评论)
登录后参与讨论