亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? k9k2g16.c

?? 遠峰S3C2440測試源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
#define NF_RSTECC()			{rNFCONT|=(1<<4);}
#define NF_RDDATA() 		(rNFDATA)
#define NF_RDDATA16() 		((*(volatile unsigned short*)0x4E000010) )

#define NF_WRDATA(data) 	{rNFDATA=data;}

// RnB Signal
#define NF_CLEAR_RB()    		{rNFSTAT |= (1<<2);}	// Have write '1' to clear this bit.
#define NF_DETECT_RB()    		{while(!(rNFSTAT&(1<<2)));}	// edge detect.


#define ID_K9S1208V0M	0xec76
#define ID_K9K2G16U0M	0xecca

#define BAD_MARK	(0x44444444)

#if 1
// HCLK=100Mhz
#define TACLS		0	// 1-clk(0ns) 
#define TWRPH0		6	// 3-clk(25ns)
#define TWRPH1		0	// 1-clk(10ns)  //TACLS+TWRPH0+TWRPH1>=50ns
#else
// HCLK=50Mhz
#define TACLS		0  //1clk(0ns)
#define TWRPH0		1  //2clk(25ns)
#define TWRPH1		0  //1clk(10ns)
#endif


static U32 se16Buf[32/2]={
	0xffffffff,0xffffffff,0xffffffff,0xffffffff,
	0xffffffff,0xffffffff,0xffffffff,0xffffffff,
	0xffffffff,0xffffffff,0xffffffff,0xffffffff,
	0xffffffff,0xffffffff,0xffffffff,0xffffffff
};


void InputTargetBlock16(void)
{
	U32 no_block, no_page, no_byte;
	
	Uart_Printf("\nSource size:0h~%xh\n",downloadProgramSize);
	Uart_Printf("\nAvailable target block number: 0~2048\n");
	Uart_Printf("Input target block number:");
    targetBlock=Uart_GetIntNum();	// Block number(0~4095)
    if(targetSize==0)
    {
    	#if 0
    	Uart_Printf("Input target size(0x4000*n):");
    	targetSize=Uart_GetIntNum();	// Total byte size
	#else
   	Uart_Printf("Input program file size(bytes): ");
    	targetSize=Uart_GetIntNum();	// Total byte size
    	#endif
    }
	
	no_block = (U32)((targetSize/2048)/64);
	no_page = (U32)((targetSize/2048)%64);
	no_byte = (U32)(targetSize%2048);
	Uart_Printf("File:%d[%d-block,%d-page,%d-bytes].\n", targetSize, no_block, no_page, no_byte);
}


static int NF16_EraseBlock(U32 block)
{
    U32 blockPage=(block<<6);
    int i;

    NFConDone16=0;
    rNFCONT|=(1<<9); //Enable RnB Interrupt
    rNFCONT|=(1<<10); //Enable Illegal Access Interrupt
    pISR_NFCON= (unsigned)NFCon_Int16;
    rSRCPND=BIT_NFCON;
    rINTMSK=~(BIT_NFCON);

#if BAD_CHECK
    if(NF16_IsBadBlock(block))
	return FAIL;
#endif

	NF_nFCE_L();
    
	NF_CMD(0x60);   // Erase one block 1st command, Block Addr:A11-A27
	// Address 3-cycle
	NF_ADDR(blockPage&0xff);	    // A[18:11]
	NF_ADDR((blockPage>>8)&0xff);   // A[26:19]
	NF_ADDR((blockPage>>16)&0xff);	// A27


	NF_CLEAR_RB();
	NF_CMD(0xd0);	// Erase one blcok 2nd command

	 while(NFConDone16==0);
	 rNFCONT&=~(1<<9);   // Disable RnB Interrupt
	 rNFCONT&=~(1<<10); // Disable Illegal Access Interrupt
	 if(rNFSTAT&0x8) return FAIL;
 
	NF_CMD(0x70);   // Read status command

    if (NF_RDDATA()&0x1) // Erase error
    {	
    	NF_nFCE_H();
	Uart_Printf("[ERASE_ERROR:block#=%d]\n",block);
//	NF16_MarkBadBlock(block);
	return FAIL;
    }
    else 
    {
    	NF_nFCE_H();
        return OK;
    }
}

void __irq NFCon_Int16(void)
{
       NFConDone16=1;
	rINTMSK|=BIT_NFCON;
	ClearPending(BIT_NFCON);
	if(rNFSTAT&0x8)	Uart_Printf("Illegal Access is detected!!!\n");

  }



static int NF16_IsBadBlock(U32 block)
{
    int i;
    unsigned int blockPage;
    U32 bad_block_data;
    
    
    blockPage=(block<<6);	// For 2'nd cycle I/O[7:5] 
    
	NF_nFCE_L();

	NF_CLEAR_RB();

	NF_CMD(0x00);		 // read command
	NF_ADDR((1024+0)&0xff);			// 2060 = 0x080c
	NF_ADDR(((1024+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);	// A27
	NF_CMD(0x30);	// 2'nd command
	NF_DETECT_RB();	 // Wait tR(max 12us)

    bad_block_data=NF_RDDATA();  // mark bad block at first word of spare area

	NF_nFCE_H();    

       if(bad_block_data!=0xffffffff)
    {
    	Uart_Printf("[ block %d has been marked as a bad block(%x)]\n",block,bad_block_data);
    	return FAIL;
    }
    else
    {
     	return OK;
    }
}


static int NF16_MarkBadBlock(U32 block)
{
    	int i;
    	U32 blockPage=(block<<6);

	se16Buf[0]=BAD_MARK;   // Bad blcok mark=0x4444
   
    
	NF_nFCE_L(); 
	NF_CMD(0x80);   // Write 1st command
	
	NF_ADDR((1024+0)&0xff);			// 2060 = 0x080c
	NF_ADDR(((1024+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]
	
	NF_WRDATA(se16Buf[0]);	// Write Bad block information

	NF_CLEAR_RB();
	NF_CMD(0x10);   // Write 2nd command
	NF_DETECT_RB();

	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 OK;
}


static int NF16_ReadPage(U32 block,U32 page,U32 *buffer)
{
    int i;
    unsigned int blockPage;
    U32 ecc_low,ecc_high;
    U32 Mecc0, Mecc1, Secc;
    U16 ecc0, ecc1, ecc2, ecc3;
    U32 *bufPt=buffer;
    U32 se[16];	   
    
    blockPage=(block<<6)+page;
	
    NF_RSTECC();    // Initialize ECC
    NF_MECC_UnLock();
    
    NF_nFCE_L();    

    NF_CLEAR_RB();
    NF_CMD(0x00);	// 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);	// 2'nd command
    NF_DETECT_RB();

#if TRANS_MODE16==C_LANG
    for(i=0;i<512;i++) {
    	*bufPt++=NF_RDDATA();	// Read one page
    }
#elif TRANS_MODE16==DMA
	// Nand to memory dma setting
    rSRCPND=BIT_DMA0;	// Init DMA src pending.
    rDISRC0=NFDATA; 	// Nand flash data register
    rDISRCC0=(0<<0) | (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)|(2<<20)|(2048/4/4);
	//Handshake,AHB,interrupt,(4-burst),whole,S/W,no_autoreload,word,count=128;

	// DMA on and start.
    rDMASKTRIG0=(1<<1)|(1<<0);

	while(!(rSRCPND & BIT_DMA0));	// Wait until Dma transfer is done.
    rSRCPND=BIT_DMA0;
#endif

    NF_MECC_Lock();


 // ECC check by hardware
   
   NF16_Spare_Data[0]=NF_RDDATA();  // Bad block Information
   NF_SECC_UnLock();
   Mecc0=NF_RDDATA();
   Mecc1=NF_RDDATA();
   NF_SECC_Lock();
   
   rNFMECCD0=((Mecc1&0xff00)<<16)|((Mecc0&0xff00)<<8)|((Mecc1&0xff)<<8)|((Mecc0&0xff));
   rNFMECCD1=(Mecc1&0xff000000)|((Mecc0&0xff000000)>>8)|((Mecc1&0xff0000)>>8)|((Mecc0&0xff0000)>>16);
  
   NF16_Spare_Data[1]=Mecc0;
   NF16_Spare_Data[2]=Mecc1;
   NF16_Spare_Data[3]=NF_RDDATA();

   Secc=NF_RDDATA();
   rNFSECCD=(Secc&0xff000000)|((Secc&0xff0000)>>8)|((Secc&0xff00)<<8)|(Secc&0xff);
  
   NF16_Spare_Data[4]=Secc;

   for(i=5;i<16;i++) {
    	NF16_Spare_Data[i]=NF_RDDATA();	// Read spare array with 4byte width
       }
  
    NF_nFCE_H();    

   if (((rNFESTAT0&0xf) == 0x0) &&((rNFESTAT1&0xf) == 0x0)){
       Uart_Printf("ECC OK !!!\n");
       return OK;
       }
    else {
	Uart_Printf("ECC FAIL !!!\n");
	return FAIL;
    	}

 
}



static int NF16_WritePage(U32 block,U32 page,U32 *buffer)
{
    int i;
    U32 blockPage,Mecc0, Mecc1, Secc;
    U32 *bufPt=buffer;
	
	blockPage=(block<<6)+page;
	
	NF_RSTECC();	// Initialize ECC
       NF_MECC_UnLock();
	   
	NF_nFCE_L(); 
	NF_CMD(0x80);   // Write 1st 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);  // A7

	// Write page data.
	
#if TRANS_MODE16==C_LANG
	for(i=0;i<512;i++) {
		NF_WRDATA(*bufPt++);	// Write one page to NFM from buffer
	}
#elif TRANS_MODE16==DMA
	// Memory to Nand dma setting
	rSRCPND=BIT_DMA0;	// Init DMA src pending.
	rDISRC0=(unsigned)bufPt;	// Nand flash data register
	rDISRCC0=(0<<1) | (0<<0); //arc=AHB,src_addr=inc
	rDIDST0=NFDATA;
	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)|(2<<20)|(2048/4);
	//Handshake,AHB,interrupt,unit,whole,S/W,no_autoreload,word,count=128;

	// DMA on and start.
	rDMASKTRIG0=(1<<1)|(1<<0);

	while(!(rSRCPND & BIT_DMA0));	// Wait until Dma transfer is done.
	rSRCPND=BIT_DMA0;	
#endif

   NF_MECC_Lock();

   se16Buf[0]=0xffffffff;	// Marking good block(lower 16-bit is valid)
   NF_WRDATA(se16Buf[0]);	// Write spare array(ECC and Mark)
   NF16_Spare_Data[0]=se16Buf[0];
		
   se16Buf[1]=rNFMECC0;
   se16Buf[2]=rNFMECC1;
  

    
  // check spare ecc
    NF_SECC_UnLock();
    for(i=1;i<3;i++) {
		NF_WRDATA(se16Buf[i]);	// Write spare array(ECC and Mark)
		NF16_Spare_Data[i]=se16Buf[i];
      }  
    NF_SECC_Lock();
 
    Secc=rNFSECC;
    se16Buf[4]=Secc;
   
    for(i=3;i<16;i++) {
		NF_WRDATA(se16Buf[i]);	// Write spare array(ECC and Mark)
		NF16_Spare_Data[i]=se16Buf[i];
      }    
    NF_CLEAR_RB();
    NF_CMD(0x10);	 // Write 2nd command
#if 1
       NF_DETECT_RB();
#else
       while(!((rNFSTAT&0x4)||(rNFSTAT&0x8)));
	
	if(rNFSTAT&0x8){
		Uart_Printf("Illegal Access is detected!!!\n");
              return FAIL;
	}
#endif
	NF_CMD(0x70);   // Read status command   
    
	for(i=0;i<3;i++);  //twhr=60ns
    
    if (NF_RDDATA()&0x1) {// Page write error
    	NF_nFCE_H();
		Uart_Printf("[PROGRAM_ERROR:block#=%d]\n",block);
		NF16_MarkBadBlock(block);
		return FAIL;
    } else {
    	NF_nFCE_H();
		return OK;
	}


}



static U32 NF16_CheckId(void)
{
    int i;
    U32 id;
    U16 id1, id2, id3, id4;
    
	NF_nFCE_L();

	NF_CLEAR_RB();
	NF_CMD(0x90);
	NF_ADDR(0x0);
	for (i=0; i<10; i++);

//read by halfword !!!
	id1 = NF_RDDATA16();	// read 4byte.
	id2 = NF_RDDATA16();
	id3 = NF_RDDATA16();
	id4 = NF_RDDATA16();

	id=((id4<<24)|(id3<<16)|(id2<<8)|id1);
	
 	NF_nFCE_H();

    return id;
}



static void NF16_Init(void)
{
	// for S3C2440

	rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(1<<0);	
	// TACLS		[14:12]	CLE&ALE duration = HCLK*TACLS.
	// TWRPH0		[10:8]	TWRPH0 duration = HCLK*(TWRPH0+1)
	// TWRPH1		[6:4]	TWRPH1 duration = HCLK*(TWRPH1+1)
	// AdvFlash(R)	[3]		Advanced NAND, 0:256/512, 1:1024/2048
	// PageSize(R)	[2]		NAND memory page size
	//						when [3]==0, 0:256, 1:512 bytes/page.
	//						when [3]==1, 0:1024, 1:2048 bytes/page.
	// AddrCycle(R)	[1]		NAND flash addr size
	//						when [3]==0, 0:3-addr, 1:4-addr.
	//						when [3]==1, 0:4-addr, 1:5-addr.
	// BusWidth(R/W) [0]	NAND bus width. 0:8-bit, 1:16-bit.
	
	rNFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
	// Lock-tight	[13]	0:Disable lock, 1:Enable lock.
	// Soft Lock	[12]	0:Disable lock, 1:Enable lock.
	// EnablillegalAcINT[10]	Illegal access interupt control. 0:Disable, 1:Enable
	// EnbRnBINT	[9]		RnB interrupt. 0:Disable, 1:Enable
	// RnB_TrandMode[8]		RnB transition detection config. 0:Low to High, 1:High to Low
	// SpareECCLock	[6]		0:Unlock, 1:Lock
	// MainECCLock	[5]		0:Unlock, 1:Lock
	// InitECC(W)	[4]		1:Init ECC decoder/encoder.
	// Reg_nCE		[1]		0:nFCE=0, 1:nFCE=1.
	// NANDC Enable	[0]		operating mode. 0:Disable, 1:Enable.

//	rNFSTAT = 0;
    
//    Nand_Reset();
}




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内精品视频一区二区三区八戒| 久久综合色播五月| 亚洲男同性视频| 色天使色偷偷av一区二区| 亚洲精品国产品国语在线app| 93久久精品日日躁夜夜躁欧美| |精品福利一区二区三区| 91亚洲大成网污www| 亚洲影院在线观看| 555夜色666亚洲国产免| 国产在线精品免费| 国产精品高清亚洲| 欧美午夜一区二区三区| 蜜臀久久99精品久久久久久9| 欧美va天堂va视频va在线| 国产一区二区调教| 国产精品久久久久毛片软件| 一本在线高清不卡dvd| 亚洲韩国一区二区三区| 欧美mv日韩mv国产网站| 成人动漫一区二区三区| 亚洲永久免费视频| 久久综合九色综合欧美就去吻| 国产精品99久久久| 亚洲动漫第一页| 久久久五月婷婷| 色综合久久综合| 久久国产欧美日韩精品| 国产精品毛片久久久久久| 欧美三级资源在线| 国产中文字幕一区| 亚洲一区在线观看免费| 久久久综合精品| 欧美日韩视频不卡| 国产精品77777竹菊影视小说| 一二三四社区欧美黄| 欧美精品一区男女天堂| 99免费精品在线| 麻豆精品国产传媒mv男同| 亚洲精品国产精华液| 国产性天天综合网| 欧美精品日韩一区| 菠萝蜜视频在线观看一区| 男男视频亚洲欧美| 亚洲免费观看视频| 久久视频一区二区| 欧美日韩1234| 一本久久综合亚洲鲁鲁五月天| 久久av老司机精品网站导航| 亚洲综合一二三区| 国产日韩欧美激情| 欧美mv日韩mv国产| 91精品国产综合久久久久久漫画| 99精品久久久久久| 国产成人超碰人人澡人人澡| 三级久久三级久久久| 亚洲精品日韩专区silk| 国产精品三级在线观看| 日韩一区二区不卡| 欧美日韩午夜影院| 欧美性三三影院| 99v久久综合狠狠综合久久| 国产精品一区二区视频| 久久se这里有精品| 看电视剧不卡顿的网站| 天使萌一区二区三区免费观看| 亚洲精品午夜久久久| 亚洲色图欧洲色图| 国产精品免费丝袜| 久久亚洲二区三区| 精品国产一区二区三区不卡| 日韩片之四级片| 欧美电影免费观看完整版| 欧美美女bb生活片| 欧美少妇性性性| 欧美四级电影在线观看| 色噜噜狠狠成人网p站| 91网站黄www| 99国产精品久| 欧美午夜影院一区| 欧美精品1区2区| 91精品蜜臀在线一区尤物| 91精品国产综合久久久蜜臀粉嫩 | 色久综合一二码| 成人av在线影院| 91亚洲国产成人精品一区二三| eeuss鲁片一区二区三区在线看| 成人午夜视频网站| 97久久人人超碰| 91精品福利在线| 欧美日高清视频| 日韩三级在线观看| 久久久不卡网国产精品一区| 国产日产亚洲精品系列| 国产精品第一页第二页第三页| 国产精品伦一区| 亚洲午夜电影在线观看| 日本伊人色综合网| 国产一区二区三区国产| 成人一道本在线| 91国产丝袜在线播放| 欧美精品国产精品| 精品国产乱码久久久久久老虎| 久久精品欧美一区二区三区麻豆| 国产精品久久久久久久久晋中| 亚洲综合另类小说| 蜜臀av一区二区在线免费观看| 国产精品一线二线三线| 91麻豆国产福利在线观看| 欧美日韩国产电影| 久久网站最新地址| 亚洲综合色区另类av| 热久久国产精品| 成人国产一区二区三区精品| 欧美优质美女网站| 久久女同性恋中文字幕| 亚洲另类在线制服丝袜| 久久精品国产亚洲高清剧情介绍 | 日韩精品三区四区| 国产精品白丝av| 精品污污网站免费看| 精品国产91洋老外米糕| 亚洲男女毛片无遮挡| 精品中文av资源站在线观看| 一本色道久久综合狠狠躁的推荐| 日韩精品一区二区三区视频| 国产精品福利一区| 久久精品国产免费| 日本高清不卡一区| 久久久午夜精品| 丝袜诱惑亚洲看片| 99久久婷婷国产精品综合| 日韩三级电影网址| 亚洲国产视频一区二区| 成人午夜av电影| 日韩你懂的在线观看| 亚洲综合无码一区二区| 粉嫩aⅴ一区二区三区四区五区| 欧美日韩午夜影院| 亚洲欧洲日韩在线| 国产乱子伦视频一区二区三区 | 亚洲综合区在线| 成人av在线网站| 久久蜜臀精品av| 青娱乐精品在线视频| 色88888久久久久久影院按摩 | 99re8在线精品视频免费播放| 精品久久五月天| 日本欧美一区二区在线观看| 色8久久人人97超碰香蕉987| 国产精品视频九色porn| 国产在线视频精品一区| 日韩午夜激情视频| 午夜激情久久久| 在线视频一区二区三区| 亚洲欧洲性图库| 成人国产精品免费观看| 国产午夜精品一区二区三区视频 | 欧美成人一区二区| 日韩成人午夜精品| 欧美高清www午色夜在线视频| 一区二区免费在线播放| av男人天堂一区| 国产精品丝袜一区| 粉嫩av一区二区三区| 国产亚洲精品资源在线26u| 韩日欧美一区二区三区| 日韩欧美国产电影| 另类小说图片综合网| 日韩一级高清毛片| 黄色资源网久久资源365| 欧美va亚洲va在线观看蝴蝶网| 久久精品国产77777蜜臀| 精品三级av在线| 国产999精品久久久久久| 国产午夜亚洲精品午夜鲁丝片| 国产成人亚洲综合a∨婷婷图片| 2021国产精品久久精品| 国产成人精品一区二区三区四区| 2023国产一二三区日本精品2022| 国产一区二区在线看| 久久精品人人做人人综合| 成人精品国产福利| 一区二区三区在线观看动漫| 欧美在线不卡视频| 秋霞电影网一区二区| 欧美大胆人体bbbb| 国产精品系列在线观看| 亚洲欧洲日韩一区二区三区| 欧美亚洲综合另类| 美日韩一区二区三区| 久久日韩粉嫩一区二区三区| caoporm超碰国产精品| 一区二区激情小说| 日韩欧美一二三四区| 国产精品一级二级三级| 亚洲黄一区二区三区| 日韩一区二区三区在线视频| 国产乱子伦视频一区二区三区| 亚洲天堂网中文字|