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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? nandflash.c

?? NAND Flash Boot Please select function : 0 : USB download file(通過USB下載文件) 1 : Uart download fi
?? C
?? 第 1 頁 / 共 2 頁
字號:
		
	return stat;	
}

static void NFMarkBadBlk(U32 addr)
{
	int i;
	addr &= ~0x1f;
	
	NFChipEn();
	
	NFWrCmd(READCMD2);	//point to area c
	
	NFWrCmd(PROGCMD0);
	NFWrAddr(0);		//mark offset 0~15
	NFWrAddr(addr);
	NFWrAddr(addr>>8);
	if(NandAddr)
		NFWrAddr(addr>>16);
	for(i=0; i<16; i++)
		NFWrDat(0);		//mark with 0	
	NFWrCmd(PROGCMD1);
	NFWaitBusy();		//needn't check return status
	
	NFWrCmd(READCMD0);	//point to area a
		
	NFChipDs();
}

static int NFChkBadBlk(U32 addr)
{
	U8 dat;
	
	addr &= ~0x1f;
	
	NFChipEn();
	
	NFWrCmd(READCMD2);	//point to area c
	NFWrAddr(5);		//mark offset 5
	NFWrAddr(addr);
	NFWrAddr(addr>>8);
	if(NandAddr)
		NFWrAddr(addr>>16);
	NFWaitBusy();
	dat = NFRdDat();
	
	NFWrCmd(READCMD0);	//point to area a
	
	NFChipDs();

	return (dat!=0xff);
}



static struct Partition *NFSelPart(char *info)
{
	int i, max_sel;

	printf("Please select Nand flash region to %s, Esc to abort\n", info);
	
	for(i=0; pNandPart[i].size; i++)
		printf("%d : start 0x%08x, size 0x%08x\t[Part%d]\n", i, pNandPart[i].offset, pNandPart[i].size, i/*pNandPart[i].name*/ );

	max_sel = i;	
	
	while(1) {
		char c = getch();
		
		if(c==0x1b)
			return 0;
		if((c>='0')&&(c<(max_sel+'0')))
			return &(pNandPart[c-'0']);
	}	
}

static void NFReadPart(struct Partition *part, U8 *buf)
{
	U32 i, start_page;
	U8 *ram_addr;
	int size;
	
	start_page = part->offset>>9;
	size = part->size;
	ram_addr = buf;
	
	for(i=0; size>0; ) {
		if(!(i&0x1f)) {
			if(NFChkBadBlk(i+start_page)) {
				printf("Skipped bad block at 0x%08x\n", i+start_page);
				i += 32;
				size -= 32<<9;
				continue;
			}
		}
		NFReadPage((i+start_page), ram_addr);
//			printf("Read page %d\n", i);
		i++;
		size -= 512;
		ram_addr += 512;
	}
}

/******************************************************/
int WrFileToNF(U32 src_addr, U32 w_size)
{
	struct Partition *part;
	U32 start_page, i, skip_blks;
	U8 *ram_addr;
	int size;	//must be int
	U32 start_addr;
	
	if(!support)
		return -1;
		
	part = NFSelPart("write");
	if(!part)
		return -1;
	
	if(w_size>part->size) {
		puts("File size is too long!\n");
		return -1;
	}

	start_page = part->offset>>9;
	
	printf("Are you sure to write nand flash from 0x%x with ram address 0x%x, size %d ?\n", part->offset, src_addr, w_size);
	if(!getyorn())
		return -1;
		
	skip_blks = 0;
	ram_addr = (U8 *)src_addr;
	start_addr = (U32)src_addr;
	size = w_size;
	printf("start address 0x%x\n", start_page);
	for(i=0; size>0; )	{
		if(!(i&0x1f)) {
			if(NFEraseBlock(i+start_page)) {
/*				part->size -= 32<<9;	//fail, partition available size - 1 block size
				if(FileSize>part->size) {
					puts("Program nand flash fail\n");
					return;
				}
				NFMarkBadBlk(i+start_page);
				skip_blks++;
				i += 32;			
				continue;*/
				goto WrFileToNFErr;
			}
		}
		if(NFWritePage(i+start_page, ram_addr, ((U32)ram_addr-start_addr)>>14)) {
			ram_addr -= (i&0x1f)<<9;
			size += (i&0x1f)<<9;
			i &= ~0x1f;
WrFileToNFErr:			
			part->size -= 32<<9;	//partition available size - 1 block size
			if(w_size>part->size) {
				puts("Program nand flash fail\n");
				return -1;
			}			
			NFMarkBadBlk(i+start_page);
			skip_blks++;			
			i += 32;		
			continue;
		}
		ram_addr += 512;
		size -= 512;
		i++;
	}
	printf("\nend address 0x%x\n", start_page+i);

	puts("Program nand flash partition success\n");
	if(skip_blks)
		printf("Skiped %d bad block(s)\n", skip_blks);
		
	return 0;	
}

int RdFileFrNF(U32 dst_addr, U32 load_part)
{
	U32 i;
	struct Partition *part;
	
	if(!support)
		return -1;

	for(i=0; pNandPart[i].size; i++);
	if(i>load_part)
		part = pNandPart+load_part;
	else {
		part = NFSelPart("read");
		if(!part)
			return -1;
	}
	
	puts("Loading...\n");
	
	NFReadPart(part, (U8 *)dst_addr);
	
	puts("end\n");
	
	return 0;
}

int EraseNandPart(void)
{
	struct Partition *part;
	U32 start_page, blk_cnt;
	int i, err = 0;	

	if(!support)
		return -1;
		
	part = NFSelPart("erase");
	if(!part)
		return -1;

	start_page = part->offset>>9;
	blk_cnt  = part->size>>14;

	printf("Are you sure to erase nand flash from page 0x%x, block count 0x%x ?", start_page, blk_cnt);
	if(!getyorn())
		return -1;
	
	printf("start address 0x%x\n", start_page);
	for(i=0; blk_cnt; blk_cnt--, i+=32) {
		if(NFEraseBlock(i+start_page)) {
			err ++;
			puts("Press any key to continue...\n");
			getch();
		}
	}
	printf("\nend address 0x%x\n", start_page+i-32);
	
	puts("Erase Nand partition completed ");
	if(err)
		printf("with %d bad block(s)\n", err);
	else
		puts("success\n");
	
	return 0;
}

#ifdef	SAVE_ENV_IN_NAND
U32 NFSaveParams(char *pEnv)
{
	char dat[512];
	U32 addr;
	
	if(support) {
		memcpy(dat, pEnv, sizeof(EnvParams));
		for(addr=SIZE_64K>>9; addr<(0x30000>>9); addr++) {
			NFEraseBlock(addr);
			if(!NFWritePage(addr, (U8 *)dat, 0))
				return 0;
		}
	}
	return -1;
}

U32 NFSearchParams(char *pEnv)
{
	char dat[512];
	U32 addr;
	
	if(support) {
		for(addr=SIZE_64K>>9; addr<(0x30000>>9); addr++) {
			NFReadPage(addr, (U8 *)dat);		
			if(!strncmp(dat, "params", 7)) {
				memcpy(pEnv, dat, sizeof(EnvParams));			
				return 0;
			}
		}
	}
	return -1;	
}
#endif

static U32 nand_id;

void NandFlashInit(void)
{
	int i;	
	
	support = 0;
	nand_id = NFReadID();
	
	for(i=0; NandFlashChip[i].id!=0; i++)
		if(NandFlashChip[i].id==nand_id) {			
			nand_id = i;
			NandFlashSize = NandFlashChip[i].size;
			support  = 1;
			NandAddr = NandFlashSize>SIZE_32M;
			if(!pNandPart[0].size) {
				pNandPart[0].offset = 0;
				pNandPart[0].size   = NandFlashSize;
				pNandPart[1].size   = 0;				
			}			
			return;
		}
	
}

void NandFlashStatusRep(void)
{
	if(support) {
		printf("Nand Flash ID is 0x%x, Size = %dM, Status = 0x%x\n", NandFlashChip[nand_id].id, NandFlashChip[nand_id].size>>20, NFReadStat());
	} else {
		printf("No supported Nand Flash Found!\n");
	}
}

//void (*pNandFlashInit)(void) = NandFlashInit;

#endif	/* NAND_SUPPORT */

#ifdef	NAND_FLASH_SUPPORT

int NandProg(int argc, char *argv[])
{
	unsigned int size = ~0;
	unsigned int data_begin = ~0;

	data_begin = download_addr;
	size       = download_len;
	
	if(argc>1)
		data_begin = strtoul((char *)argv[1]);
	if(argc>2)	
		size       = strtoul((char *)argv[2]);	
	if((size==-1)||(data_begin==-1)) {
		printf("Arguments error\n");
		goto err_exit;
	}
	
	if(size==0) {
		printf("Write 0 Bytes!\n");
		return -1;
	}
	else
		return WrFileToNF(data_begin, size);
	
err_exit:
	printf("Usage:	nfprog addr size\naddr = data pointer to ram\nsize = program size(Bytes)\n");
	return -1;
}

int NandLoad(int argc, char *argv[])
{
	U32 load_part = -1;
	download_addr = DFT_DOWNLOAD_ADDR;
	
	if(argc>1) {
		download_addr = strtoul((char *)argv[1]);
		if(download_addr==-1)
			download_addr = DFT_DOWNLOAD_ADDR;
		if(argc>2)
			load_part = strtoul(argv[2]);
	}
	
	printf("Load data form nand flash to 0x%x\n", download_addr);
	return RdFileFrNF(download_addr, load_part);
}

int NandErase(int argc, char *argv[])
{
	return EraseNandPart();
}

int NandPart(int argc, char*argv[])
{
	unsigned long i, addr[8];
	
	if(!NandFlashSize)
		return -1;
	if((argc<=1)||(argc>9))
		goto err_exit;

	addr[0] = 0;
	for(i=1; i<argc; i++) {
		addr[i] = strtoul((char *)argv[i]);		
		if((addr[i]==-1)||(addr[i]<=addr[i-1])||(addr[i]&0x3fff)||(addr[i]>NandFlashSize))
			goto err_exit;
	}
	
	printf("Set %d partition(s) :\n", argc-1);
	for(i=0; i<argc-1; i++) {
		pNandPart[i].offset = addr[i];
		pNandPart[i].size   = addr[i+1]-addr[i];
		pNandPart[i].name   = " ";
		pNandPart[i+1].size = 0;
		printf("part%d : start address 0x%-8x, size 0x%-8x\n", i, pNandPart[i].offset, pNandPart[i].size);
	}

	return 0;
	
err_exit:
	puts("Usage : nfpart a1 a2 ... an\na1 = part1 end address, an = partn end address, n<=8, address must be 16KB align and don't excess the size of nand flash \n");
	return -1;
}

#endif


#define SAVE_ENV_IN_NAND
#ifdef	SAVE_ENV_IN_NAND

U32 NFSaveParams(char *pEnv)
{	
	char dat[512];
	U32 addr;
	InitNandFlash();
	if(1) {
		memcpy(dat, pEnv, sizeof(EnvParams));
		for(addr=SIZE_128K>>9; addr<(0x30000>>9); addr++) {
			//NFEraseBlock(addr);
			 EraseBlock(addr);
			//if(!NFWritePage(addr, (U8 *)dat, 0))
			 if(!WritePage(addr, (U8 *)dat))
			 {
				//printf("wite succes\n");
				return 0;
			 }
		}
	}
	return -1;
	
}


U32 NFSearchParams(char *pEnv)
{
	char dat[512];
	U32 addr;
	InitNandFlash();
	if(1) {
		for(addr=SIZE_128K>>9; addr<(0x30000>>9); addr++) {
			ReadPage(addr, (U8 *)dat);		
			//if(!strncmp(dat, "params", 7)) {
			memcpy(pEnv, dat, sizeof(EnvParams));			
			return 0;	
		}
	}
	return -1;	
}

#endif

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区三区在线观看| 国产一区在线观看视频| 亚洲精品一区二区三区蜜桃下载| 丁香亚洲综合激情啪啪综合| 午夜精品一区在线观看| 国产精品妹子av| 日韩欧美在线影院| 日本韩国欧美一区| 国产99久久久久久免费看农村| 天堂成人国产精品一区| 亚洲欧洲日产国产综合网| 欧美va日韩va| 欧美日韩成人综合| 99久久精品免费观看| 亚洲成人免费看| 国产精品无遮挡| 在线免费亚洲电影| 国产91对白在线观看九色| 亚洲国产精品视频| 国产精品久久久久久久久久免费看 | 日本最新不卡在线| 亚洲国产精品ⅴa在线观看| 欧美军同video69gay| 国产高清久久久| 亚洲成人免费av| 中文一区二区在线观看| 91麻豆精品91久久久久同性| 99免费精品在线| 国内精品写真在线观看| 性做久久久久久| 一区二区三区在线视频观看 | 亚洲视频一二三区| 26uuu国产在线精品一区二区| 欧美系列亚洲系列| 99re8在线精品视频免费播放| 精品一区二区三区蜜桃| 日韩av电影免费观看高清完整版 | 91原创在线视频| 国产精品小仙女| 九色|91porny| 日本欧美一区二区三区乱码| 亚洲成人自拍网| 亚洲免费av在线| 最新成人av在线| 国产精品毛片无遮挡高清| 国产三级精品三级| 久久综合99re88久久爱| 精品国产91乱码一区二区三区 | 日韩精彩视频在线观看| 亚洲永久精品大片| 亚洲女人****多毛耸耸8| 国产精品家庭影院| 欧美极品xxx| 国产精品欧美一区喷水| 国产亚洲成av人在线观看导航 | 北条麻妃一区二区三区| 免费高清视频精品| 人人狠狠综合久久亚洲| 日韩影院精彩在线| 日本午夜精品视频在线观看 | 26uuu色噜噜精品一区| 日韩免费视频线观看| 精品国产自在久精品国产| 精品久久国产老人久久综合| www国产成人| 精品久久久三级丝袜| 欧美日韩电影在线| 欧美精品一区二区三区蜜臀| 国产日韩一级二级三级| 国产精品免费丝袜| 亚洲色图在线播放| 一个色在线综合| 午夜电影一区二区| 国产麻豆视频一区| 成人高清免费观看| 成人在线视频一区| 欧美午夜电影一区| 欧美另类videos死尸| 久久久久青草大香线综合精品| 国产欧美在线观看一区| 国产精品美女久久久久久久久久久 | 国产成人午夜精品5599| 大陆成人av片| 欧美自拍偷拍一区| 在线播放欧美女士性生活| 欧美tickling网站挠脚心| 日韩精品一区二区在线| 国产精品婷婷午夜在线观看| 亚洲午夜久久久久久久久电影网| 免费国产亚洲视频| 成人a级免费电影| 欧美在线免费播放| 久久久久久久久伊人| 亚洲伦理在线免费看| 天堂久久一区二区三区| 国产精品小仙女| 欧美日韩三级一区| 久久久精品黄色| 一区二区三区欧美久久| 国产一区欧美二区| 日本韩国欧美在线| 久久精品无码一区二区三区| 最新国产の精品合集bt伙计| 亚洲日本成人在线观看| 九色综合狠狠综合久久| 色猫猫国产区一区二在线视频| 日韩一区二区在线看片| 亚洲视频在线一区观看| 久久99精品久久久久婷婷| 97国产精品videossex| 欧美xfplay| 亚洲午夜免费视频| 成人av在线看| 精品久久久久久久久久久久久久久 | 欧美大片顶级少妇| 亚洲免费资源在线播放| 国产一区二区不卡在线| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 欧美本精品男人aⅴ天堂| 夜夜操天天操亚洲| 成人性生交大片| 欧美成人a视频| 亚洲高清不卡在线| 色综合久久综合中文综合网| 久久久久国产精品人| 日韩电影在线一区二区三区| 日本精品一级二级| 亚洲欧美在线另类| 国产不卡在线播放| 亚洲精品在线观| 亚洲国产视频直播| 91视频免费播放| 国产精品免费网站在线观看| 国产麻豆日韩欧美久久| 精品毛片乱码1区2区3区| 亚洲成人av在线电影| 日本韩国欧美三级| 亚洲精品综合在线| 成人免费视频网站在线观看| 久久久高清一区二区三区| 久久国产三级精品| 欧美老女人在线| 日韩和欧美一区二区| 欧美日韩午夜在线| 亚洲一区免费在线观看| 在线免费一区三区| 亚洲精品写真福利| 色94色欧美sute亚洲线路一久| 亚洲人成小说网站色在线| 91在线国产福利| 亚洲视频一区在线| 91搞黄在线观看| 亚洲精品成人少妇| gogogo免费视频观看亚洲一| 日韩欧美视频在线| 亚洲国产精品一区二区www在线| 欧美日韩国产精品成人| 天堂av在线一区| 日韩一区二区三区视频| 久久精品72免费观看| 欧美mv日韩mv| 国产成人在线视频网址| 国产日产欧美一区| 不卡免费追剧大全电视剧网站| 国产精品免费久久| 91日韩精品一区| 亚洲国产精品一区二区www| 欧美精选在线播放| 韩日欧美一区二区三区| 日本一区二区三区视频视频| 波多野结衣欧美| 国产精品每日更新| 色综合视频一区二区三区高清| 亚洲123区在线观看| 欧美成人精品二区三区99精品| 狠狠网亚洲精品| 亚洲欧洲av在线| 欧美日韩亚洲综合在线| 蜜臀av国产精品久久久久| 久久久www成人免费毛片麻豆| 成人av网站免费| 亚洲6080在线| 久久久久国色av免费看影院| 91丨porny丨中文| 日韩激情视频网站| 欧美国产乱子伦 | 极品少妇xxxx偷拍精品少妇| 国产亚洲欧美日韩日本| 91高清在线观看| 国产麻豆欧美日韩一区| 夜夜嗨av一区二区三区中文字幕 | 中文av一区二区| 欧美日韩国产小视频| 国产成人自拍网| 一级中文字幕一区二区| 精品日韩av一区二区| 色94色欧美sute亚洲线路一ni | 亚洲成av人影院| 久久综合视频网| 日本电影欧美片|