关于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上跑的很好,也不明白为什么?
本人菜鸟一只,还望班组和大虾们多多指点。 经过亲自验证,将上述有问题的地方,更改为:
282 tst r2, #0x1
U-BOOT在开发板上正常运行。所以上面汇编部分应该是由错误的。
页:
[1]