⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 k9k2g16.c

📁 三星S3C2460 USB DEVICE /USB HOST 监控代码
💻 C
📖 第 1 页 / 共 2 页
字号:
}

static int NF16_MarkBadBlock(unsigned int block)
{
    int i;
    unsigned int blockPage;
    blockPage=(block<<6);
    
    se16Buf[0]=0xffff;
    se16Buf[1]=0xffff;    
    se16Buf[2]=0xffff;
    se16Buf[3]=0xffff;  	
    se16Buf[5]=0x4444;   // Bad blcok mark=0x4444
  
  //  NF_CLRRnB(); 
    NF_nFCE_L(); 
        
    NF_CMD(0x80);   // Write 1st command
    
	NF_ADDR((0)&0xff);			// 2048= 0x0800
	NF_ADDR(((0)>>8)&0xff);	// A[10:8]
	NF_ADDR((blockPage)&0xff);	// A[11;18]
	NF_ADDR((blockPage>>8)&0xff);	// A[26:19]
	NF_ADDR((blockPage>>16)&0xff);	// A[27]
	
    for(i=0;i<1024;i++)
    {
	NF_WRDATA(0xffff);		
    }  	
	
    for(i=0;i<32;i++)
    {
	NF_WRDATA(se16Buf[i]);	// Write spare array
    }

    NF_CMD(0x10);   // Write 2nd command
    
    for(i=0;i<10;i++);  //tWB = 100ns. ///???????

    NF_TRANSRnB();      // Wait tPROG(200~500us)
  
    NF_CMD(0x70);
    
    for(i=0;i<3;i++);  //twhr=60ns////??????
    
    if (NF_RDDATA()&0x1) // Spare arrray write error
    {	
    	NF_nFCE_H();
    	printf("[Program error is occurred but ignored]\n");
    }
    else 
    {
    	NF_nFCE_H();
    }

    printf("[block #%d is marked as a bad block]\n",block);
    return 1;
}


static int NF16_ReadPage(unsigned int block,unsigned int page,unsigned short *buffer)
{
    int i,j;
    register unsigned short * bufPt=buffer;
    unsigned int blockPage;
   
    blockPage=(block<<6)+page;
    NF_RSTECC();    // Reset ECC
    NF_MECC_UnLock();
    NF_CLRRnB(); 
    NF_nFCE_L();      // nCE enable
    
    NF_CMD(0x00);   // 1st Read command
    
	NF_ADDR(0); 	// Column (A[7:0]) = 0
	NF_ADDR(0);		// A[10:8]
	NF_ADDR((blockPage)&0xff);	// A[18:11]
	NF_ADDR((blockPage>>8)&0xff);	// A[26:19]
	NF_ADDR((blockPage>>16)&0xff);  // A27

    NF_CMD(0x30);   // 2nd Read command   

//    for(i=0;i<5;i++); //wait tWB(100ns)
    
    NF_TRANSRnB();    // Wait tRnB(max 12us)

#if 1
/*
    i=1024;
    while(i--!=0)
    {
       
	 *bufPt++=NF_RDDATA();	// Read one page
 
    }
*/
	for(i=0;i<1024;i++)   // 1 page 
	{
		*bufPt++=NF_RDDATA();  // Read one page

	}

#elif 0
		//DMA 
	  
	//	  rINTMSK=~(BIT_DMA);
	//	  rINTSUBMSK=~(BIT_SUB_DMA0);
		  rSUBSRCPND=BIT_SUB_DMA0;	
	
		  rDISRC0=0x40c00010; //NF_RDDATA()
		  rDISRCC0=(0<<1)|(1<<0); //arc=AHB,src_addr=fix
		  rDIDST0=(unsigned)bufPt;
		  rDIDSTC0=(0<<1)|(0<<0); //dst=AHB,dst_addr=inc;
		  rDCON0=(1<<31)|(1<<30)|(1<<29)|(1<<28)|(1<<27)|(0<<23)|(1<<22)|(1<<20)|(2048/8);
		  //Handshake,AHB,interrupt,(BURST),whole,S/W,no_autoreload,16bit,count=2048/8;
		  
		  rDMASKTRIG0=(1<<1)|(1<<0);
	  
	  //   while(dmaDone==0);
	  
	  //   rINTSUBMSK=BIT_ALLMSK;
	  //	rINTMSK=BIT_ALLMSK;
	  
		  while(!(rSUBSRCPND & BIT_SUB_DMA0));
		  rSUBSRCPND=BIT_SUB_DMA0;
	  
	  //	  while(!(rNF_STAT&(1<<10)));
	
#elif 0
    __RdPage1024(bufPt);
#endif
    NF_MECC_Lock();

	for(i=0;i<32;i++)   // 1 page 
	{
		se16Buf[i]=NF_RDDATA();  // Read one page
	}
	
    rNFMECCDATA0=(((se16Buf[3]&0xff)<<8)|(se16Buf[1]&0xff));
    rNFMECCDATA1=((se16Buf[3]&0xff00)|((se16Buf[1]&0xff00)>>8));
    rNFMECCDATA2=(((se16Buf[4]&0xff)<<8)|(se16Buf[2]&0xff));
    rNFMECCDATA3=((se16Buf[4]&0xff00)|((se16Buf[2]&0xff00)>>8));
	
    NF_nFCE_H();  

    if(((rNFESTAT0&0x03)||(rNFESTAT1&0x03))==0x0)
    	{
    	     //printf("[ECC OK!!!]\n");
      	     return 1;
       }
	else
	{
		  printf(" ECC FAIL !!!\n");
		return 0;
	}

}    	

static int NF16_WritePage(unsigned int block,unsigned int page,unsigned short *buffer)
{
    int i;
    unsigned int blockPage=(block<<6)+page;
    unsigned short *bufPt=buffer;
	   
    NF_RSTECC();    // Initialize ECC
    
    NF_MECC_UnLock();
  
    NF_CLRRnB();
    NF_nFCE_L(); 
    
    NF_CMD(0x80);   // Write 1st command
    for(i=0;i<10;i++);  
	
	NF_ADDR(0); 	// Column (A[7:0]) = 0
	NF_ADDR(0);		// A[10:8]
	NF_ADDR((blockPage)&0xff);	// A[18:11]
	NF_ADDR((blockPage>>8)&0xff);	// A[26:19]
	NF_ADDR((blockPage>>16)&0xff);  // A7

#if 1
		//data write into main data area
		for(i=0;i<1024;i++)
		{
		NF_WRDATA(*bufPt++);	
		
	//	if(page==0){
	//	if(i%8==0)
	//	printf("\n%xh:",i);
	//	printf("%04x ",*bufPt++);	
	//	}
		}

#elif 0
			//DMA 
		  
		//	  rINTMSK=~(BIT_DMA);
		//	  rINTSUBMSK=~(BIT_SUB_DMA0);
			  rSUBSRCPND=BIT_SUB_DMA0;	
		
			  rDISRC0=(unsigned)bufPt;
			  rDISRCC0=(0<<1)|(0<<0); //arc=AHB,src_addr=inc
			  rDIDST0=0x40c00010; //NF_WRDATA()
			  rDIDSTC0=(0<<1)|(1<<0); //dst=AHB,dst_addr=fix;
			  rDCON0=(1<<31)|(1<<30)|(1<<29)|(0<<28)|(1<<27)|(0<<23)|(1<<22)|(1<<20)|(2048/2);
			  //Handshake,AHB,interrupt,(UNIT),whole,S/W,no_autoreload,16bit,count=2048/2;
			  
			  rDMASKTRIG0=(1<<1)|(1<<0);
		  
		  //   while(dmaDone==0);
		  
		  //   rINTSUBMSK=BIT_ALLMSK;
		  //	rINTMSK=BIT_ALLMSK;
		  
			  while(!(rSUBSRCPND & BIT_SUB_DMA0));
			  rSUBSRCPND=BIT_SUB_DMA0;
		  
		  //	  while(!(rNF_STAT&(1<<10)));
		
#elif 0
		__WrPage1024(bufPt);
#endif
  
    NF_MECC_Lock();     


    se16Buf[0] =0xffff;		// Marking good block


	//ECC generation from main area ECC status.   
	// Ecc lower
    se16Buf[1]=rNFMECC0&0xffff;
    se16Buf[2]=(rNFMECC0>>16)&0xffff;
    se16Buf[3]=rNFMECC1 &0xffff;
    se16Buf[4]=(rNFMECC1>>16)&0xffff;
     
    

	//write ECC into spare area   
	//write spare ECC into another spare area 	
    for(i=0;i<32;i++)
    {
		NF_WRDATA(se16Buf[i]);	// Write spare array(ECC and Mark)
		Spare16[i]=se16Buf[i];
    	} 



    NF_CMD(0x10);   // Write 2nd command
    
//  for(i=0;i<10;i++);  
    
    NF_TRANSRnB();  //wait tPROG 200~500us;
 
     
    NF_CMD(0x70);   // Read status command   
    
    for(i=0;i<3;i++); 
    
    
    if (NF_RDDATA()&0x1) // Page write error
    {	
    	NF_nFCE_H();
	printf("[PROGRAM_ERROR:block#=%d]\n",block);
	NF16_MarkBadBlock(block);
	return 0;
    }
    else 
    {
    
    	NF_nFCE_H();
    	//printf("[PROGRAM_OK:block#=%d]\n",block);
	return 1;

    }

}

void K9k2g16_AutoLoad()
{
   unsigned int block, page, j;
   unsigned short addr,i,id;
   unsigned short *stepdata;
   unsigned int size;

   printf("Input source block number:");
   block=GetIntNum();
   printf("Input source page number:");   
   page=GetIntNum();
   printf("Input start address of steppingstone to load :");
   addr=GetIntNum();
   printf("Input page size of loaded:");   
   size=GetIntNum();

 
   NF16_AutoLoad(block, page, addr, size);
   rNFCONT =rNFCONT&~(3<<0) |(3<<0); //Software mode

    printf("[Auto Load OK!!! ]\n");
 
}

void NF16_AutoLoad(unsigned int block,unsigned int page, unsigned short addr, unsigned char size)
{
    unsigned int blockPage;

    blockPage=(block<<6)+page;

    rNFCONT |=((addr<<16)|((size-1)<<4)); //  Load page Size: Max 2pages (2048Bytes X 2 = 4KBytes)
    
    NF_ADV_CMD(0x30,0x00);

    rNFADDR=(blockPage<<8);    
    rNFCONT =rNFCONT&~(3<<0)|(1<<0); // Autoload Start
    
// Autoload Done Check!!!
    while(! (rNFSTAT&(1<<15)));
    rNFSTAT|=(1<<15); // Clear
 }


void K9k2g16_AutoStore()
{
   unsigned int block, page, j;
   unsigned short addr,id;
	
   printf("Input target block number:");
   block=GetIntNum();
   printf("Input target page number:");   
   page=GetIntNum();
   printf("Input start address of steppingstone to store:");
   addr=GetIntNum();
   
	
   // You should erase block before Autostore!!!	  	 
   if(!NF16_EraseBlock(block))    printf("Block Erase_Fail!!! \n");
   else   printf("Block Erase_OK!!! \n");

   NF16_AutoStore(block, page, addr);

  }

void NF16_AutoStore(unsigned int block,unsigned int page, unsigned short addr)
{
    unsigned int blockPage,i;
    
    blockPage=(block<<6)+page;

   rNFCONF&=~(1<<3); //Disable H/W Flash_nCE(manual set)
   rNFCONT =rNFCONT&~(1<<7); //Enable Reg Flash_nCE		
    
    NF_CLRRnB();

    rNFCONT |=(addr<<16); // AutoStore page size is only 1 page

    rNFADDR=0;
    rNFADDR=(blockPage<<8);
    
    NF_CMD(0x80);// 1st command

    rNFCONT =rNFCONT&~(3<<0) |(2<<0); // AutoStore Start 
  
   
    // AutoStore Done Check!!!
    while(! (rNFSTAT&(1<<14)));

    rNFSTAT|=(1<<14); // AutoStore Done Clear

    NF_nFCE_L(); 
    rNFCONT =rNFCONT&~(3<<0) |(3<<0); //Software mode
	

    se16Buf[0] =0xffff;		// Marking good block
    
    se16Buf[1]=rNFMECC0&0xffff;
    se16Buf[2]=(rNFMECC0>>16)&0xffff;
    se16Buf[3]=rNFMECC1 &0xffff;
    se16Buf[4]=(rNFMECC1>>16)&0xffff;
	   

    for(i=0;i<32;i++)
    {
	NF_WRDATA(se16Buf[i]);
    }  

    NF_CMD(0x10); // 2nd command
    
    
//    for(i=0;i<10;i++);  
    
    NF_TRANSRnB();  //wait tPROG 200~500us;
    NF_CLRRnB();
    NF_CMD(0x70);   // Read status command   
    
//    for(i=0;i<3;i++); 
    
    if (NF_RDDATA()&0x1) // Page write error
    {	
    	NF_nFCE_H();
	printf("[Auto Store PROGRAM_ERROR:block#=%d]\n",block);
	NF16_MarkBadBlock(block);
	
    }
    else 
    {
       printf("[Auto Store PROGRAM_OK!!! ]\n");
      	NF_nFCE_H();
    }

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -