我知道我们norflash是2M内存,那我们怎么通过命令来查看呢。
第一行是nor的大小,通过读0x27地址。不过我不知道为什么还要左移1位,因为0x14 = 20 ,2^20=1M,读的话确实是1M,左移一位就是2M了。
2,3行不知道是干嘛的。我们看第四行,number of erase block region 是什么呢,nor是由几个region组成的,而region是由block组成的。number of erase block region 就是reigon的数量。查看数量就读0X2C地址。然后就是block了,我们怎么查看block呢,
看表上的数据,读0X2d,0x2e,数据都是零,下面也有好多0,感觉有点迷。refer to the CFI publication 100,我们百度一下这个。
上面的意思是:
* block_num的数量 低2个字节+1 什么意思呢 do_nor_read(0x2d),do_nor_read(0x2e)是低8位8-16位;
* block_size的大小 高2个字节*256 do_nor_read(0x2f),do_nor_read(0x30)是低16-24位24-32位;
*/(do_nor_read读操作)。原理就这么多。
给个代码吧
void nor_read()
{
char str[4];
int i,cout=0,z;
int nor_block_base = 0x2d;
int nor_size,nor_regions,nor_block_num,nor_block_size,nor_block_addr=0;
do_nor_write(0x55,0x98); //进入CFI模式
str[0]=do_nor_read(0x10); //0x10地址上数据是'Q'
str[1]=do_nor_read(0x11); //0x10地址上数据是'R'
str[2]=do_nor_read(0x12); //0x10地址上数据是'Y'
str[3]='\n';
nor_size = (do_nor_read(0x27) << 1); //nor大小
nor_regions = do_nor_read(0x2c); //region数量
printf("the :%s\n\r",str);
printf("norsize :%x,nor_regions :%x\n\r",nor_size/1024/1024,nor_regions);
printf("nor_block_addr:\n\r");
for(i = 0 ;i < nor_regions; i++ )
{
nor_block_num = (do_nor_read(nor_block_base)+(do_nor_read(nor_block_base+1)<<8))+1; //block数量
nor_block_size = ((do_nor_read(nor_block_base+2)+(do_nor_read(nor_block_base+3)<<8)))*256; //block大小
nor_block_base+=4; //传给上面第一个。 //nor_block地址
for(z=0 ;z < nor_block_num ; z++)
{
printf("%x",nor_block_addr);
nor_block_addr += nor_block_size;
puts(" ");
cout++ ;
if(cout%5 == 0)
{
puts("\n\r");
}
}
}
printf("nor_block_num :%d\n\r",nor_block_num);
}
CFI模式就是想要访问NOR模式,可以读取NOR的大小,平常我们只能读取我们上面的数据。