打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
u-boot使用mtdparts提示 Device nand0 was not found的解决方法

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.cmtdcore.c的编译过程中,不是都包含了mini2440.hnand.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不能正常运行的问题

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux-2.6.32.2内核在mini2440上的移植
u-boot nand flash驱动架构分析一
u-boot中分区和内核MTD分区关系
关于NAND flash的MTD分区与uboot中分区的理解
ubifs文件系统的制作过程&&遇到的问题及解决方案总结
S3C2440移植uboot之裁剪和修改默认参数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服