关于tekkaman移植的U-boot讨论

[复制链接]
2481|0
 楼主| zh5202 发表于 2012-11-16 11:07 | 显示全部楼层 |阅读模式
最近在研究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 0x4E000000249
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上跑的很好,也不明白为什么?
本人菜鸟一只,还望班组和大虾们多多指点。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Need to harder study!Thank you for everyone had helped me.

5

主题

248

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部