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

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

?? nand_test.c

?? MBA2440(s3c2440)的 源代碼文件 ARM920T內核。
?? C
字號:
/****************************************************************************
 * file name	: nand_test.c
 * Date			: 15. 04. 2005
 * Version		: 1.0
 * Description	: NAND flash test menu display function
 *
 *
 ****************************************************************************/

#include "nand_test.h"


void NAND_flash_test(void)
{
	int sel = 0;

	while(1){
		Uart_Printf("+--------------[ NAND flash test ]----------------+\n");
		Uart_Printf("|  1:SOP(K9F5608U0B)\n");
		Uart_Printf("|  2:SMC(K9S1208V0M)\n");
		Uart_Printf("|  3:Previous menu\n");
		Uart_Printf("+-------------------------------------------------+\n");
		Uart_Printf(" Select the type of a NAND flash memory : ");
		sel = Uart_GetIntNum();
		Uart_Printf("+-------------------------------------------------+\n\n\n");
		
		switch(sel){
			case 1:
				K9F5608_menu();
				break;
			case 2:
				K9S1208_menu();
				break;
			case 3 :
				return;
			default:
				Uart_Printf("Wrong number seleted.. Try again!!\n\n\n");
				break;
		}
	}

}


void NAND_reset(void)
{
	int i;

	NF_nFCE_L();
	NF_CLEAR_RB();
	NF_CMD(NAND_CMD_RESET);
	for(i=0;i<10;i++);
	NF_nFCE_H();
}

void NAND_init(void)
{
	rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<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.
    
	NAND_reset();
}


void spin_wheel(void)
{
	static int p = 0;
	static char w[] = "\\/-";
	Uart_Printf("\010%c", w[p]);
	(++p==3)?(p=0):0;
}


int NAND_readID(void){
	int i;
	int id = 0;

	NF_nFCE_L();
    NF_CMD(NAND_CMD_READID);
	NF_ADDR(0x0);
	for (i=0; i<10; i++);
	id  = NF_RDDATA8()<<8;	// Maker code : 0xec
	id |= NF_RDDATA8();		// Devide code(K9S1208V:0x76), (K9K2G16U0M:0x75)
	NF_nFCE_H();

	return (id & 0xffff);
}


void NAND_check_block(U32 blk_max_cnt)
{
	int i, start, end, badblock;
	
	NAND_init();
	badblock = 0;
	Uart_Printf("block number must be between 0 and %d\n",blk_max_cnt-1);
	Uart_Printf("Select the number of start block to check: ");
	start = Uart_GetIntNum();
	if( (start<0) || (start>blk_max_cnt) ){
		Uart_Printf("/n/nStart block number MUST BE 0 ~ %d.. Try again..\n",blk_max_cnt-1);
		return;
	}
	Uart_Printf("\nSelect the number of end block to check: ");
	end = Uart_GetIntNum();
	if( (end<0) || (end>blk_max_cnt) ){
		Uart_Printf("/n/nEnd block number MUST BE 0 ~ %d.. Try again..\n",blk_max_cnt-1);
		return;
	}
	
	Uart_Printf("\n\nDisplay block status\n");
	for(i=start;i<end;i++){
		Uart_Printf("%4d",i);
		if(NAND_check_badblock(i) == 1){
			Uart_Printf("\b\b\b\b");
			Uart_Printf("BLOCK[%4d] is bad\n",i);
			badblock++;
		}else{
			if(i != end)	Uart_Printf("\b\b\b\b");
		}
	}
	if(badblock == 0)
		Uart_Printf("\nBLOCK[%d] ~ BLOCK[%d] is good..\n", start, end);
	else
		Uart_Printf("%d blocks is bad block..\n", badblock);

	Uart_Printf("\nBlock check has been done..\n\n\n");	
	
}

int NAND_check_badblock(U32 block)
{
	int i, blockpage = block * NAND_PAGE_COUNT;
	U8 data;
	
	NF_nFCE_L();
	NF_CLEAR_RB();
	NF_CMD(NAND_CMD_READOOB);
	NF_ADDR(517 & 0xf);
	NF_ADDR(blockpage & 0xff);
	NF_ADDR((blockpage >> 8) & 0xff);
	NF_ADDR((blockpage >> 16) & 0xff);
	for(i=0;i<10;i++);
	NF_DETECT_RB();
	data = NF_RDDATA8();
	NF_nFCE_H();
	
	if(data != 0xff)	return 1;	//is bad block
	else				return 0;	//isn't bad block
}


int NAND_mark_badblock(U32 block)
{
	int i;
	U32 blockpage = block * NAND_PAGE_COUNT;
	
	seBuf[0]=0xff;
	seBuf[1]=0xff;
	seBuf[2]=0xff;
	seBuf[5]=0x44;   // Bad blcok mark=0
	
	NF_nFCE_L();
    NF_CMD(NAND_CMD_READOOB);	
    NF_CMD(NAND_CMD_SEQIN);

	NF_ADDR(0x0);
	NF_ADDR(blockpage&0xff);
    NF_ADDR((blockpage>>8)&0xff);
    NF_ADDR((blockpage>>16)&0xff);
    
    for(i=0;i<NAND_OOB_SIZE;i++)	NF_WRDATA8(seBuf[i]);
    
    NF_CMD(NAND_CMD_PAGEPROG);
    for(i=0;i<10;i++); 
	NF_DETECT_RB();
	NF_CMD(NAND_CMD_STATUS);
	
	for(i=0;i<3;i++);
	
	if(NF_RDDATA8() & 0x1){
		NF_nFCE_H();	//spare array write error
//		Uart_printf("[Marking badblock is error!!]\n");
	}else{
		NF_nFCE_H();	// block is marked as bad block
	}
	return 1;
}


void NAND_erase(U32 blk_max_cnt){
	int i, start, end, erase_err;
	
	Uart_Printf("NAND flash Erase Test\n");
	Uart_Printf("\nYou MUST be well aware that\n");
	Uart_Printf("1. the block size of NAND flash is 0x%x\n", NAND_BLOCK_SIZE);
	Uart_Printf("2. the page size of NAND flash is 0x%x\n", NAND_PAGE_SIZE);
	
	NAND_init();
	erase_err = 0;
	
	Uart_Printf("\n\nblock number must be between 0 and %d\n",blk_max_cnt-1);
	Uart_Printf("Select the number of start block to erase: ");
	start = Uart_GetIntNum();
	if( (start<0) || (start>blk_max_cnt) ){
		Uart_Printf("/n/nStart block number MUST BE 0 ~ %d.. Try again..\n",blk_max_cnt-1);
		return;
	}
	Uart_Printf("\nSelect the number of end block to erase: ");
	end = Uart_GetIntNum();
	if( (end<0) || (end>blk_max_cnt) ){
		Uart_Printf("/n/nEnd block number MUST BE 0 ~ %d.. Try again..\n",blk_max_cnt-1);
		return;
	}
	
	if(start>end){
		Uart_Printf("start block number is bigger than end block number.. Try again\n");
		return;
	}
	
	Uart_Printf("\n\nStart Erasing block\n");
	for(i=start;i<=end;i++){
		Uart_Printf("%4d",i);
		if(NAND_erase_block(i) == 1){
			Uart_Printf("\b\b\b\b");
			Uart_Printf("%4d:ERROR!!\n", i);
			erase_err++;
		}else{
			if(i != end)	Uart_Printf("\b\b\b\b");
		}
	}
	if(erase_err == 0)
		Uart_Printf("\nBLOCK[%d] ~ BLOCK[%d] is erased..\n", start, end);
		
	Uart_Printf("\nBlock erase has been done..\n\n\n");
}

int NAND_erase_block(U32 block)
{
	int i;
	U32 blockpage = block * NAND_PAGE_COUNT;
	
	NF_nFCE_L();
	NF_CLEAR_RB();
	
	NF_CMD(NAND_CMD_ERASE1);
	NF_ADDR(blockpage & 0xff);
    NF_ADDR((blockpage >> 8) & 0xff);   
    NF_ADDR((blockpage >> 16) & 0xff);
	NF_CMD(NAND_CMD_ERASE2);
	for(i=0;i<40;i++);
	NF_DETECT_RB();
	NF_CMD(NAND_CMD_STATUS);
	
	if(NF_RDDATA8() & 0x1) // Erase error
    {	
    	NF_nFCE_H();
		NAND_mark_badblock(block);
		return 1;
    }else{
    	NF_nFCE_H();
        return 0;
    }
}


void NAND_read(U32 blk_max_cnt)
{
	U32 s_blk_num, i;
	U8 *buf;
	
	Uart_Printf("NAND flash Read Test\n");
	Uart_Printf("This test reads data from NAND flash and copies data to memory\n");
	Uart_Printf("This test reads only one block you select\n");
	Uart_Printf("\nYou MUST be well aware that\n");
	Uart_Printf("1. the block size of NAND flash is 0x%x\n", NAND_BLOCK_SIZE);
	Uart_Printf("2. the page size of NAND flash is 0x%x\n", NAND_PAGE_SIZE);
	
	Uart_Printf("\n\nblock number must be between 0 and %d\n",blk_max_cnt-1);
	Uart_Printf("Select the number of block to read: ");
	s_blk_num = Uart_GetIntNum();
	if( (s_blk_num<0) || (s_blk_num>blk_max_cnt) ){
		Uart_Printf("/n/nStart block number MUST BE 0 ~ %d.. Try again..\n",blk_max_cnt-1);
		return;
	}
	
	Uart_Printf("\nInput the target address to copy in memory[0x...]: ");
    buf = (U8 *)Uart_GetIntNum();
	Uart_Printf("\n\n");
	
	Uart_Printf("Read data from %d block and copy data to 0x%x\n", s_blk_num, (int)buf);
	if(NAND_read_block(s_blk_num, buf) == 1){
		Uart_Printf("\nThis block is bad block\n");
	}else{
		Uart_Printf("\nReading block is completed\n");
	}

	Uart_Printf("\n\nDisplay data you read(page 0 of block %d) :", s_blk_num);
	for(i=0;i<NAND_PAGE_SIZE/4;i++){
		if(i%8==0)	Uart_Printf("\n");
		Uart_Printf("%08lx ", *(U32 *)(buf+(i*4)));
	}

	Uart_Printf("\n\n");
}


int NAND_read_block(U32 b_num, U8 *dst_addr)
{
	U8 *buf = dst_addr;
	char page_buf[NAND_PAGE_SIZE];
	int i;
	
	if(NAND_check_badblock(b_num))	return 1;
	
	for(i=0;i<NAND_PAGE_COUNT;i++){
		NAND_read_page(b_num, i, buf);
		spin_wheel();
	}
	return 0;
}


int NAND_read_page(U32 block, U32 page, U8 *buffer)
{
	U32 blockpage = (block*NAND_PAGE_COUNT)+(page&0x1f);
	int i, ecc;
	U8 *bufPt = buffer;
	U8 se[16], ecc0, ecc1, ecc2;
	
	NF_RSTECC();
	NF_MECC_UnLock();
	
	NF_nFCE_L();
	NF_CLEAR_RB();
	NF_CMD(NAND_CMD_READ0);
	NF_ADDR(0);
	NF_ADDR(blockpage&0xff);
	NF_ADDR((blockpage>>8)&0xff);
	NF_ADDR((blockpage>>16)&0xff);
	NF_DETECT_RB();
	
	for(i=0;i<NAND_PAGE_SIZE;i++)	*bufPt++ = NF_RDDATA8();
	
	NF_nFCE_H();

    return 0;
}


void NAND_write(U32 blk_max_cnt)
{
	U32 s_blk_num, i;
	U8 *buf;
	
	Uart_Printf("NAND flash Write Test\n");
	Uart_Printf("This test reads data from memory and writes data to NAND flash\n");
	Uart_Printf("This test writes only one block you select\n");
	Uart_Printf("\nYou MUST be well aware that\n");
	Uart_Printf("1. the block size of NAND flash is 0x%x\n", NAND_BLOCK_SIZE);
	Uart_Printf("2. the page size of NAND flash is 0x%x\n", NAND_PAGE_SIZE);
	
	Uart_Printf("\n\nblock number nust be between 0 and %d\n",blk_max_cnt-1);
	Uart_Printf("Select the number of block to write: ");
	s_blk_num = Uart_GetIntNum();
	if( (s_blk_num<0) || (s_blk_num>blk_max_cnt) ){
		Uart_Printf("/n/nStart block number MUST BE 0 ~ %d.. Try again..\n",blk_max_cnt-1);
		return;
	}
	
	Uart_Printf("\nInput the source data address to read in memory[0x...]: ");
    buf = (U8 *)Uart_GetIntNum();
	Uart_Printf("\n\n");
	
	Uart_Printf("Read data from 0x%x and copy data to %d block\n", (int)buf, s_blk_num);
	if(NAND_write_block(s_blk_num, buf) == 1){
			Uart_Printf("\nThis block is bad block\n");
	}else{
		Uart_Printf("\nWriting block is completed\n");
	}
	
	Uart_Printf("\n\nDisplay data you write(page 0 of block %d) :", s_blk_num);
	for(i=0;i<NAND_PAGE_SIZE/4;i++){
		if(i%8==0)	Uart_Printf("\n");
		Uart_Printf("%08lx ", *(U32 *)(buf+(i*4)));
	}
	
	Uart_Printf("\n\n");
}


int NAND_write_block(U32 b_num, U8 *src_addr)
{
	U8 *buf = src_addr;
	char page_buf[NAND_PAGE_SIZE];
	int i;
	
	if(NAND_check_badblock(b_num))	return 1;
	
	for(i=0;i<NAND_PAGE_COUNT;i++){
		NAND_write_page(b_num, i, buf);
		spin_wheel();
	}
		
	return 0;
}


int NAND_write_page(U32 block, U32 page, U8 *buffer)
{
	U32 blockpage = (block*NAND_PAGE_COUNT)+(page&0x1f);
	int i;
	U8 *bufPt = buffer;
	U32 mecc, secc;

	NF_SOFT_UnLock();
	NF_RSTECC();
	NF_MECC_UnLock();
	
	NF_nFCE_L();
	NF_CLEAR_RB();
	NF_CMD(NAND_CMD_READ0);
	NF_CMD(NAND_CMD_SEQIN);
	NF_ADDR(0);
	NF_ADDR(blockpage&0xff);
	NF_ADDR((blockpage>>8)&0xff);
	NF_ADDR((blockpage>>16)&0xff);
	
	for(i=0;i<NAND_PAGE_SIZE;i++)	NF_WRDATA8(*bufPt++);
	
	NF_MECC_Lock();
	mecc = rNFMECC0;
	seBuf[0] = (U8)(mecc & 0xff);
	seBuf[1] = (U8)((mecc>>8) & 0xff);
	seBuf[2] = (U8)((mecc>>16) & 0xff);
	seBuf[3] = (U8)((mecc>>24) & 0xff);
	seBuf[5] = 0xff;

	NF_SECC_UnLock();
	for(i=0;i<3;i++){
		NF_WRDATA8(seBuf[i]);
	}
	
	NF_SECC_Lock();
	secc = rNFSECC;
	seBuf[8] = (U8)(secc & 0xff);
	seBuf[9] = (U8)((secc>>8) & 0xff);
	for(i=3;i<16;i++){
		NF_WRDATA8(seBuf[i]);
	}
	
	NF_CLEAR_RB();
	NF_CMD(NAND_CMD_PAGEPROG);	 // Write 2nd command
	for(i=0;i<10;i++);
	NF_DETECT_RB();
	NF_CMD(NAND_CMD_STATUS);   // Read status command   

	for(i=0;i<3;i++);  //twhr=60ns
	if (NF_RDDATA8()&0x1){// Page write error
		NF_nFCE_H();
		Uart_Printf("\n[WRITE ERROR:block#=%d]\n",block);
		NAND_mark_badblock(block);
       }else{
		NF_nFCE_H();
	}
	return 0;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂蜜桃一区二区三区| 5858s免费视频成人| 九九热在线视频观看这里只有精品| 亚洲日本乱码在线观看| 综合分类小说区另类春色亚洲小说欧美 | 日韩毛片一二三区| 国产欧美1区2区3区| 中文字幕av资源一区| 欧美日韩成人在线| 日韩一区二区高清| 日韩免费观看高清完整版| 国产一区二区免费在线| 五月天网站亚洲| 久久精品在线免费观看| 国产精品白丝jk白祙喷水网站| 亚瑟在线精品视频| 天天综合色天天| 99精品偷自拍| 色网综合在线观看| 国产日韩欧美激情| 韩国三级电影一区二区| 在线观看欧美黄色| 亚洲一区二区三区中文字幕| 国产99久久久久| 日韩一区二区三区在线| 久久午夜色播影院免费高清| 日本一区二区电影| 亚洲柠檬福利资源导航| 一区二区三区在线视频免费| 一区二区三区四区在线播放 | 国产激情视频一区二区在线观看| 欧美videos大乳护士334| k8久久久一区二区三区| 91丨九色丨蝌蚪富婆spa| 在线观看91精品国产入口| 91.com在线观看| 久久久国产精品麻豆 | 韩国欧美国产1区| 不卡av在线免费观看| 欧美色电影在线| 日韩区在线观看| 国产精品理论在线观看| 亚洲成人一二三| 国产精品自拍毛片| 在线精品亚洲一区二区不卡| 日韩免费看网站| 亚洲同性gay激情无套| 蜜桃av一区二区| 99久久免费视频.com| 制服丝袜日韩国产| 国产精品美女久久久久久久久久久| 一区二区三区久久久| 韩国在线一区二区| 欧美午夜一区二区三区免费大片| 精品久久久久久久久久久久久久久久久| 国产精品色一区二区三区| 日韩**一区毛片| 色综合色综合色综合| 精品欧美一区二区久久| 亚洲免费观看高清完整版在线观看熊 | 91无套直看片红桃| 日韩欧美黄色影院| 亚洲精品ww久久久久久p站| 精品一区二区免费在线观看| 在线亚洲欧美专区二区| 久久久电影一区二区三区| 首页国产欧美久久| 91在线国产福利| www成人在线观看| 日日夜夜精品视频免费| 91蜜桃在线观看| 久久久久久久久久久99999| 日日摸夜夜添夜夜添精品视频 | 国产日韩一级二级三级| 日韩国产欧美在线播放| 日本韩国精品一区二区在线观看| 亚洲精品在线免费播放| 喷白浆一区二区| 欧美日韩国产精品成人| 亚洲精品免费在线观看| 不卡一区二区三区四区| 久久精品水蜜桃av综合天堂| 青青草原综合久久大伊人精品优势| 91成人免费电影| 亚洲女人****多毛耸耸8| 国产高清亚洲一区| 精品久久五月天| 热久久免费视频| 欧美日韩视频不卡| 亚洲综合在线电影| 色综合久久久久综合体桃花网| 国产婷婷色一区二区三区四区| 奇米精品一区二区三区在线观看 | 日韩一区二区三区三四区视频在线观看 | 亚洲私人影院在线观看| a级高清视频欧美日韩| 中文在线免费一区三区高中清不卡| 久久99精品国产.久久久久| 日韩欧美自拍偷拍| 奇米精品一区二区三区四区| 在线不卡欧美精品一区二区三区| 一区二区在线观看视频在线观看| av中文字幕亚洲| 日韩毛片一二三区| 色激情天天射综合网| 亚洲精品免费在线| 在线观看国产91| 天天操天天综合网| 欧美一区二区视频在线观看2020| 日日噜噜夜夜狠狠视频欧美人 | 7777精品伊人久久久大香线蕉最新版 | 亚洲18影院在线观看| 欧美自拍偷拍一区| 一区二区三区在线不卡| 欧美在线高清视频| 亚洲bt欧美bt精品777| 91 com成人网| 极品尤物av久久免费看| 久久久久久久综合| 不卡的电影网站| 一片黄亚洲嫩模| 欧美一区二区美女| 国产麻豆9l精品三级站| 国产精品视频免费| 色综合天天狠狠| 午夜精品福利在线| 日韩一本二本av| 丰满白嫩尤物一区二区| 亚洲欧洲综合另类| 欧美精品乱人伦久久久久久| 美女网站一区二区| 国产色综合一区| 91丨porny丨户外露出| 香蕉影视欧美成人| 久久一区二区三区四区| aaa亚洲精品| 午夜在线成人av| 国产亚洲欧美一区在线观看| 成人a免费在线看| 亚洲成av人综合在线观看| 日韩欧美国产高清| 成av人片一区二区| 五月激情综合网| 久久免费看少妇高潮| 在线一区二区三区做爰视频网站| 婷婷综合在线观看| 国产精品视频九色porn| 欧美午夜精品久久久久久孕妇| 日本中文在线一区| 中文字幕在线不卡| 欧美二区三区的天堂| 国产91丝袜在线观看| 性做久久久久久久久| 欧美激情一区二区三区蜜桃视频| 91成人看片片| 国产电影一区在线| 天堂资源在线中文精品| 国产免费成人在线视频| 欧美日本一道本在线视频| 国产精品一区二区你懂的| 一二三四社区欧美黄| 久久久五月婷婷| 在线不卡免费欧美| 色综合久久九月婷婷色综合| 久久国产乱子精品免费女| 亚洲精品高清在线| 久久美女艺术照精彩视频福利播放| 日本精品裸体写真集在线观看| 精品一区二区三区欧美| 亚洲高清久久久| 国产精品国模大尺度视频| 精品久久一区二区三区| 欧美日韩国产一二三| 成人动漫中文字幕| 精品一区二区三区蜜桃| 亚洲不卡av一区二区三区| 亚洲欧洲在线观看av| www国产精品av| 日韩一级片网址| 欧美视频日韩视频| 97久久精品人人做人人爽| 国产精品一区免费视频| 久久精品免费观看| 午夜在线电影亚洲一区| 夜夜爽夜夜爽精品视频| 国产精品蜜臀在线观看| 久久免费美女视频| 精品久久一区二区| 欧美一级视频精品观看| 欧美日韩国产高清一区二区| 99re这里只有精品首页| 成人黄色软件下载| 国产99久久久国产精品| 精品一区二区三区在线播放| 日本不卡高清视频| 视频一区中文字幕国产| 亚洲一区二区三区视频在线播放 | 99精品在线免费| 成人精品电影在线观看| 国产一级精品在线|