tekkaman修改版uboot使用config_mtd_device后不能正常访问nand的种原因
原创作者:桃核(peachstone,又名sixiangzhe)
背景:
我使用的是tekkaman修改版本的u-boot源代码,使用其中的make mini2440_congfig进行编译
当mini2440.h中不加入 #define config_mtd_device 时,可以正常的访问nand flash,正常的烧写内核
加入config_mtd_device后,发现nand0不可用,即在执行nand命令和mtdparts命令时,都提示
Devicenand0 was not found
原因:
经过1天的时间阅读nand命令和mtdparts命令相关的代码,我发现,
driver s/mtd/nand/nand.c中
static voidnand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,ulong base_addr)
函数中调用了/drivers/mtd/mtdcore.c中的
intadd_mtd_device(struct mtd_info *mtd)
,并传递了struct mtd_info *mtd中mtd的值
在两个函数中分别加入
printf("nand_init_chip:mtd->name:value:%ld/n",mtd->name);
printf("nand_init_chip:mtd->name:addr:%ld/n",&(mtd->name));
printf("nand_init_chip:mtd->name:%s/n",mtd->name);
printf("nand_init_chip:mtd:%ld/n",mtd);
和
printf("add_mtd_device,mtd%ld/n",mtd);
printf("add_mtd_device,mtd->name,value:%ld/n",mtd->name);
printf("add_mtd_device,mtd->name,add:%ld/n",&(mtd->name));
printf("add_mtd_device,mtd->name:%s/n",mtd->name);
printf("add_mtd_device,mtd->name:%s/n",mtd_table[i]->name);
发现在系统启动时,会打印如下信息
NAND: devname[0]:nand0
nand_init_chip:mtd->name:value:872204104
nand_init_chip:mtd->name:addr:872203676
nand_init_chip:mtd->name:nand0
nand_init_chip:mtd:872203640
add_mtd_device,mtd872203640
add_mtd_device,mtd->name,value:38
add_mtd_device,mtd->name,add:872203672
add_mtd_device,mtd->name:? ?€???@?`?锞
add_mtd_device,mtd->name:? ?€???@?`?锞
1024 MiB
In: serial
Out: serial
Err: serial
USB slave is enable!
Net: dm9000
Hit any key to stop autoboot: 1
可见在两个函数中,,mtd的值相同,但是mtd->name的值却不同,
所以我们怀疑两个函数中两个mtd的类型不同
查找mtd_info结构体的定义,发现nand.c 和mtdcore.c中的mtd_info都是在/include/linux/mtd/mtd.h中定义的,同时我们发现在mtd_info的定义中,有以下几句话
#ifdefined(ENABLE_CMD_NAND_YAFFS)
/*Thanksfor hugerat's code*/
u_charrw_oob;
u_charskipfirstblk;
#endif
在nand.c和mtdcore.c的编译过程中,不是都包含了mini2440.h(nand.c调用了,mtdcore没有调用),而我们在mini2440.h中定义了ENABLE_CMD_NAND_YAFFS,所以对mtd_info的定义就出现了不同
修改办法:
方法一:
去掉
#ifdefined(ENABLE_CMD_NAND_YAFFS)
#endif
方法二:
//在mtdcore.c开头加入
#include"config.h"
//(config.h中包含mini2440.h)
(我在u-boot-2010-06中移植时发现方法二不行,最后采用方法一,或者在include/linux/mtd/mtd.h中加上
#include "config.h",也可以达到相同效果)
备注:
我发现u_boot官方代码2010.12中并没有类似
#ifdefined(ENABLE_CMD_NAND_YAFFS)
/*Thanksfor hugerat's code*/
u_charrw_oob;
u_charskipfirstblk;
#endif
的代码,应该出现mtd_device不能正常运行的问题
联系客服