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

📄 k9d1g08.c

📁 s3c24a0固件测试代码 ? ? ? ? ?啊 
💻 C
📖 第 1 页 / 共 2 页
字号:
    }

    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();
    	Uart_Printf("[Program error is occurred but ignored]\n");
    }
    else 
    {
    	NF_nFCE_H();
    }

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

static int NF_ReadPage(U32 block,U32 page,U8 *buffer)
{
    int i;
    register U8 * bufPt=buffer;
    unsigned int blockPage;    
    
    blockPage=(block<<5)+page;
    NF_RSTECC();    // Reset ECC
    NF_MECC_UnLock();
    NF_CLRRnB(); 
    NF_nFCE_L();      // nCE enable
    
    NF_CMD(0x00);   // Read command
    // Address 4 cycles
    NF_ADDR(0);	    // Column address
    NF_ADDR(blockPage&0xff);	    //  page address
    NF_ADDR((blockPage>>8)&0xff);   // 
    NF_ADDR((blockPage>>16)&0xff);  //
   

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


#if 0
    i=512;
    while(i--!=0)
    {
       
	 *bufPt++=NF_RDDATA();	// Read one page
	 
    }
#elif 1
		//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)|(0<<28)|(1<<27)|(0<<23)|(1<<22)|(0<<20)|(512);
		  //Handshake,AHB,interrupt,(UNIT),whole,S/W,no_autoreload,byte,count=512;
		  
		  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
    __RdPage512(bufPt);
#endif
    NF_MECC_Lock();


    rNFMECCDATA0=NF_RDDATA();
    rNFMECCDATA1=NF_RDDATA();
    rNFMECCDATA2=NF_RDDATA();
    rNFMECCDATA3=NF_RDDATA();

    NF_nFCE_H();  


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

}    	
   
static int NF_WritePage(U32 block,U32 page,U8 *buffer)
{
    int i;
    U32 blockPage=(block<<5)+page;
    U8 *bufPt=buffer;

	// Port setting for SMC_WP
	   rGPCON_L =  (rGPCON_L & ~(0x3<<2))|(0x1<<2);
	   rGPDAT |=(1<<1);	
	   
    NF_RSTECC();    // Initialize ECC
    
    NF_MECC_UnLock();
  
    NF_CLRRnB(); 
    NF_nFCE_L(); 
    
    
    NF_CMD(0x0);// for programming 'A' area
    NF_CMD(0x80);   // Write 1st command
    NF_ADDR(0);			    // Column 0
    NF_ADDR(blockPage&0xff);	    //
    NF_ADDR((blockPage>>8)&0xff);   // Block & page num.
    NF_ADDR((blockPage>>16)&0xff);  //

#if 0
			
			//data write into main data area
			
			for(i=0;i<512;i++)
			{
			NF_WRDATA(*bufPt++);	
			}  

	
#elif 1
				//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)|(0<<20)|(512);
				  //Handshake,AHB,interrupt,(UNIT),whole,S/W,no_autoreload,Byte,count=512;
				  
				  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
			__WrPage512(bufPt);
#endif
	
    NF_MECC_Lock();     

#if ECC_CHECK 		
	//ECC generation from main area ECC status.  

    seBuf[0]=rNFMECC0&0xff;
    seBuf[1]=(rNFMECC0>>8)&0xff;
    seBuf[2]=(rNFMECC0>>16)&0xff;
    seBuf[3]=(rNFMECC0>>24)&0xff;	
    seBuf[5]=0xff;		// Marking good block
    /*	
		// ECC generation from spare area ECC status.	    
    seBuf[?]=rNFSECC&0xff;
    seBuf[?]=(rNFSECC>>8)&0xff;
    seBuf[5]=0xff;		// Marking good block
    
		//write  spare ECC  into another spare area 
*/
	//write ECC into spare area   
	//write spare ECC into another spare area	
		
	for(i=0;i<16;i++)
	{
	NF_WRDATA(seBuf[i]);
	}  
#endif

   
    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();
	Uart_Printf("[PROGRAM_ERROR:block#=%d]\n",block);
	NF_MarkBadBlock(block);
	rGPCON_L =  (rGPCON_L & ~(0x3<<2))|(0x3<<2);	
	return 0;
    }
    else 
    {
    
    	NF_nFCE_H();
   // 	Uart_Printf("[PROGRAM_OK:block#=%d]\n",block);
	rGPCON_L =  (rGPCON_L & ~(0x3<<2))|(0x3<<2);
	return 1;
    }	
}

void K9D1G08_AutoLoad()
{
   U32 block, page, j;
   U16 addr,i;
   U16 *stepdata;
   U32 size;

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

   NF_AutoLoad(block, page, addr, size);
   rNFCONT|=(3<<0); //software mode

    Uart_Printf("[Auto Load OK!!! ]\n");
    Delay(10000);
/*
   steppingstone=0x08000000;
   for(j=0;j<size*512;j++)
   {
        if(j%16==0)
	    Uart_Printf("\n%3xh:",j);
        Uart_Printf("%02x ",*(U8 *)(steppingstone+j));
   }

*/
   
}

void NF_AutoLoad(U32 block,U32 page, U16 addr, U8 size)
{
	unsigned int blockPage;


    //rNFCONT=rNFCONT&0xff8f;  ///???	
       rNFCONT =rNFCONT & ~(0x3);
	blockPage=(block<<5)+page;

	rNFCONT |=((addr<<16)|((size-1)<<4)); //  Load page Size: Max 8pages (512Bytes X 8 = 4KBytes)
	NF_CMD(0x00);

    //Address 4 cycles     
	rNFADDR=(blockPage<<8);    
	rNFCONT =rNFCONT&~(3<<0)|(1<<0); // Autoload Start

	// Autoload Done Check!!!
	while(! (rNFSTAT&(1<<15)));
	rNFSTAT|=(1<<15); // Clear
	rNFCONT =rNFCONT&~(3<<0); //s/w mode
}

void K9D1G08_AutoStore()
{
   U32 block, page, j;
   U16 addr;

   Uart_Printf("Input target block number:");
   block=Uart_GetIntNum();
   Uart_Printf("Input target page number:");   
   page=Uart_GetIntNum();
   Uart_Printf("Input start address of steppingstone to store:");
   addr=Uart_GetIntNum();
   
   rNFCONT&=~(1<<2); // Lock disable
   // You should erase block before Autostore!!!	  	 
   if(!NF_EraseBlock(block))    Uart_Printf("Block Erase_Fail!!! \n");
   else   Uart_Printf("Block Erase_OK!!! \n");

   NF_AutoStore(block, page, addr);

  }

void NF_AutoStore(U32 block,U32 page, U16 addr)
{
    unsigned int blockPage,i;

	// Port setting for SMC_WP
	   rGPCON_L =  (rGPCON_L & ~(0x3<<2))|(0x1<<2);
	   rGPDAT |=(1<<1);

    
    blockPage=(block<<5)+page;

   rNFCONT=rNFCONT&~(3<<0); //disable all mode
   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&=~(1<<2); // Lock disable
    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
	
    seBuf[0]=rNFMECC0&0xff;
    seBuf[1]=(rNFMECC0>>8)&0xff;
    seBuf[2]=(rNFMECC0>>16)&0xff;
    seBuf[3]=(rNFMECC0>>24)&0xff;	
    seBuf[5]=0xff;		// Marking good block

    for(i=0;i<16;i++)
    {
	NF_WRDATA(seBuf[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();
	Uart_Printf("[Auto Store PROGRAM_ERROR:block#=%d]\n",block);
	NF_MarkBadBlock(block);
	
    }
    else 
    {
       Uart_Printf("[Auto Store PROGRAM_OK!!! ]\n");
      	NF_nFCE_H();
    }

  rGPCON_L =  (rGPCON_L & ~(0x3<<2))|(0x3<<2);    
}


⌨️ 快捷键说明

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