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

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

?? nand.c

?? YL9200開發板的測試代碼,詳細請下載后細看
?? C
字號:
#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"
#include "def.h"
#include "config.h"
#include "console.h"
#include "params.h"

#ifdef	NAND_SUPPORT

struct NFChipInfo
{
	U32 id;
	U32 size;
}

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

struct Partition
{
	U32 offset;
	U32 size;
	char* name;
};

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

static U16 NandAddr;
static U16 HaveNandChip;

#define	NAND_DAT	0x40000000
#define	NAND_ALE	0x40000040
#define	NAND_CLE	0x40400080

#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

#define	NFChipEn()	AT91F_PIO_ClearOutput(AT91C_BASE_PIOC, AT91C_PIO_PC15)
#define	NFChipDs()	AT91F_PIO_SetOutput(AT91C_BASE_PIOC, AT91C_PIO_PC15)

#define	NFIsBusy()	(!(AT91F_PIO_GetInput(AT91C_BASE_PIOC)&AT91C_PIO_PC14))

#define	WrNFCmd(cmd)	*(volatile U8 *)NAND_CLE = (cmd)
#define	WrNFAddr(addr)	*(volatile U8 *)NAND_ALE = (addr)
#define	WrNFDat(dat)	*(volatile U8 *)NAND_DAT = (dat)
#define	RdNFDat()		*(volatile U8 *)NAND_DAT

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

#ifdef	WIAT_BUSY_HARD
#define	WaitNFBusy()	while(NFIsBusy())
#else
static U32 WaitNFBusy( void )
{
	U8 stat;

	WrNFCmd( QUERYCMD );
	do
	{
		stat = RdNFDat();
		//printf("%x\n", stat);
	}
	while ( !( stat & 0x40 ) );
	WrNFCmd( READCMD0 );
	return stat & 1;
}
#endif

static U32 NFReadID( void )
{
	U32 id;

	NFChipEn();
	WrNFCmd( READIDCMD );
	WrNFAddr( 0 );
	while ( NFIsBusy() );
	id = RdNFDat() << 8;
	id |= RdNFDat();
	NFChipDs();

	return id;
}

static U16 NFReadStat( void )
{
	U16 stat;

	NFChipEn();	
	WrNFCmd( QUERYCMD );
	stat = RdNFDat();	
	NFChipDs();

	return stat;
}

static U32 NFEraseBlock( U32 addr )
{
	U8 stat;

	addr &= ~0x1f;

	NFChipEn();	
	WrNFCmd( ERASECMD0 );		
	WrNFAddr( addr );
	WrNFAddr( addr >> 8 );
	if ( NandAddr )
		WrNFAddr( addr >> 16 );
	WrNFCmd( ERASECMD1 );		
	stat = WaitNFBusy();
	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();
	WrNFCmd( READCMD0 );
	WrNFAddr( 0 );
	WrNFAddr( addr );
	WrNFAddr( addr >> 8 );
	if ( NandAddr )
		WrNFAddr( addr >> 16 );
	//	InitEcc();
	WaitNFBusy();		
	for ( i = 0; i < 512; i++ )
		buf[i] = RdNFDat();		
	NFChipDs();
}

//addr = page address
static U32 NFWritePage( U32 addr , U8* buf )
{
	U16 i, stat;
	//	U8 tmp[3];

	NFChipEn();
	WrNFCmd( PROGCMD0 );
	WrNFAddr( 0 );
	WrNFAddr( addr );
	WrNFAddr( addr >> 8 );
	if ( NandAddr )
		WrNFAddr( addr >> 16 );
	//	InitEcc();	
	for ( i = 0; i < 512; i++ )
		WrNFDat( buf[i] );

	if ( !addr )
	{
		WrNFDat( 'b' );
		WrNFDat( 'o' );
		WrNFDat( 'o' );
		WrNFDat( 't' );
	}

	/*	tmp[0] = rNFECC0;
		tmp[1] = rNFECC1;
		tmp[2] = rNFECC2;
			
		WrNFDat(tmp[0]);
		WrNFDat(tmp[1]);
		WrNFDat(tmp[2]);*/

	WrNFCmd( PROGCMD1 );
	stat = WaitNFBusy();
	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 )
{
	addr &= ~0x1f;

	NFChipEn();

	WrNFCmd( READCMD2 );	//point to area c

	WrNFCmd( PROGCMD0 );
	WrNFAddr( 4 );		//mark offset 4,5
	WrNFAddr( addr );
	WrNFAddr( addr >> 8 );
	if ( NandAddr )
		WrNFAddr( addr >> 16 );
	WrNFDat( 0 );			//mark with 0
	WrNFDat( 0 );
	WrNFCmd( PROGCMD1 );
	WaitNFBusy();		//needn't check return status

	WrNFCmd( READCMD0 );	//point to area a

	NFChipDs();
}

static int NFChkBadBlk( U32 addr )
{
	U8 dat;

	addr &= ~0x1f;

	NFChipEn();

	WrNFCmd( READCMD2 );	//point to area c
	WrNFAddr( 5 );		//mark offset 4,5
	WrNFAddr( addr );
	WrNFAddr( addr >> 8 );
	if ( NandAddr )
		WrNFAddr( addr >> 16 );
	WaitNFBusy();
	dat = RdNFDat();

	WrNFCmd( READCMD0 );	//point to area a

	NFChipDs();

	return ( dat != 0xff );
}



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

	printf( "Please select Nand flash region to %s, Esc to abort\n" , info );

	for ( i = 0; NandPart[i].size; i++ )
		printf( "%d : start 0x%08x, size 0x%08x\t[%s]\n" , i , NandPart[i].offset , NandPart[i].size , NandPart[i].name );

	max_sel = i;	

	while ( 1 )
	{
		char c = getch();

		if ( c == 0x1b )
			return 0;
		if ( ( c >= '0' ) && ( c < ( max_sel + '0' ) ) )
			return &( NandPart[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 );
		i++;
		size -= 512;
		ram_addr += 512;
	}
}

#endif	/* NAND_SUPPORT */

/******************************************************/
void WrFileToNF( U32 FileAddr , U32 FileSize )
{
#ifdef	NAND_SUPPORT
	struct Partition* part;
	U32 start_page, i, skip_blks;
	U8* ram_addr;
	int size;	//must be int

	if ( !HaveNandChip )
		return;

	part = NandPartSel( "write" );
	if ( !part )
		return;

	if ( FileSize > part->size )
	{
		puts( "File size is too long!\n" );
		return;
	}

	start_page = part->offset >> 9;

	printf( "Sure to write nand flash from 0x%x to ram address 0x%x, size %d ?\n" , part->offset , FileAddr ,
		FileSize );
	if ( !getyorn() )
		return;

	skip_blks = 0;
	ram_addr = ( U8 * ) FileAddr;
	size = FileSize;
	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 ( FileSize > part->size )
			{
				puts( "Program nand flash fail\n" );
				return;
			}			
			NFMarkBadBlk( i + start_page );
			skip_blks++;			
			i += 32;		
			continue;
		}
		ram_addr += 512;
		size -= 512;
		i++;
	}

	puts( "Program NandFlash  success\n" );
	if ( skip_blks )
		printf( "Skiped %d bad block(s)\n" , skip_blks );

#endif	/* NAND_SUPPORT */
}

extern U32 downloadAddress;
void start_kernel( U32 , U32 );

void RdFileFrNF( U32 FileAddr , U32 FileSize )
{
#ifdef	NAND_SUPPORT
	U32 initrd, bootpart;
	if ( !HaveNandChip )
		return;

	puts( "Select:\n" );
	puts( "1: Kernel without initrd\n" );
	puts( "2: Kernel with initrd\n" );
	puts( "3: NAND-BOOT\n" );
	puts( "ESC : exit\n" );

	while ( 1 )
	{
		char c = getch();

		if ( c == 0x1b )
			return;

		if ( ( c == '1' ) || ( c == '2' ) )
		{
			downloadAddress = LINUX_KERNEL_ADDR;
			bootpart = 1;
			initrd = ( c == '1' ) ? 0 : INITRD_START;
			break;
		}
		if ( c == '3' )
		{
			downloadAddress = BOOT_PORG_ADDR;
			bootpart = 0;
			initrd = 0;
			break;
		}
	}

	puts( "Loading...\n" );

	NFReadPart( &NandPart[bootpart] , ( U8 * ) downloadAddress );
	if ( initrd )
		NFReadPart( &NandPart[2] , ( U8 * ) initrd );

	start_kernel( downloadAddress , initrd );

#endif	/* NAND_SUPPORT */
}

void EraseNandPart( U32 a1 , U32 a2 )
{
#ifdef	NAND_SUPPORT
	struct Partition* part;
	U32 start_page, blk_cnt;
	int i, err = 0;	

	if ( !HaveNandChip )
		return;

	part = NandPartSel( "erase" );
	if ( !part )
		return;

	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;

	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 completed " );
	if ( err )
		printf( "with %d bad block(s)\n" , err );
	else
		puts( "ok\n" );

#endif	/* NAND_SUPPORT */
}

#ifdef	NAND_SUPPORT
static __inline void FindNandBoot( void )
{
	NFChipEn();
	WrNFCmd( READCMD2 );
	WrNFAddr( 0 );
	WrNFAddr( 0 );
	WrNFAddr( 0 );
	if ( NandAddr )
		WrNFAddr( 0 );
	WaitNFBusy();

	if ( RdNFDat() == 'b' )
		if ( RdNFDat() == 'o' )
			if ( RdNFDat() == 'o' )
				if ( RdNFDat() == 't' )
				{
					void ( *fp ) ( void );

					NFChipDs();
					printf( "boot\n" );
					fp = ( void ( * ) ( void ) ) 0x20008000;
					NFReadPart( NandPart , ( U8 * ) fp );
					//(*fp)();
				}

	NFChipDs();
}
#endif

void GetNandFlashChip( void )
{
#ifdef	NAND_SUPPORT
	int i;
	U32 id;

	HaveNandChip = 0;
	id = NFReadID();
	printf( "Nand Flash ID = 0x%x, status = 0x%x\n" , id , NFReadStat() );

	for ( i = 0; NandFlashChip[i].id != 0; i++ )
		if ( NandFlashChip[i].id == id )
		{
			printf( "This nand flash chip size = %dM\n" , NandFlashChip[i].size >> 20 );
			HaveNandChip = 1;
			NandAddr = ( NandFlashChip[i].size > SIZE_32M ) ? 1 : 0;
			FindNandBoot();
			return;
		}

#endif	/* NAND_SUPPORT */
}

void TestNandFlash( U32 a1 , U32 a2 )
{
#ifdef	NAND_SUPPORT
#ifdef	NAND_TEST
	U32 i;
	U32 blk;
	U8 dat[512];

	if ( !HaveNandChip )
		return;

	blk = 0x180;	//page number
	//	printf("Erase Block 0x%x...\n", blk);
	//	NFEraseBlock(blk);
	//	printf("status = %x\n", NFReadStat());
	for ( i = 0; i < 512; i++ )
		dat[i] = ~( i & 0xff );
	//	NFWritePage(blk, dat);
	for ( i = 0; i < 512; i++ )
		dat[i] = 0;

	NFReadPage( blk , dat );
	for ( i = 0; i < 512; i++ )
		printf( "%4x," , dat[i] );
#endif
#endif	/* NAND_SUPPORT */
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲色图欧美激情| 国产精品久久久久婷婷二区次| 99国内精品久久| 成人av集中营| 色一情一伦一子一伦一区| 91一区二区在线| 91香蕉视频mp4| 欧美在线视频日韩| 51精品国自产在线| 日韩亚洲国产中文字幕欧美| 欧美一区二区三区成人| 日韩欧美在线一区二区三区| 日韩免费成人网| 久久久国产精华| 亚洲欧美在线另类| 一级日本不卡的影视| 亚洲国产wwwccc36天堂| 日韩在线播放一区二区| 极品少妇一区二区| heyzo一本久久综合| 欧美中文一区二区三区| 6080国产精品一区二区| 日本一区二区三区免费乱视频| 国产精品女人毛片| 亚洲福利视频一区| 毛片av一区二区三区| 成人永久免费视频| 欧美日韩精品一区二区| 久久久99精品免费观看不卡| 中文字幕在线观看不卡| 日韩影院精彩在线| 国产一区二区三区综合| 日本韩国一区二区三区| 精品国产伦一区二区三区免费| 亚洲国产高清在线| 日韩在线一区二区三区| 不卡一区在线观看| 日韩三级精品电影久久久| 亚洲国产经典视频| 美女尤物国产一区| 91麻豆自制传媒国产之光| 精品sm捆绑视频| 亚洲一区欧美一区| 成人影视亚洲图片在线| 日韩欧美中文字幕精品| 亚洲女同一区二区| 国产成人av一区二区三区在线| 欧美日本韩国一区| 亚洲欧美国产高清| 成人动漫中文字幕| 久久免费电影网| 日本欧美久久久久免费播放网| 91亚洲资源网| 国产精品欧美经典| 国产成人在线网站| 久久嫩草精品久久久精品一| 天堂午夜影视日韩欧美一区二区| 成人av高清在线| 欧美国产丝袜视频| 国产精品资源网| 欧美tk丨vk视频| 免费在线观看日韩欧美| 欧美二区三区91| 亚洲国产精品久久不卡毛片| 一本久久综合亚洲鲁鲁五月天| 欧美精品一区二区三区蜜桃| 欧美aaaaa成人免费观看视频| 欧美视频中文字幕| 亚洲综合久久久久| 欧美亚洲愉拍一区二区| 一区二区三区免费| 日本精品视频一区二区三区| 亚洲视频电影在线| 91久久线看在观草草青青| 亚洲天堂成人网| 97精品久久久久中文字幕| 最好看的中文字幕久久| 色综合久久久久网| 一区二区三区精品在线观看| 91精品福利视频| 亚洲午夜久久久久| 欧美精品少妇一区二区三区| 亚洲高清一区二区三区| 91精品麻豆日日躁夜夜躁| 天堂久久一区二区三区| 日韩精品一区二区三区在线观看 | 国产精品灌醉下药二区| av一区二区三区在线| 亚洲欧美日韩国产成人精品影院| 色综合天天综合狠狠| 亚洲国产va精品久久久不卡综合| 欧美一区二区三区视频在线| 另类综合日韩欧美亚洲| 国产日本一区二区| 91老师国产黑色丝袜在线| 亚洲成av人片| 精品国一区二区三区| 99免费精品在线| 天堂成人免费av电影一区| 2023国产精品| 在线一区二区三区做爰视频网站| 日韩精品乱码av一区二区| 久久亚洲精华国产精华液| 色一情一乱一乱一91av| 老司机精品视频导航| 中文字幕视频一区| 日韩欧美不卡在线观看视频| www..com久久爱| 麻豆成人久久精品二区三区红 | 日日骚欧美日韩| 久久久蜜桃精品| 欧美日韩久久久| 成人福利视频网站| 免费在线观看成人| 亚洲激情校园春色| 久久精品一区八戒影视| 欧美日韩五月天| 成人黄色在线看| 免费观看一级特黄欧美大片| ...xxx性欧美| 精品国产一区二区三区忘忧草| 一本色道a无线码一区v| 国产丶欧美丶日本不卡视频| 视频一区在线播放| 亚洲美女少妇撒尿| 国产日韩一级二级三级| 日韩欧美在线一区二区三区| 欧美最新大片在线看| 成人毛片视频在线观看| 麻豆精品一区二区综合av| 亚洲国产精品综合小说图片区| 久久久国产一区二区三区四区小说 | 亚洲欧美在线视频| 精品久久一区二区三区| 91精品国产欧美一区二区成人| 色欧美88888久久久久久影院| 国产成a人无v码亚洲福利| 精品一区二区三区视频在线观看 | 麻豆视频观看网址久久| 亚洲777理论| 亚洲一二三四在线| 亚洲日本va午夜在线影院| 欧美国产精品一区二区| 久久精品日产第一区二区三区高清版 | 精品国产一区二区在线观看| 欧美一区二区三区在线电影| 欧美少妇一区二区| 欧美视频在线一区| 欧美日韩大陆在线| 欧美日韩免费在线视频| 欧美日韩国产小视频在线观看| 色偷偷成人一区二区三区91| aa级大片欧美| 色婷婷综合久久久久中文| 色www精品视频在线观看| 在线免费观看成人短视频| 在线观看成人小视频| 欧美在线播放高清精品| 欧美色倩网站大全免费| 91.成人天堂一区| 日韩午夜在线观看| 亚洲精品一区在线观看| 欧美国产日韩精品免费观看| 成人欧美一区二区三区白人| 亚洲三级电影网站| 亚洲v中文字幕| 麻豆免费看一区二区三区| 国产一区二区久久| 99re这里只有精品首页| 在线一区二区三区四区五区 | 99久久99久久久精品齐齐| 欧美午夜精品久久久久久超碰| 日本韩国一区二区三区视频| 欧美日韩一级黄| 2023国产精品| 亚洲欧美国产毛片在线| 免费观看在线综合| 成人午夜视频网站| 欧美日韩一区二区三区在线| 欧美va日韩va| 亚洲激情图片一区| 久久精品国产精品亚洲精品| 成人免费黄色在线| 欧美三级日韩在线| 久久久久一区二区三区四区| 亚洲欧美另类在线| 美国欧美日韩国产在线播放| 成人美女视频在线看| 欧美一区二区三区小说| 中文字幕一区二区三区视频| 天天做天天摸天天爽国产一区| 国产精品原创巨作av| 欧美日韩高清一区| 久久久www成人免费无遮挡大片| 亚洲六月丁香色婷婷综合久久 | 欧美日韩一区高清| 国产日韩视频一区二区三区| 日韩经典一区二区| 99久久99久久精品免费看蜜桃| 日韩免费高清电影|