uboot调试NandFalsh.docx
- 文档编号:30540086
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:17
- 大小:78.19KB
uboot调试NandFalsh.docx
《uboot调试NandFalsh.docx》由会员分享,可在线阅读,更多相关《uboot调试NandFalsh.docx(17页珍藏版)》请在冰豆网上搜索。
uboot调试NandFalsh
U-Boot出现NoNANDdevicefound!
!
!
的解决办法
NandFlash调用路径:
Start_armboot()
nand_init()
nand_init_chip()
board_nand_init() passed
nand_scan()
nand_scan_ident()
nand_set_defaults passed
nand_get_flash_type() passed
printk(KERN_WARNING"NoNANDdevicefound!
!
!
\n");
今天更改了U-boot第二阶段的代码,主要是实现xmodem和对nand命令的支持。
但是总是提示NoNANDdevicefound!
!
!
错误,经过一天的仔细分析,终于解决了。
首先要感谢一下两位博友的经验和分享:
先将他们的经验帖在下面,以备后用:
在增加Nand读写支持的时候,曾经一度出现下面的错误信息:
NAND:
NoNANDdevicefound!
!
!
0MiB
这个信息曾经困扰了我很久,终于在某一天成功的解决了。
在此写下以记录教训!
首先,用SourceInsight搜索这个信息的打印出处,在drivers/mtd/nand/nand_base.c文件:
intnand_scan_ident(structmtd_info*mtd,intmaxchips)
{
inti,busw,nand_maf_id;
structnand_chip*chip=mtd->priv;
structnand_flash_dev*type;
……
type=nand_get_flash_type(mtd,chip,busw,&nand_maf_id);
if(IS_ERR(type)){
#ifndefCONFIG_SYS_NAND_QUIET_TEST
printk(KERN_WARNING"NoNANDdevicefound!
!
!
\n");
#endif
……
}
根据打印条件,判断是type返回值出错,于是分析nand_get_flash_type函数,可以发现在函数中有这么两行:
if(!
type)
returnERR_PTR(-ENODEV);
因此猜测是type出错了,于是向上查找type的赋值情况,在紧挨着上述两行代码前面有这么几行:
/*Lookuptheflashid*/
for(i=0;nand_flash_ids[i].name!
=NULL;i++){
if(dev_id==nand_flash_ids[i].id){
type= &nand_flash_ids[i];
break;
}
}
这段代码是NandID的匹配查找工作,在源代码的文件drivers/mtd/nand/nand_ids.c文件中定义了常见的NandFlash厂商号和设备号,上述代码就是把从硬件Flash中读取到的设备号与源码中的NandFlashID列表进行比对,如果有一个ID与从硬件NAND上读取的ID匹配,说明找到了外设Nand,否则就没找到。
根据这个信息,我们在这个函数的前面找到了读取硬件ID的代码:
chip->cmdfunc(mtd,NAND_CMD_RESET,-1,-1);
/*SendthecommandforreadingdeviceID*/
chip->cmdfunc(mtd,NAND_CMD_READID,0x00,-1);
/*ReadmanufactureranddeviceIDs*/
*maf_id=chip->read_byte(mtd);
dev_id=chip->read_byte(mtd);
/*下面这行是我后来加上的,目的就是看看读取的ID号到底是多少。
*/
printf("In%s,*maf_idis0x%x,dev_idis0x%x.\n",__func__,*maf_id,dev_id);
重新编译并下载之后看到如下打印信息:
NAND:
Innand_get_flash_type,*maf_idis0x95,dev_idis0x95.
NoNANDdevicefound!
!
!
0MiB
依然是找不到Nand。
不过从这句话我们可以看出,读取Nand的厂商号和设备号出了问题。
实际上的厂商号是0xEC,设备号是0xDA。
于是定位到读取ID代码上,搜索chip->read_byte函数的赋值语句发现是在本文件中的nand_read_byte函数,再起里面加上打印语句:
staticuint8_tnand_read_byte(structmtd_info*mtd)
{
structnand_chip*chip=mtd->priv;
printf("Innand_read_byte,chip->IO_ADDR_Ris%p\n",chip->IO_ADDR_R);
returnreadb(chip->IO_ADDR_R);
}
接着搜索发送命令/地址的函数,chip->cmdfunc,发现该函数调用了chip->cmd_ctrl函数,而这个函数正好是自己在nand_flash函数中实现的函数,也加上打印语句:
25staticvoids3c2440_hwcontrol(structmtd_info*mtd,intcmd,unsignedintctrl)
26{
……
56 printf("Ins3c2440_hwcontrol.ctrlis0x%x,cmdis0x%x\n",ctrl,cmd);
57 if(cmd!
=NAND_CMD_NONE)
58 writeb(cmd,chip->IO_ADDR_W);
59}
上述函数是在board_nand_init函数中赋值的,在这个函数也加上打印信息。
另外,在函数s3c2440_dev_ready中也增加打印信息,判断一下读取硬件是否出现问题,为此修改如下:
61staticints3c2440_dev_ready(structmtd_info*mtd)
62{
63 structs3c2440_nand*nand=s3c2440_get_base_nand();
64 unsignedintready=0;
65 ready=readl(&nand->NFSTAT)&0x01;
66 printf("Ins3c2440_dev_ready,devis%sready.\n",ready?
"":
"not");
67 returnready;
68}
重新编译并下载之后看到的信息如下图所示:
可以看到,虽然基本断定函数调用没有问题,但是厂商号和设备号依然是0x95,依旧找不到NAND!
!
!
因此,肯定的说,是Nand的发送命令和地址的地方出现了错误。
该功能的实现在nand->cmd_ctrl函数中,回去仔细研究,发现问题就是出在这里:
49 if(ctrl&NAND_NCE)
50 writel(readl(&nand->NFCONF)&~S3C2440_NFCONT_nCE,
51 &nand->NFCONF);
52 else
53 writel(readl(&nand->NFCONF)|S3C2440_NFCONT_nCE,
54 &nand->NFCONF);
S3C2410和S3C2440的寄存器是不相同的,原先的S3C2410使用的是NFCONF寄存器,而S3C2440使用的是NFCONT寄存器,修改成NFCONT,重新编译下载,成功!
!
第二篇:
在此要感谢tekkamanninja,我是参照这个superman的手册修改的uboot2008.10,tekkamanninja的文档没有这个版本的uboot,而uboot2008.10版本较老,个别文件和新版uboot无法对应。
抄起来还是有点难度的。
其中在tekkamanninja文档中提到的s3c2410_nand.c文件,在uboot2008.10版本里没有的,只好搜寻相关函数的踪迹,没s3c2410_nand.c至少也得找到到里面的函数吧,最后发现uboot2008.10版本cpu/arm920t/s3c24X0/nand.c文件里有相关函数的定义。
。
。
抄完手册,启动NoNANDdevicefound!
!
!
0MiBgod!
失败
又重新对照手册,correct启动仍旧打印
NoNANDdevicefound!
!
!
0MiB
开始找这个问题原因很是茫然,XX,谷歌也没找到相关有效解决问题,哪里出问题了呢?
最先想到的是
include/configs/micro2440.h这个配置文件出了问题,于是仔细修改了一下,如下
#defineCONFIG_CMD_NAND
#defineCONFIG_ENV_IS_IN_NAND1
//#defineCONFIG_ENV_IS_IN_FLASH1
#defineCONFIG_ENV_OFFSET0X60000
#defineCONFIG_ENV_SIZE0x20000
#ifdefined(CONFIG_CMD_NAND)
#defineCMD_SAVEENV
#defineCONFIG_NAND_S3C2410
#defineCFG_NAND_BASE0x4E000000
#defineCFG_MAX_NAND_DEVICE1/*MaxnumberofNANDdevices*/
#defineSECTORSIZE512
#defineSECTORSIZE_2K2048
#defineNAND_SECTOR_SIZESECTORSIZE
#defineNAND_SECTOR_SIZE_2KSECTORSIZE_2K
#defineNAND_BLOCK_MASK511
#defineNAND_BLOCK_MASK_2K2047
#defineNAND_MAX_CHIPS1
#defineCONFIG_MTD_NAND_VERIFY_WRITE
#defineCONFIG_SYS_64BIT_VSPRINTF/*neededfornand_util.c*/
#endif/*CONFIG_CMD_NAND*/
编译,启动
NoNANDdevicefound!
!
!
0MiB
还是不行
然后在打印语句上下功夫,代码中搜NoNANDdevicefound!
!
!
找到了drivers/mtd/nand/nand_base.c这个文件
intnand_scan_ident(structmtd_info*mtd,intmaxchips)
{
inti,busw,nand_maf_id;
structnand_chip*chip=mtd->priv;
structnand_flash_dev*type;
/*Getbuswidthtoselectthecorrectfunctions*/
busw=chip->options&NAND_BUSWIDTH_16;
/*Setthedefaultfunctions*/
nand_set_defaults(chip,busw);
/*Readtheflashtype*/
type=nand_get_flash_type(mtd,chip,busw,&nand_maf_id);
if(IS_ERR(type)){
printk(KERN_WARNING"NoNANDdevicefound!
!
!
\n");
chip->select_chip(mtd,-1);
returnPTR_ERR(type);
}
。
。
。
}
打印语句是从这里出来的,看看前后代码,nand_get_flash_type()这个函数出了问题,在追踪这个函数
发现有这么一段
chip->select_chip(mtd,0);
/*SendthecommandforreadingdeviceID*/
chip->cmdfunc(mtd,NAND_CMD_READID,0x00,-1);
/*ReadmanufactureranddeviceIDs*/
*maf_id=chip->read_byte(mtd);
dev_id=chip->read_byte(mtd);
printf("dev_id=%d\n",dev_id);//这是我后来加上的,目的确认板子上读出的nandflashID号
/*Lookuptheflashid*/
for(i=0;nand_flash_ids[i].name!
=NULL;i++){
if(dev_id==nand_flash_ids[i].id){
type= &nand_flash_ids[i];
break;
编译打印,
NoNANDdevicefound!
!
!
dev_id=16
0MiB
16?
找找定义ID为16的flash没 drivers/mtd/nand/nand_ids.c
structnand_flash_devnand_flash_ids[]={
#ifdefCONFIG_MTD_NAND_MUSEUM_IDS
{"NAND1MiB5V8-bit", 0x6e,256,1,0x1000,0},
{"NAND2MiB5V8-bit", 0x64,256,2,0x1000,0},
{"NAND4MiB5V8-bit", 0x6b,512,4,0x2000,0},
{"NAND1MiB3,3V8-bit", 0xe8,256,1,0x1000,0},
{"NAND1MiB3,3V8-bit", 0xec,256,1,0x1000,0},
{"NAND2MiB3,3V8-bit", 0xea,256,2,0x1000,0},
{"NAND4MiB3,3V8-bit", 0xd5,512,4,0x2000,0},
{"NAND4MiB3,3V8-bit", 0xe3,512,4,0x2000,0},
{"NAND4MiB3,3V8-bit", 0xe5,512,4,0x2000,0},
{"NAND8MiB3,3V8-bit", 0xd6,512,8,0x2000,0},
{"NAND8MiB1,8V8-bit", 0x39,512,8,0x2000,0},
{"NAND8MiB3,3V8-bit", 0xe6,512,8,0x2000,0},
{"NAND8MiB1,8V16-bit", 0x49,512,8,0x2000,NAND_BUSWIDTH_16},
{"NAND8MiB3,3V16-bit", 0x59,512,8,0x2000,NAND_BUSWIDTH_16},
#endif
{"NAND16MiB1,8V8-bit", 0x33,512,16,0x4000,0},
{"NAND16MiB3,3V8-bit", 0x73,512,16,0x4000,0},
{"NAND16MiB1,8V16-bit", 0x43,512,16,0x4000,NAND_BUSWIDTH_16},
{"NAND16MiB3,3V16-bit", 0x53,512,16,0x4000,NAND_BUSWIDTH_16},
{"NAND32MiB1,8V8-bit", 0x35,512,32,0x4000,0},
{"NAND32MiB3,3V8-bit", 0x75,512,32,0x4000,0},
{"NAND32MiB1,8V16-bit", 0x45,512,32,0x4000,NAND_BUSWIDTH_16},
{"NAND32MiB3,3V16-bit", 0x55,512,32,0x4000,NAND_BUSWIDTH_16},
{"NAND64MiB1,8V8-bit", 0x36,512,64,0x4000,0},
{"NAND64MiB3,3V8-bit", 0x76,512,64,0x4000,0},
{"NAND64MiB1,8V16-bit", 0x46,512,64,0x4000,NAND_BUSWIDTH_16},
{"NAND64MiB3,3V16-bit", 0x56,512,64,0x4000,NAND_BUSWIDTH_16},
{"NAND128MiB1,8V8-bit", 0x78,512,128,0x4000,0},
{"NAND128MiB1,8V8-bit", 0x39,512,128,0x4000,0},
{"NAND128MiB3,3V8-bit", 0x79,512,128,0x4000,0},
{"NAND128MiB1,8V16-bit", 0x72,512,128,0x4000,NAND_BUSWIDTH_16},
{"NAND128MiB1,8V16-bit", 0x49,512,128,0x4000,NAND_BUSWIDTH_16},
{"NAND128MiB3,3V16-bit", 0x74,512,128,0x4000,NAND_BUSWIDTH_16},
{"NAND128MiB3,3V16-bit", 0x59,512,128,0x4000,NAND_BUSWIDTH_16},
{"NAND256MiB3,3V8-bit", 0x71,512,256,0x4000,0},
/*
*Thesearethenewchipswithlargepagesize.Thepagesizeandthe
*erasesizeisdeterminedfromtheextendedidbytes
*/
#defineLP_OPTIONS(NAND_SAMSUNG_LP_OPTIONS|NAND_NO_READRDY|NAND_NO_AUTOINCR)
#defineLP_OPTIONS16(LP_OPTIONS|NAND_BUSWIDTH_16)
/*512Megabit*/
{"NAND64MiB1,8V8-bit", 0xA2,0, 64,0,LP_OPTIONS},
{"NAND64MiB3,3V8-bit", 0xF2,0, 64,0,LP_OPTIONS},
{"NAND64MiB1,8V16-bit", 0xB2,0, 64,0,LP_OPTIONS16},
{"NAND64MiB3,3V16-bit", 0xC2,0, 64,0,LP_OPTIONS16},
/*1Gigabit*/
{"NAND128MiB1,8V8-bit", 0xA1,0,128,0,LP_OPTIONS},
{"NAND128MiB3,3V8-bit", 0xF1,0,128,0,LP_OPTIONS},
{"NAND128MiB1,8V16-bit", 0xB1,0,128,0,LP_OPTIONS16},
{"NAND128MiB3,3V16-bit", 0xC1,0,128,0,LP_OPTIONS16},
/*2Gigabit*/
{"NAND256MiB1,8V8-bit", 0xAA,0,256,0,LP_OPTIONS},
{"NAND256MiB3,3V8-bit", 0xDA,0,256,0,LP_OPTIONS},
{"NAND256MiB1,8V16-bit", 0xBA,0,256,0,LP_OPTIONS16},
{"NAND256MiB3,3V16-bit", 0xCA,0,256,0,LP_OPTIONS16},
/*4Gigabit*/
{"NAND512MiB1,8V8-bit", 0xAC,0,512,0,LP_OPTIONS},
{"NAND512MiB3,3V8-bit", 0xDC,0,512,0,LP_OPTIONS},
{"NAND512MiB1,8V16-bit", 0xBC,0,512,0,LP_OPTIONS16},
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uboot 调试 NandFalsh