zh5202 发表于 2012-11-20 09:53

关于tekkaman不懂的地方

最近在研究U-Boot,先来学习tekkaman移植的2009.11版本的U-Boot。发现一个问题:
在U-Boot的第一阶段的汇编代码中(start.S),实现U-Boot从Nand Flash拷贝到SDRAM的部分代码:
/************** NAND_BOOT ************/
246
247 #define LENGTH_UBOOT 0x60000
248 #define NAND_CTL_BASE 0x4E000000
249
250 #ifdef CONFIG_S3C2440
251 /* Offset */
252 #define oNFCONF 0x00
253 #define oNFCONT 0x04
254 #define oNFCMD 0x08
255 #define oNFSTAT 0x20
256
257         @ reset NAND
258         mov   r1, #NAND_CTL_BASE
259         ldr   r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
260         str   r2,
261         ldr   r2,
262
263         ldr   r2, =( (1<<4)|(0<<1)|(1<<0) )   @ Active low CE Control
264         str   r2,
265         ldr   r2,
266
267         ldr   r2, =(0x6)      @ RnB Clear
268         str   r2,
269         ldr   r2,
270
271         mov   r2, #0xff       @ RESET command
272         strb    r2,
273
274         mov   r3, #0@ wait
275 nand1:
276         add   r3, r3, #0x1
277         cmp   r3, #0xa
278         blt   nand1
279
280 nand2:
281         ldr   r2,       @ wait ready
282         tst   r2, #0x4
283         beq   nand2
284
285
286         ldr   r2,
287         orr   r2, r2, #0x2    @ Flash Memory Chip Disable
288         str   r2,
289
290         @ get read to call C functions (for nand_read())
291         ldr   sp, DW_STACK_START      @ setup stack pointer
292         mov   fp, #0@ no previous frame, so fp=0
293
294         @ copy U-Boot to RAM
295         ldr   r0, =TEXT_BASE
296         mov   r1, #0x0
297         mov   r2, #LENGTH_UBOOT
298         bl      nand_read_ll
299         tst   r0, #0x0
300         beq   ok_nand_read
从上面代码中看出,在给NAND FLASH发送复位命令0xff之后,延时了一会儿,然后等待NAND FLASH复位命令执行完成:
280 nand2:
281         ldr   r2,       @ wait ready
282         tst   r2, #0x4
283         beq   nand2
这里判断的是S3C2440芯片的状态寄存器NFSTAT的第四位。查询S3C2440芯片手册:
https://bbs.21ic.com/images/default/attachimg.gif https://bbs.21ic.com/attachments/month_1211/1211161107d49422fc4b0a6665.png
发现判断NAND FLASH是否忙应该是在第0位,tekkaman却判断的第2位。
查看拷贝U-BOOT到SDRAM部分的C语言代码:
#define NFSTAT__REGb(NF_BASE + 0x20)
#define NFSTAT_BUSY 1
static inline void nand_wait(void)
{
int i;
while (!(NFSTAT & NFSTAT_BUSY))
for (i=0; i<10; i++);
}
这里却是判断的第0位。不明白为什么?
但是tekkaman移植U-BOOT确实又在mini2440上跑的很好,也不明白为什么?
本人菜鸟一只,还望班组和大虾们多多指点。

zh5202 发表于 2012-11-26 17:59

经过亲自验证,将上述有问题的地方,更改为:
282         tst   r2, #0x1
U-BOOT在开发板上正常运行。所以上面汇编部分应该是由错误的。
页: [1]
查看完整版本: 关于tekkaman不懂的地方