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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? tempnand.c

?? 三星44b0讀取nand flash的源代碼.nand flash 的型號(hào)是k9f5608.很有參考價(jià)值哦
?? C
字號(hào):

#ifdef	NAND_FLASH_SUPPORT

struct NFChipInfo {
	U32 id;
	U32 size;
}

static NandFlashChip[] = {
	{0xec73, SIZE_16M},
	{0xec75, SIZE_32M},
	{0xec76, SIZE_64M},
	{0xec79, SIZE_128M},
	{0, 0},
};



/*
struct Partition oNandPartition[] = {
	{0x00000000, 0x00030000, "boot"},
	{0x00030000, 0x001d0000, "kernel"},
	{0x00200000, 0x00600000, "rootfs"},
	{0x00800000, 0x00800000, "ext-fs1"},
	{0x01000000, 0x01000000, "ext-fs2"},
	{0x00000000, 0x00000000, 0}
};*/

extern struct Partition *pNandPart;

U32 NandFlashSize;

static U16 NandAddr;
static U16 support;

#define	NAND_DAT	0x02000000
#define	NAND_ALE	0x02000004
#define	NAND_CLE	0x02000002

#define	READCMD0	0
#define	READCMD1	1
#define	READCMD2	0x50
#define	ERASECMD0	0x60
#define	ERASECMD1	0xd0
#define	PROGCMD0	0x80
#define	PROGCMD1	0x10
#define	QUERYCMD	0x70
#define	READIDCMD	0x90

void NFChipSel(U32);
int  NFIsReady(void);
void NFWrCmd(int);
void NFWrAddr(int);
void NFWrDat(int);
U8   NFRdDat(void);

#define	NFChipEn()	NFChipSel(1)
#define	NFChipDs()	NFChipSel(0)
#define	NFIsBusy()	(!NFIsReady())

//#define	NFWrCmd(cmd)	*(volatile U8 *)NAND_CLE = (cmd)
//#define	NFWrAddr(addr)	*(volatile U8 *)NAND_ALE = (addr)
//#define	NFWrDat(dat)	*(volatile U8 *)NAND_DAT = (dat)
//#define	NFRdDat()		*(volatile U8 *)NAND_DAT

//#define	WIAT_BUSY_HARD
//#define	ER_BAD_BLK_TEST
//#define	WR_BAD_BLK_TEST

#ifdef	WIAT_BUSY_HARD
#define	NFWaitBusy()	while(NFIsBusy())
#else

static U32 NFWaitBusy(void)
{
	U8 stat;
	
	NFWrCmd(QUERYCMD);
	do {
		stat = NFRdDat();
		//printf("%x\n", stat);
	}while(!(stat&0x40));
	NFWrCmd(READCMD0);
	return stat&1;
}
#endif

static U32 NFReadID(void)
{
	U32 id, loop = 0;

	NFChipEn();
	NFWrCmd(READIDCMD);
	NFWrAddr(0);
	while(NFIsBusy()&&(loop<10000)) loop++;
	if(loop>=10000)
		return 0;
	id  = NFRdDat()<<8;
	id |= NFRdDat();
	NFChipDs();
	
	return id;
}

static U16 NFReadStat(void)
{
	U16 stat;
	
	NFChipEn();	
	NFWrCmd(QUERYCMD);
	stat = NFRdDat();	
	NFChipDs();
	
	return stat;
}

static U32 NFEraseBlock(U32 addr)
{
	U8 stat;

	addr &= ~0x1f;
		
	NFChipEn();	
	NFWrCmd(ERASECMD0);		
	NFWrAddr(addr);
	NFWrAddr(addr>>8);
	if(NandAddr)
		NFWrAddr(addr>>16);
	NFWrCmd(ERASECMD1);		
	stat = NFWaitBusy();
	NFChipDs();
	
#ifdef	ER_BAD_BLK_TEST
	if(!((addr+0xe0)&0xff)) stat = 1;	//just for test bad block
#endif
	
	printf("Erase block 0x%08x %s\n", addr, stat?"fail":"ok");
	
	return stat;
}

//addr = page address
static void NFReadPage(U32 addr, U8 *buf)
{
	U16 i;
	
	NFChipEn();
	NFWrCmd(READCMD0);
	NFWrAddr(0);
	NFWrAddr(addr);
	NFWrAddr(addr>>8);
	if(NandAddr)
		NFWrAddr(addr>>16);
//	InitEcc();
	NFWaitBusy();		
	for(i=0; i<512; i++)
		buf[i] = NFRdDat();		
	NFChipDs();
}

//addr = page address
static U32 NFWritePage(U32 addr, U8 *buf)
{
	U16 i, stat;
//	U8 tmp[3];
	
	NFChipEn();
	NFWrCmd(PROGCMD0);
	NFWrAddr(0);
	NFWrAddr(addr);
	NFWrAddr(addr>>8);
	if(NandAddr)
		NFWrAddr(addr>>16);
//	InitEcc();	
	for(i=0; i<512; i++)
		NFWrDat(buf[i]);
		
	if(!addr) {
		NFWrDat('b');
		NFWrDat('o');
		NFWrDat('o');
		NFWrDat('t');		
	}
		
/*	tmp[0] = rNFECC0;
    tmp[1] = rNFECC1;
    tmp[2] = rNFECC2;
    	
	NFWrDat(tmp[0]);
    NFWrDat(tmp[1]);
    NFWrDat(tmp[2]);*/
    	
	NFWrCmd(PROGCMD1);
	stat = NFWaitBusy();
	NFChipDs();
	
#ifdef	WR_BAD_BLK_TEST
	if((addr&0xff)==0x17) stat = 1;	//just for test bad block
#endif
	
	if(stat)
		printf("Write nand flash 0x%x fail\n", addr);
	else {	
		U8 RdDat[512];
		
		NFReadPage(addr, RdDat);
		for(i=0; i<512; i++)
			if(RdDat[i]!=buf[i]) {
				printf("Check data at page 0x%x, offset 0x%x fail\n", addr, i);
				stat = 1;
				break;
			}
	}
		
	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
	
	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;
	size = w_size;
	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)) {
			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++;
	}

	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;
	
	for(i=0; blk_cnt; blk_cnt--, i+=32) {
		if(NFEraseBlock(i+start_page)) {
			err ++;
			puts("Press any key to continue...\n");
			getch();
		}
	}
	
	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))
				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 */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
eeuss国产一区二区三区| 欧美军同video69gay| 国产精品亚洲а∨天堂免在线| 丝袜诱惑制服诱惑色一区在线观看 | 欧美一级精品在线| 欧美一区二区啪啪| 日韩午夜三级在线| 欧美mv日韩mv国产网站| 久久先锋影音av鲁色资源网| 精品91自产拍在线观看一区| 久久久不卡网国产精品二区| 国产亚洲欧美在线| 国产精品久久久久久久午夜片| 中文字幕在线播放不卡一区| 亚洲精品国产a| 一区二区久久久久久| 亚洲福利视频一区二区| 日产欧产美韩系列久久99| 久久精品国产在热久久| 国产美女主播视频一区| 成人性生交大合| 在线免费一区三区| 欧美精品v国产精品v日韩精品| 欧美一区日本一区韩国一区| 精品国产电影一区二区| 中文字幕精品综合| 亚洲免费观看在线视频| 日韩综合小视频| 国产乱子伦视频一区二区三区| 成人网在线播放| 欧美色电影在线| 欧美不卡在线视频| 最新中文字幕一区二区三区| 一区二区三区国产精华| 久久国产精品露脸对白| 成人app网站| 欧美区一区二区三区| 精品国产免费视频| 综合在线观看色| 日韩精品成人一区二区在线| 国产不卡在线播放| 欧美亚洲一区二区三区四区| 欧美成人艳星乳罩| 亚洲精品自拍动漫在线| 蜜臀91精品一区二区三区| 波多野结衣中文字幕一区二区三区| 欧美色电影在线| 国产亚洲午夜高清国产拍精品| 亚洲另类中文字| 国产一区二区影院| 在线观看不卡视频| 欧美国产一区在线| 日日骚欧美日韩| 成年人网站91| 欧美变态口味重另类| 亚洲另类在线视频| 狠狠色2019综合网| 欧美日韩一区成人| 日本一区二区三区久久久久久久久不 | 久久综合久久综合九色| 樱花草国产18久久久久| 国产精品伊人色| 91精品欧美一区二区三区综合在| 中文字幕在线不卡| 国精产品一区一区三区mba视频| 欧美午夜精品久久久久久超碰 | 国产欧美中文在线| 青青草一区二区三区| 色综合久久综合网97色综合 | 日本亚洲免费观看| 色综合天天综合在线视频| 2021中文字幕一区亚洲| 午夜不卡av免费| 一本色道久久加勒比精品| 亚洲电影在线免费观看| 国产精品婷婷午夜在线观看| 石原莉奈在线亚洲二区| 91原创在线视频| 久久久久久免费网| 青青青爽久久午夜综合久久午夜| 色成人在线视频| 国产精品国产自产拍高清av| 国产综合久久久久久鬼色| 欧美丰满嫩嫩电影| 亚洲一区二区三区激情| 9人人澡人人爽人人精品| 久久久久久久综合日本| 精品制服美女久久| 日韩一区二区三区观看| 日韩精品一二区| 欧美日韩国产中文| 亚洲成人第一页| 在线视频一区二区三区| 亚洲欧洲国产日韩| 99久久99久久免费精品蜜臀| 中文字幕av一区二区三区免费看| 国产一区欧美二区| 久久婷婷久久一区二区三区| 精品一区二区国语对白| 日韩欧美国产一区二区在线播放| 日本亚洲最大的色成网站www| 欧美日韩精品免费观看视频| 午夜欧美在线一二页| 一二三四区精品视频| 国产99久久久精品| 久久久久亚洲蜜桃| 国产成人99久久亚洲综合精品| 久久精品亚洲精品国产欧美| 国产福利一区二区三区在线视频| 26uuu国产在线精品一区二区| 久久 天天综合| 欧美sm极限捆绑bd| 国产成人在线网站| 欧美激情一区二区三区四区| 久久午夜羞羞影院免费观看| 国产一区二区三区四区在线观看| 久久网站最新地址| 成人免费黄色在线| 亚洲免费观看高清完整版在线观看熊| 91视频在线看| 五月天激情综合| 日韩精品一区国产麻豆| 国产一区不卡精品| 国产精品三级av| 色婷婷精品久久二区二区蜜臂av | 欧美精品一区二区三区很污很色的 | 日韩欧美一区二区视频| 久久er精品视频| 国产视频亚洲色图| 97精品久久久午夜一区二区三区 | 欧美精品v日韩精品v韩国精品v| 日韩国产欧美在线视频| 精品电影一区二区| av电影在线观看完整版一区二区| 一区二区三区四区av| 日韩一级二级三级精品视频| 精品久久久久香蕉网| 国产成人av福利| 亚洲精品乱码久久久久久黑人| 欧美日韩国产综合视频在线观看| 韩国中文字幕2020精品| 中文字幕一区二区三区av| 欧美精品日日鲁夜夜添| 国产在线播放一区| 亚洲精品成人在线| 亚洲精品在线观看视频| 91色|porny| 久久国产精品72免费观看| 国产精品久久久久久久蜜臀| 欧美精品第一页| 成人高清免费观看| 日本不卡的三区四区五区| 中文子幕无线码一区tr| 国产成人精品免费网站| 国产精品不卡一区| 69堂国产成人免费视频| 成人激情视频网站| 婷婷久久综合九色综合伊人色| 久久久久久久久久久久久久久99 | 色婷婷久久久久swag精品 | 色悠久久久久综合欧美99| 乱一区二区av| 亚洲午夜久久久久久久久电影网| 久久网这里都是精品| 欧美人妇做爰xxxⅹ性高电影 | 欧美日韩成人综合在线一区二区| 国产高清精品网站| 日韩av成人高清| 亚洲视频免费在线观看| 精品久久久久久久一区二区蜜臀| 欧美在线综合视频| 成人深夜在线观看| 久久精品国产99| 亚洲大片在线观看| 最新欧美精品一区二区三区| 2022国产精品视频| 91精品国产免费久久综合| 色婷婷狠狠综合| 成人综合婷婷国产精品久久免费| 青青草视频一区| 视频在线在亚洲| 日本乱人伦一区| 国产精品第13页| 欧美www视频| 欧美三级三级三级| 99久久久久久| 国产成人av一区二区三区在线观看| 美女视频第一区二区三区免费观看网站| 一区二区三区四区不卡视频| 中文字幕亚洲一区二区av在线 | 日韩成人免费看| 亚洲在线观看免费视频| 最新久久zyz资源站| 日本一区二区动态图| 久久久精品中文字幕麻豆发布| 欧美不卡一区二区三区四区| 日韩精品一区二区三区在线| 欧美一区二视频| 日韩一区二区精品在线观看| 91精品国产综合久久福利 |