欢迎来到天天文库
浏览记录
ID:40774112
大小:166.00 KB
页数:17页
时间:2019-08-07
《阿虚的mtd nand驱动学习手册》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、3月31日前言:为了深入了解MTD如何处理Nand问题,决定跟一下MTDNand层代码。mtd.h重要结构体:★structerase_info如果擦除失败,fail_addr将指示坏块地址。★structmtd_infomtd层函数指针存放处。nand.hNand基本指令:#defineNAND_CMD_READ00#defineNAND_CMD_READ11#defineNAND_CMD_PAGEPROG0x10#defineNAND_CMD_READOOB0x50#defineNAND_CMD_ERASE10x60#defineNAND_CMD_STATUS0x70#d
2、efineNAND_CMD_STATUS_MULTI0x71#defineNAND_CMD_SEQIN0x80#defineNAND_CMD_READID0x90#defineNAND_CMD_ERASE20xd0#defineNAND_CMD_RESET0xff和K9F1208指令对比重要结构体:★structnand_chip具体操作Nand的函数指针都在这个结构体里面。★structnand_bbt_descrNand坏块表?具体如何使用还不清楚。174月1日nand_base.c◆intnand_scan(structmtd_info*mtd,intmaxchips)
3、{structnand_chip*this=mtd->priv;priv是mtd_info结构体里面的一个空指针,现在指向this。if(this->cmdfunc==NULL)this->cmdfunc=nand_command;判断驱动编写者是否提供了command函数,后来几个类似。this->cmdfunc(mtd,NAND_CMD_READID,0X00,-1);读取Nand芯片信息,包括厂商信息的芯片ID,对于K9F1208是0xEC和0x76。对应nand_ids.c中的{"NAND64MiB3,3V8-bit",0x76,512,64,0x4000,0}。含义
4、:三星的这颗Nand芯片是64MB的,3.3V供电,8bit位宽,ID为0x76,每一页大小为512Byte,64MB容量,擦除块尺寸为0x4000,操作0。对擦除块为0x4000的解释:这颗Nand芯片的容量是这样划分的,512Bytex32x4096=64MB,一共有4096个块(block),因此每一个块的大小为512Bytex32=16384Byte=0x4000Byte。这些信息接下来都会被MTD层获得,如果全部没有问题,则在启动时会打印:printk(KERN_INFO"NANDdevice:ManufacturerID:""0x%02x,ChipID:0x%02
5、x(%s%s)",nand_maf_id,nand_dev_id,nand_manuf_ids[maf_id].name,mtd->name);/*Calculatetheaddressshiftfromthepagesize*/this->page_shift=ffs(mtd->oobblock)-1;this->bbt_erase_shift=this->phys_erase_shift=ffs(mtd->erasesize)-1;this->chip_shift=ffs(this->chipsize)-1;▼这一段不太明白,翻译过来是根据页面大小计算地址变化?我在启
6、动时将其打印了出来:mtd->oobblockis0x200mtd->oobsizeis0x10mtd->erasesizeis0x4000this->page_shiftis0x9this->bbt_erase_shiftis0xethis->chip_shiftis0x1affs函数第一次见到,看看是什么东西:#defineffs(x)generic_ffs(x)继续,蛮有意思的函数:staticinlineintgeneric_ffs(intx){intr=1;if(!x)return0;if(!(x&0xffff)){17x>>=16;r+=16;}if(!(x&0x
7、ff)){x>>=8;r+=8;}if(!(x&0xf)){x>>=4;r+=4;}if(!(x&3)){x>>=2;r+=2;}if(!(x&1)){x>>=1;r+=1;}returnr;}这函数人如其名,找到第一个bit位(findfirstbitset),比如0x80,将返回7。/*Setthebadblockposition*/this->badblockpos=mtd->oobblock>512?NAND_LARGE_BADBLOCK_POS:NAND_SMALL_BADBLOCK_POS;
此文档下载收益归作者所有