NANDFlashd的读写(基于s3c2440)
时间:11-20
来源:互联网
点击:
- 作一页
- for(i=0;i
- {
- control_start();//开控制
- nand_reset();//复位
- #ifdefUSE_ECC
- rNFESTAT0=0;//复位错误标志位
- ecc_main_init();
- ecc_main_start();//可以产生main区ECC
- #endif
- rNFCMD=NAND_CMD_READ_1st;
- rNFADDR=0;
- rNFADDR=0;
- rNFADDR=addr&0xff;
- rNFADDR=(addr>>8)&0xff;
- rNFADDR=(addr>>16)&0xff;
- rNFCMD=NAND_CMD_READ_2st;
- detect_nand_busy();
- for(p=0;p<2048;p++)
- {
- temp=temp+1;
- if(temp>size)
- {
- no=rNFDATA8;//多余的读出来扔掉
- }
- else
- {
- *(bu+p)=rNFDATA8;
- }
- }
- #ifdefUSE_ECC
- rNFESTAT0=0;
- ecc_main_end();//锁定main区ECC
- //delay_lhg(100,100);//
- ecc_spare_start();//解锁spare区ecc
- ecc=rNFDATA8;//从flash读出main区ECC,四个字节
- no=rNFDATA8;
- ecc|=((U32)no)<8;
- no=rNFDATA8;
- ecc|=((U32)no)<16;
- no=rNFDATA8;
- ecc|=((U32)no)<24;
- rNFMECCD0=((ecc&0xff00)<8)|(ecc&0xff);//硬件检验mainECC
- rNFMECCD1=((ecc&0xff000000)>>8)|((ecc&0xff0000)>>16);
- ecc_spare_end();//锁定spare区ecc
- //delay_lhg(100,100);//
- ecc=rNFDATA8;//从flash读出spare区ECC的值
- no=rNFDATA8;
- ecc|=((U32)no)<8;
- rNFSECCD=((ecc&0xff00)<8)|(ecc&0xff);//硬件检验spareECC
- //delay_lhg(100,100);//延时一会
- ecc=rNFESTAT0&0xffffff;//ecc只是临时用一下错误状态,并非ecc内容
- if(ecc!=0)//有错误
- {
- //以后再优化
- #ifdefNAND_DEBUG
- Uart_Printf("/r/nNandecccheckerror...pageaddr=0x%x,NFESTAT0=0x%x",addr,ecc);
- #endif
- nand_mask_bad_block((addr+i)/64);//登记为坏块
- return-1;
- }
- #endif
- bu=bu+2048;
- addr++;
- control_end();//关控制
- }
- return1;
- }
- intnand_random_read(U32paddr,U32offset,U8*data)//随机读数据paddr页地址,offset页内偏移地址
- {
- control_start();//开控制
- nand_reset();//复位
- rNFCMD=NAND_CMD_READ_1st;
- rNFADDR=0;
- rNFADDR=0;
- rNFADDR=paddr&0xff;
- rNFADDR=(paddr>>8)&0xff;
- rNFADDR=(paddr>>16)&0xff;
- rNFCMD=NAND_CMD_READ_2st;
- detect_nand_busy();
- rNFCMD=NAND_CMD_RANDOM_READ_1st;
- rNFADDR=offset&0xff;//写入页内偏移地址
- rNFADDR=(offset>>8)&0xff;
- rNFCMD=NAND_CMD_RANDOM_READ_2st;
- *data=rNFDATA8;
- control_end();
- return1;
- }
- intnand_random_write(U32paddr,U32offset,U8data)//随机写,paddr页地址,offset页内偏移地址
- {
- control_start();//开控制
- nand_reset();//复位
- rNFCMD=NAND_CMD_WRITE_PAGE_1st;
- rNFADDR=0;
- rNFADDR=0;
- rNFADDR=paddr&0xff;
- rNFADDR=(paddr>>8)&0xff;
- rNFADDR=(paddr>>16)&0xff;
- rNFCMD=NAND_CMD_RANDOM_WRITE;
- rNFADDR=offset&0xff;//写入页内偏移地址
- rNFADDR=(offset>>8)&0xff;
- rNFDATA8=data;
- rNFCMD=NAND_CMD_WRITE_PAGE_2st;
- detect_nand_busy();//检测忙
- rNFCMD=NAND_CMD_READ_STATUS;//读状态
- if(rNFDATA8&1)
- {
- #ifdefNAND_DEBUG
- Uart_Printf("/r/nError:nandrandomwriteerror...paddr=0x%x,offset=0x%x",paddr,offset);
- #endif
- return-1;//删除错误返回0
- }
- control_end();
- return1;//成功返回1
- }
- voidnand_test_bad_block(void)//测试坏块函数,并标记spare区最后一个地址,如果非0xff则为坏块
- {
- U8dest[64*2048];//一个块的main区容量
- U8src[64*2048];
- U32i,k;
- #ifdefNAND_DEBUG
- Uart_Printf("/r/ntestandmaskbadblockisbegain./r/n");
- #endif
- //main区检测
- for(i=0;i<64*2048;i++)
- {
- dest[i]=0xff;//初始化缓冲区
- src[i]=0;
- }
- //删除所有块
- for(i=0;i
- {
- nand_block_erase(i);
- }
- for(i=0;i
- {
- nand_page_write(i*64,src,64*2048);
- nand_page_read(i*64,dest,64*2048);//使用了ecc校验读出来即可登记坏块信息
- }
- for(i=0;i<64*2048;i++)
- {
- dest[i]=0;//初始化缓冲区
- src[i]=0xff;
- }
- //删除所有块
- for(i=0;i
- {
- nand_block_erase(i);
- }
- for(i=0;i
- {
- nand_page_write(i*64,src,64*2048);
- nand_page_read(i*64,dest,64*2048);//使用了ecc校验读出来即可登记坏块信息
- }
- //
- //spare区检测
- for(i=0;i<64;i++)
- {
- dest[i]=0xff;//初始化缓冲区
- src[i]=0;
- }
- //删除所有块
- for(i=0;i
- {
- nand_block_erase(i);
- }
- for(i=0;i
- {
- if(nand_bbi.area[i/64]==1)//如果是坏块则跳过
- continue;
- for(k=0;k<64;k++)
- {
- nand_random_write(i,2048+k,src[k]);
- nand_random_read(i,2048+k,&dest[k]);
- if(dest[k]!=src[k])//不相等则登记为坏块
- {
- nand_mask_bad_block(i/64);
- break;
- }
- }
- }
- for(i=0;i<64;i++)
- {
- dest[i]=0x0;//初始化缓冲区
- src[i]=0xff;
- }
- //删除所有块
- for(i=0;i
- {
- nand_block_erase(i);
- }
- for(i=0;i
- {
- if(nand_bbi.area[i/64]==1)//如果是坏块则跳过
- continue;
- for(k=0;k<64;k++)
- {
- nand_random_write(i,2048+k,src[k]);
- nand_random_read(i,2048+k,&dest[k]);
- if(dest[k]!=src[k])//不相等则登记为坏块
- {
- nand_mask_bad_block(i/64);
- break;
- }
- }
- }
- #ifdefNAND_DEBUG
- Uart_Printf("/r/ntestandma
NANDFlashd读写s3c244 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)