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

📄 k9k2g16.c

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

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


static int NF16_ReadPage(U32 block,U32 page,U16 *buffer)
{
    int i,j;
    register U16 * 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 0
/*
    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 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)|(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
		
		if(page==0)
		{
		if(i%16==0)
		Uart_Printf("\nR-SECC:");
		Uart_Printf("%04x ",se16Buf[i]);
		}
		
	}
	
    rNFMECCDATA0=se16Buf[0];
    rNFMECCDATA1=se16Buf[1];
    rNFMECCDATA2=se16Buf[2];
    rNFMECCDATA3=se16Buf[3];

    NF_nFCE_H();  

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

}    	

static int NF16_WritePage(U32 block,U32 page,U16 *buffer)
{
    int i;
    U32 blockPage=(block<<6)+page;
    U16 *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(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 0
		//data write into main data area
		for(i=0;i<1024;i++)
		{
		NF_WRDATA(*bufPt++);	
		
	//	if(page==0){
	//	if(i%8==0)
	//	Uart_Printf("\n%xh:",i);
	//	Uart_Printf("%04x ",*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)|(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();     


#if ECC_CHECK_x16 	
	//ECC generation from main area ECC status.    
    // Ecc lower
    se16Buf[0]=rNFMECC0&0xff;
    se16Buf[1]=(rNFMECC0>>8)&0xff;
    se16Buf[2]=(rNFMECC0>>16)&0xff;
    se16Buf[3]=(rNFMECC0>>24)&0xff;	
    // Ecc higher
    se16Buf[0] |=(((rNFMECC1)&0xff)<<8);
    se16Buf[1] |=(((rNFMECC1>>8)&0xff)<<8);
    se16Buf[2] |=(((rNFMECC1>>16)&0xff)<<8);
    se16Buf[3] |=(((rNFMECC1>>24)&0xff)<<8);	

	
    se16Buf[5] =0xffff;		// Marking good block
    
/*	
		// ECC generation from spare area ECC status.	 
		se16Buf[?]=rNFSECC&0xff;
		se16Buf[!]=(rNFSECC>>8)&0xff;
		se16Buf[?]|=(((rNFSECC>>16)&0xff)<<8);
		se16Buf[!]|=(((rNFSECC>>24)&0xff)<<8);	  
		se16Buf[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<32;i++)
    {
		NF_WRDATA(se16Buf[i]);	// Write spare array(ECC and Mark)
		
		if(page==0)
		{
		if(i%16==0)
		Uart_Printf("\nW-SECC:");
		Uart_Printf("%04x ",se16Buf[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);
	NF16_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 K9k2g16_AutoLoad()
{
   U32 block, page, j;
   U16 addr,i,id;
   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();

/*
	// Initializing Buffer ----------------INIT
	stepdata = (U16 *)(steppingstone);
	for(i=3;i<1024;i++)
		*(stepdata++) = i; 
 	Delay(1000);
*/	
   NF16_AutoLoad(block, page, addr, size);
   rNFCONT|=(3<<0); //software mode

    Uart_Printf("[Auto Load OK!!! ]\n");
    Delay(10000);

/*
// abort occurred while running this loop!!
   steppingstone=0x08000000;
   for(j=0;j<size*1024;j++)
   {
        if(j%16==0)
	    Uart_Printf("\n%04xh:",j*2);
        Uart_Printf("%04x ",*(U16 *)(steppingstone+j));
   }
*/
}

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

       rNFCONT =rNFCONT & ~(0x3);	
    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
    rNFCONT =rNFCONT&~(3<<0); 
}


void K9k2g16_AutoStore()
{
   U32 block, page, j;
   U16 addr,id;
	
   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(!NF16_EraseBlock(block))    Uart_Printf("Block Erase_Fail!!! \n");
   else   Uart_Printf("Block Erase_OK!!! \n");

   NF16_AutoStore(block, page, addr);

  }

void NF16_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<<6)+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
	
    // Ecc lower
    se16Buf[0]=rNFMECC0&0xff;
    se16Buf[1]=(rNFMECC0>>8)&0xff;
    se16Buf[2]=(rNFMECC0>>16)&0xff;
    se16Buf[3]=(rNFMECC0>>24)&0xff;	
    // Ecc higher
    se16Buf[0] |=((rNFMECC1<<8)&0xff00);
    se16Buf[1] |=((rNFMECC1)&0xff00);
    se16Buf[2] |=((rNFMECC1>>8)&0xff00);
    se16Buf[3] |=((rNFMECC1>>16)&0xff00);	
	
    se16Buf[5] =0xffff;		// Marking good block


    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();
	Uart_Printf("[Auto Store PROGRAM_ERROR:block#=%d]\n",block);
	NF16_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 + -