最近在研究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, [r1, #oNFCONF]
261 ldr r2, [r1, #oNFCONF]
262
263 ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control
264 str r2, [r1, #oNFCONT]
265 ldr r2, [r1, #oNFCONT]
266
267 ldr r2, =(0x6) @ RnB Clear
268 str r2, [r1, #oNFSTAT]
269 ldr r2, [r1, #oNFSTAT]
270
271 mov r2, #0xff @ RESET command
272 strb r2, [r1, #oNFCMD]
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, [r1, #oNFSTAT] @ wait ready
282 tst r2, #0x4
283 beq nand2
284
285
286 ldr r2, [r1, #oNFCONT]
287 orr r2, r2, #0x2 @ Flash Memory Chip Disable
288 str r2, [r1, #oNFCONT]
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, [r1, #oNFSTAT] @ wait ready
282 tst r2, #0x4
283 beq nand2
这里判断的是S3C2440芯片的状态寄存器NFSTAT的第四位。查询S3C2440芯片手册:
发现判断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上跑的很好,也不明白为什么?
本人菜鸟一只,还望班组和大虾们多多指点。 |