⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 39vf160.c

📁 2440 开发板的测试程序。包括uart,iic,lcd
💻 C
字号:
#include "def.h"
#include "2440lib.h"

#define	printf	Uart_Printf

#define	ROM_BASE	0x04000000	//地址重定向到0x04000000
#define	CMD_ADDR0	*((volatile U16 *)(0x5555*2+ROM_BASE))
#define	CMD_ADDR1	*((volatile U16 *)(0x2aaa*2+ROM_BASE))

static U8 state = 0;

static void CFIQueryExit( void )
{
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0xf0f0;
	state &= 0xfc;
}

static void SWPIDExit( void )
{
	CMD_ADDR0 = 0xf0f0;
	state &= 0xfc;
}

static void CFIQueryEntry( void )
{
	if ( state & 1 )
	{
		if ( state & 2 )
			SWPIDExit();
		else
			return;
	}

	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x9898;
	state |= 1;
}

static void SWPIDEntry( void )
{
	if ( state & 1 )
	{
		if ( state & 2 )
			return;
		else
			CFIQueryExit();
	}

	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x9090;
	state |= 3;
}

U32 GetFlashID( void )
{
	U32 i;

	SWPIDEntry();
	i = *( U16 * ) ( 0 + ROM_BASE );
	i |= ( *( U16 * ) ( 2 + ROM_BASE ) ) << 16;
	SWPIDExit();
	return i;
}

void GetFlashCFI( U16* DataPtr )
{
	U16 i;

	CFIQueryEntry();
	for ( i = 0x10; i < 0x35; DataPtr++, i++ )
		*DataPtr = *( U16 * ) ( i * 2 + ROM_BASE );	
	CFIQueryExit();
}

void ChipErase( void )
{
	if ( state & 1 )
	{
		if ( state & 2 )
			SWPIDExit();
		else
			CFIQueryExit();
	}

	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x8080;
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x1010;

	while ( 1 )
	{
		U16 i;
		i = *( ( volatile U16 * ) 0x6666 ) & 0x40;
		if ( i != *( ( volatile U16 * ) 0x6666 ) & 0x40 )	//D6 == D6
			continue;
		if ( *( ( volatile U16 * ) 0x8888 ) & 0x80 )
			break;						//D7 == 1
	}
}

void SectorErase( U32 sector )
{
	if ( state & 1 )
	{
		if ( state & 2 )
			SWPIDExit();
		else
			CFIQueryExit();
	}

	sector += ROM_BASE;	

	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x8080;
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	*( volatile U16 * ) sector = 0x3030;

	while ( 1 )
	{
		U16 i;
		i = *( ( volatile U16 * ) sector ) & 0x40;
		if ( i != *( ( volatile U16 * ) sector ) & 0x40 )	//D6 == D6
			continue;
		if ( *( ( volatile U16 * ) sector ) & 0x80 )
			break;								//D7 == 1
	}

	//	printf("Erase sector 0x%x	ok\n", sector-ROM_BASE);				
}

void FlashProg( U32 ProgStart , U16* DataPtr , U32 WordCnt )
{
	U16 i, j;	

	ProgStart += ROM_BASE;

	for ( ; WordCnt; ProgStart += 2, DataPtr++, WordCnt-- )
	{
		j = *DataPtr;
		CMD_ADDR0 = 0xaaaa;
		CMD_ADDR1 = 0x5555;
		CMD_ADDR0 = 0xa0a0;
		*( volatile U16 * ) ProgStart = j;	

		while ( 1 )
		{
			i = *( volatile U16 * ) ProgStart & 0x40;
			if ( i != *( volatile U16 * ) ProgStart & 0x40 )		//D6 == D6
				continue;
			if ( ( *( volatile U16 * ) ProgStart & 0x80 ) == ( j & 0x80 ) )
				break;					//D7 == D7
		}
	}
}

void FlashRead( unsigned int ReadStart , unsigned short* DataPtr , unsigned int Size )
{
	int i;

	ReadStart += ROM_BASE;

	for ( i = 0; i < Size / 2; i++ )
		*( DataPtr + i ) = *( ( unsigned short * ) ReadStart + i );
}

int SectorProg( U32 begin , U16* data , U32 size )
{
	U32 tmp = 0x1000 - ( begin&0xfff );

	if ( tmp > size )
		tmp = size;

	for ( ; size; )
	{
		SectorErase( begin & 0xfffff000 );	//4K Bytes boudary		
		FlashProg( begin , data , tmp / 2 );
		printf( "Program %x ok\n" , begin );

		size -= tmp;
		begin += tmp;
		data += tmp / 2;
		tmp = ( size > 0x1000 ) ? 0x1000 : size;
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -