Chinaunix首页 | 论坛 | 博客
  • 博客访问: 620174
  • 博文数量: 112
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 1406
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-25 18:46
文章分类
文章存档

2011年(1)

2010年(5)

2009年(25)

2008年(81)

我的朋友

分类: LINUX

2008-04-27 13:10:54

 

标准的SMDK2410板不支持NAND Flash,启动的时候是这样的:
 
U-Boot 1.1.2 (May 28 2006 - 08:20:50)
U-Boot code: 33F80000 -> 33F99A14  BSS: -> 33F9DB0C
RAM Configuration:
Bank #0: 30000000 64 MB
Flash:  1 MB
*** Warning - bad CRC, using default environment
In:    serial
Out:   serial
Err:   serial
 
NAND支持的多一行(NAND 64MB):
 
U-Boot 1.1.2 (May 28 2006 - 08:36:42)
U-Boot code: 33F80000 -> 33F99A14  BSS: -> 33F9DB0C
RAM Configuration:
Bank #0: 30000000 64 MB
Flash:  1 MB
NAND:  64 MB
*** Warning - bad CRC, using default environment
In:    serial
Out:   serial
Err:   serial
 
怎么实现这种支持呢?U-Boot真是功能强大的Bootloader,在/inclued/configs/smdk2410.h中有这么一段
 
/***********************************************************
 * Command definition
 ***********************************************************/
#define CONFIG_COMMANDS \
   (CONFIG_CMD_DFL  | \
   CFG_CMD_CACHE  | \
   CFG_CMD_NAND  | \
   /*CFG_CMD_EEPROM |*/ \
   /*CFG_CMD_I2C  |*/ \
   /*CFG_CMD_USB  |*/ \
   CFG_CMD_REGINFO  | \
   CFG_CMD_DATE  | \
   CFG_CMD_ELF)
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
 
需要说明一下CONFIG_CMD_DFL,定义的是默认指令,包括bdinfo、bootd、coninfo、saveenv、flinfo、erase、protect、iminfo、imls、itest、loadb、loads、md、mm、nm、mw、cp、cmp、crc、base、loop、loopw、mtest、sleep、bootp、tftpboot、rarpboot、run等常用指令,这些指令我以后会结合使用做适当的说明。关于指令的宏定义说明可以看看U-Boot的README里面的Monitor Functions。这就是对编译成功后的U-Boot支持的命令的定义,SMDK2410默认的smdk2401.h中,红色字部分是注释掉的。但是要支持NAND Flash远没有去掉一个注释这么简单。
 
我们可以试试单纯把这个注释去掉是什么结果,老步骤:
 
make distclean
make smdk2410_config
make
……一堆编译信息飘过……
 
出错了,位置指向cmd_nand.c这个文件,好几处错误。原因是SMDK2410的配置里根本就没有对NAND Flash支持的宏定义和函数。怎么办?自己写么?好在U-Boot里有另外一个可以让我们借鉴的配置VCMA9。在Source Navigator里搜索一下vcma,看看vcma9.h和vcma9.c,可以从中摘取出一段宏定义和一些函数声明。网上有人的做法是将其放在smdk2410.h和smdk2410.c中,但是白痴的cross-2.95.3和cross-3.2都不能认到cmd_nand.c中已经在smdk2410.h和smdk2410.c中定义的宏所指的函数,就算是加上extern的也不行。也许你没有看懂刚才这句话,解释一下,例如cmd_nand.c中有这样一段
 
 if(ale_wait)
  NAND_WAIT_READY(nand); /* do the worst case 25us wait */
 else
  udelay(10);
 
其中NAND_WAIT_READY(nand),在smdk2410.h中定义为
 
#define NAND_WAIT_READY(nand) NF_WaitRB()
 
而NF_WaitRB()在smdk2410.c中定义为

 原文地址 http://xianzilu.spaces.live.com/blog/
阅读(1978) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~