打印
[嵌入式linux]

关于tekkaman不懂的地方

[复制链接]
1224|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zh5202|  楼主 | 2012-11-20 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在研究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上跑的很好,也不明白为什么?
本人菜鸟一只,还望班组和大虾们多多指点。

相关帖子

沙发
zh5202|  楼主 | 2012-11-26 17:59 | 只看该作者
经过亲自验证,将上述有问题的地方,更改为:
282         tst     r2, #0x1
U-BOOT在开发板上正常运行。所以上面汇编部分应该是由错误的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

5

主题

248

帖子

2

粉丝