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

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

?? k9k2g16.c

?? smdk2440的測試源碼
?? 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在线| 成人午夜视频免费看| 精品一区二区在线观看| 色综合天天做天天爱| 日韩视频免费观看高清完整版 | 丁香天五香天堂综合| 欧美日韩亚洲丝袜制服| 国产精品视频免费看| 久久精品国产77777蜜臀| 精品视频一区二区三区免费| 欧美国产激情一区二区三区蜜月| 奇米影视在线99精品| 日本韩国欧美在线| 亚洲欧洲在线观看av| 国产一区二区三区日韩| 日韩精品一区二区三区中文不卡 | 欧美日韩一区二区三区在线看| 国产日韩精品视频一区| 久久精品国产在热久久| 69久久夜色精品国产69蝌蚪网| 一区二区在线免费观看| 99久久精品一区二区| 国产精品毛片久久久久久| 国产精华液一区二区三区| 精品国产伦一区二区三区免费| 久久激情综合网| 久久亚洲精华国产精华液| 国产精品一区二区你懂的| 精品国产免费人成在线观看| 毛片av中文字幕一区二区| 7777精品伊人久久久大香线蕉| 天天色综合天天| 欧美高清激情brazzers| 美女视频黄久久| 久久婷婷久久一区二区三区| 国产精品一卡二卡| 中文一区在线播放| 日本高清成人免费播放| 亚洲线精品一区二区三区八戒| 欧美四级电影网| 人禽交欧美网站| 精品盗摄一区二区三区| 国产91在线观看丝袜| 亚洲欧美日韩国产中文在线| 在线观看av不卡| 青青草一区二区三区| 国产午夜精品一区二区三区视频| 国产成人aaa| 一区二区三区欧美在线观看| 欧美三区在线观看| 精品一区二区影视| √…a在线天堂一区| 欧美日韩一区二区三区免费看| 久久精品99国产国产精| 久久精品水蜜桃av综合天堂| 91在线观看高清| 日韩精品一卡二卡三卡四卡无卡| 国产日产欧美一区二区视频| 99久久免费视频.com| 亚洲444eee在线观看| 精品国产乱码久久久久久浪潮| 成人精品高清在线| 亚洲va韩国va欧美va| 国产网站一区二区| 欧美日韩亚洲综合在线| 国产精品一区不卡| 午夜电影久久久| 中文成人综合网| 欧美丰满美乳xxx高潮www| 成人免费视频caoporn| 午夜欧美电影在线观看| 国产女同互慰高潮91漫画| 欧美日韩一卡二卡三卡| 成人深夜在线观看| 日本欧美肥老太交大片| 亚洲欧美视频一区| 欧美精品一区二区高清在线观看| 色综合久久精品| 国产伦精品一区二区三区免费迷| 一区二区三区日韩在线观看| 久久久另类综合| 欧美高清视频不卡网| 97se亚洲国产综合在线| 国产一区二区三区黄视频 | 日韩精品五月天| 亚洲欧美色一区| 亚洲国产成人私人影院tom| 日韩欧美www| 欧美体内she精高潮| 97se亚洲国产综合自在线不卡| 国内成人自拍视频| 蜜桃传媒麻豆第一区在线观看| 亚洲精品成人精品456| 国产精品乱子久久久久| 欧美精品一区二区三区四区| 欧美一级欧美三级在线观看| 在线观看91视频| 91浏览器在线视频| 91原创在线视频| av在线不卡网| 成人亚洲一区二区一| 国产精品白丝av| 国产精品99久久久久久有的能看| 全部av―极品视觉盛宴亚洲| 天堂久久久久va久久久久| 亚洲福利一二三区| 亚洲韩国一区二区三区| 亚洲在线免费播放| 亚洲成人久久影院| 亚洲一区二区三区在线看| 亚洲精品自拍动漫在线| 亚洲女女做受ⅹxx高潮| 亚洲精品高清在线| 亚洲国产日韩一区二区| 午夜在线成人av| 日韩和欧美一区二区| 男女性色大片免费观看一区二区 | 亚洲精品欧美综合四区| 亚洲老妇xxxxxx| 亚洲va欧美va天堂v国产综合| 亚洲国产成人tv| 日本视频在线一区| 六月婷婷色综合| 国产在线日韩欧美| 成人做爰69片免费看网站| av在线播放不卡| 日本电影亚洲天堂一区| 欧美日韩一本到| 久久综合狠狠综合久久激情| 亚洲乱码国产乱码精品精可以看| 亚洲最大成人综合| 亚洲观看高清完整版在线观看| 日韩精品电影在线观看| 国产一区二区免费视频| 成人av先锋影音| 欧美美女一区二区三区| 亚洲精品一区二区三区蜜桃下载| 国产精品人人做人人爽人人添| 亚洲精品成人天堂一二三| 蜜臀91精品一区二区三区| 国产高清亚洲一区| 日本韩国精品一区二区在线观看| 777xxx欧美| 国产欧美一区二区精品性色超碰 | 色综合天天综合狠狠| 色婷婷精品大视频在线蜜桃视频| 欧美日韩情趣电影| 久久久久久久久岛国免费| 亚洲精品精品亚洲| 捆绑变态av一区二区三区| av毛片久久久久**hd| 91麻豆精品国产综合久久久久久 | 一个色妞综合视频在线观看| 奇米色777欧美一区二区| 粉嫩欧美一区二区三区高清影视| 欧美制服丝袜第一页| 精品久久久网站| 亚洲最色的网站| 国产福利一区二区| 欧美挠脚心视频网站| 国产无人区一区二区三区| 性做久久久久久免费观看欧美| 国产福利视频一区二区三区| 欧美精品v国产精品v日韩精品| 国产清纯在线一区二区www| 日韩专区一卡二卡| 99久久伊人精品| 26uuu国产电影一区二区| 亚洲va天堂va国产va久| www.亚洲国产| 亚洲精品在线三区| 亚洲va在线va天堂| 在线观看日韩高清av| 国产精品私人影院| 精品在线一区二区| 337p亚洲精品色噜噜噜| 亚洲男人天堂av| 99热99精品| 欧美激情综合五月色丁香| 麻豆精品新av中文字幕| 欧美久久免费观看| 亚洲最色的网站| 色婷婷亚洲精品| 亚洲色图制服丝袜| 国产91精品一区二区麻豆网站 | 中文字幕二三区不卡| 精品一二线国产| 91精品一区二区三区在线观看| 亚洲宅男天堂在线观看无病毒| 91丨九色porny丨蝌蚪| 国产精品国产三级国产专播品爱网 | 欧美日韩大陆在线| 夜色激情一区二区| 一本久久a久久精品亚洲| 国产精品国产三级国产专播品爱网| 国产成人精品一区二区三区四区| 久久这里只有精品视频网| 国产在线日韩欧美| 国产日韩欧美精品电影三级在线| 国产精品一区二区91|