标题:
基于ARM920T的FLASH的读写(8)
[打印本页]
作者:
yuyang911220
时间:
2015-5-30 21:24
标题:
基于ARM920T的FLASH的读写(8)
int search_logic_block(void)
//
建立物理地址到逻
//
辑地址的映射表
{
unsigned int block,i,blockPage,logic_no,zone,zone_i;
U8 SE[16];
for(i=0;i<BLOCK_NR;i++)
//初始化全局变量
lg2ph
=space_block
=0xffff;
logic_number=0;
space_nr=0;
NF_nFCE_L();
zone=BLOCK_NR/1024;
//确定NAND设备中zone
//的个数
for(zone_i=0;zone_i<zone;zone_i++)
{
//搜索每个zone 内逻辑地址和物理地址的映射关系
for(block=0;block<1024;block++)
{
blockPage=((block+zone_i*1024)<<BLOCK_ADDRERSS_SHIFT);
NF_WATIRB();
//等待R/B#信号有效
NF_CMD(0x50);
// 读取每个block内部第
//0个Page内冗余的16个字节
NF_ADDR(0);
// Column 0
NF_ADDR(blockPage&0xff);
NF_ADDR((blockPage>>8)&0xff);
// Block & page num.
NF_ADDR((blockPage>>16)&0xff);
NF_WATIRB();
//等待R/B#信号有效
for(i=0;i<16;i++)
se
=NF_RDDATA();
// Write spare array
NF_WATIRB();
if(
[url=]
se[5]!=0xff)
[/url]
[q8]
//
检测是否存在坏块
printk("\n\rphysic block %d is bad block\n\r",block);
else if(
[url=]
se[7]!=se[12]
[/url]
[q9]
)
printk("block address1:%d!=block address2 %d\n\r",se[7],se[12]);
else if((
[url=]
se[6]
[/url]
[q10]
&0xf8)==0x10)
{
//计算该block对应的逻辑地址
logic_no=((0x7&se[6])<<7)+(se[7]>>1)+zone_i*1000;
if(lg2ph[logic_no]!=0xffff)
//
说明有2个block拥有相
//
同的逻辑地址
printk("physical block %d and block %d have the same logic number %d\n",lg2ph[logic_no],block,logic_no);
else lg2ph[logic_no]=block;
//
将该block的逻辑地址
//关系记入lg2ph表
logic_number++;
}
else if(se[7]==0xff)
//说明该block尚未编号
{space_block[space_nr]=block;
space_nr++;
}
}
}
printk("there are totally %d logic blocks\n\r",logic_number);
NF_nFCE_H();
return logic_number;
}
这段代码的主要作用就是产生数组lg2ph[],这个数组的含义就是“块物理地址=lg2ph[逻辑地址]”。
原文地址:
http://blog.ednchina.com/lanzhucao/28454/message.aspx
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0