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

📄 bootfun.c

📁 一个简单的基于s3c2410的bootloader
💻 C
字号:
///////////////////////////////////////////////////////////////////////////
//bootfun.c, called only by boot
///////////////////////////////////////////////////////////////////////////
#include "addr.h"

extern char Image$$BOOT$$Base[];
extern char Image$$BOOT$$Limit[];
extern char Image$$RO$$Base[];
extern char Image$$RO$$Limit[];
extern char Image$$RW$$Base[];
extern char Image$$RW$$Limit[];
extern char Image$$ZI$$Base[];
extern char Image$$ZI$$Limit[];

extern void LED4_ON( void );
extern void LED5_ON( void );
extern void LED4_OFF( void );
extern void LED5_OFF( void );
extern void Uart0_SendAddr( U32 addr );
extern void Uart0_SendData( U32 data );
extern void Uart0_SendByte( unsigned char ch );
extern void Uart0_SendByteHex( unsigned char ch );
extern unsigned char Uart0_GetByte( void );
extern void NF_K9F1208U0C_ReadPage( U32 unAddrSaveTO, volatile U8 * unNFDATA );
extern void WordCopy( U32 unAddrFrom, U32 unAddrTo, int nSizeWord);
extern void ByteCopy( U32 unAddrFrom, U32 unAddrTo, int nSizeByte);

void BOOT_Delay( U32 nDelay );
void Test( void );
void CopySelf( void );
void Move_RORWZI_InSdram( void );

void BOOT_Delay( U32 nDelay )
{
	int i;
	for ( i = 0; i < nDelay; i++ );
}

void Test()
{
	U8 ch = 0;
	U8 nLedShow = 0;
	
	Uart0_SendAddr( ( U32 )Image$$BOOT$$Base);
	Uart0_SendData( ( U32 )Image$$BOOT$$Limit);
	Uart0_SendByte( 0x0d );Uart0_SendByte( 0x0a );
	Uart0_SendAddr( ( U32 )Image$$RO$$Base);
	Uart0_SendData( ( U32 )Image$$RO$$Limit);
	Uart0_SendByte( 0x0d );Uart0_SendByte( 0x0a );
	Uart0_SendAddr( ( U32 )Image$$RW$$Base);
	Uart0_SendData( ( U32 )Image$$RW$$Limit);
	Uart0_SendByte( 0x0d );Uart0_SendByte( 0x0a );
	Uart0_SendAddr( ( U32 )Image$$ZI$$Base);
	Uart0_SendData( ( U32 )Image$$ZI$$Limit);
	Uart0_SendByte( 0x0d );Uart0_SendByte( 0x0a );
	Uart0_SendByte( 0x0d );Uart0_SendByte( 0x0a );
	
	Uart0_SendAddr( *( ( U32 *)0x33FF0000 ) );
	Uart0_SendAddr( *( ( U32 *)0x33FF0001 ) );
	Uart0_SendAddr( *( ( U32 *)0x33FF0002 ) );
	Uart0_SendAddr( *( ( U32 *)0x33FF0003 ) );
	Uart0_SendByte( 0x0d );Uart0_SendByte( 0x0a );
	
	Uart0_SendAddr( *( ( U32 *)0x33FF0004 ) );
	Uart0_SendAddr( *( ( U32 *)0x33FF0005 ) );
	Uart0_SendAddr( *( ( U32 *)0x33FF0006 ) );
	Uart0_SendAddr( *( ( U32 *)0x33FF0007 ) );
	Uart0_SendByte( 0x0d );Uart0_SendByte( 0x0a );
	Uart0_SendByte( 0x0d );Uart0_SendByte( 0x0a );
	
	
	
	while ( 1 )
	{
		while ( ( ch = Uart0_GetByte() ) == 0 );
		Uart0_SendByte( ch );
		if(  ch == 'q' )
			break;
		ch = 0;
		nLedShow++;
		nLedShow %= 2;
		if ( nLedShow == 1 )
			LED5_ON();
		else
			LED5_OFF();
	}
}


void CopySelf( void )
{
	#define	NF_Config_Initial		0xF830
	#define	NF_Config_InactiveBit	0x0800
	#define	NF_Command_Reset		0xFF
	#define NF_Status_Mask			0x01
	#define NF_Status_Busy			0x00

	U32 nNFCommand;
	U32 nSize;
	U32 unAddrFlashStart;
	U32 unAddrSdramStart;
	U32 unAddrFlash;
	U32 unAddrSdram;
		
	unAddrFlashStart = 0x00000000;
	unAddrSdramStart = ( U32 )Image$$RO$$Base;
	
	//enable chip
	rNFCONF = NF_Config_Initial;
	//active nand flash nFCE control
	nNFCommand = rNFCONF;
	nNFCommand &= ~NF_Config_InactiveBit;
	rNFCONF = nNFCommand;
	//reset nand flash
	rNFCMD	= NF_Command_Reset;
	BOOT_Delay(10);
	while ( ( rNFSTAT & NF_Status_Mask ) == NF_Status_Busy ) BOOT_Delay(10);
	//Inactive nand flash nFCE control
	nNFCommand = rNFCONF;
	nNFCommand |= NF_Config_InactiveBit;
	rNFCONF = nNFCommand;
	
	nSize =	( ( U32 )Image$$RO$$Limit - ( U32 )Image$$RO$$Base )
		  + ( ( U32 )Image$$RW$$Limit - ( U32 )Image$$RW$$Base )
		  + ( ( U32 )Image$$BOOT$$Limit - ( U32 )Image$$BOOT$$Base );
	nSize = ( ( nSize >> 9 ) + 1 ) << 9;
	
	//bigger than 8M
	if ( ( nSize >> 23 ) > 0 )
		return ;
	//active nand flash nFCE control
	nNFCommand = rNFCONF;
	nNFCommand &= ~NF_Config_InactiveBit;
	rNFCONF = nNFCommand;
	BOOT_Delay(10);
	
	unAddrFlash = unAddrFlashStart;
	unAddrSdram = unAddrSdramStart;
	while ( nSize > 0)
	{
		rNFCMD	= 0x00;					//Read command
		rNFADDR = unAddrFlash & 0xFF;	//Send addr
		rNFADDR = ( unAddrFlash >> 9 ) & 0xFF;
		rNFADDR = ( unAddrFlash >> 17 ) & 0xFF;
		rNFADDR = ( unAddrFlash >> 25 ) & 0xFF;
		while ( ( rNFSTAT & NF_Status_Mask ) == NF_Status_Busy ) BOOT_Delay(10);
		
		NF_K9F1208U0C_ReadPage( unAddrSdram, &rNFDATA );
		unAddrSdram += 0x200;
		unAddrFlash += 0x200;
		nSize -= 0x200;
	}
	
	//Inactive nand flash nFCE control
	nNFCommand = rNFCONF;
	nNFCommand |= NF_Config_InactiveBit;
	rNFCONF = nNFCommand;
}

//after copy , this function move RO, RW, ZI to correct position
void Move_RORWZI_InSdram( void )
{
	U32 nSize;
	U32 unAddrFrom;
	U32 unAddrTo;
	
	//copy RO
	nSize = ( U32 )Image$$RO$$Limit - ( U32 )Image$$RO$$Base;
	unAddrFrom = ( U32 )Image$$RO$$Base + 
			( ( U32 )Image$$BOOT$$Limit - ( U32 )Image$$BOOT$$Base );
	unAddrTo = ( U32 )Image$$RO$$Base;
	
	ByteCopy( unAddrFrom, unAddrTo, nSize );
	/*
	if ( unAddrTo < unAddrFrom )
	{
		while ( nSize > 0 )
		{
			*( ( U32 *) unAddrTo ) = *( ( U32 *) unAddrFrom );
			unAddrTo += 4;
			unAddrFrom += 4;
			nSize -= 4;
		}
	}
	*/
	//copy RW
	nSize = ( U32 )Image$$RW$$Limit -  ( U32)Image$$RW$$Base;
	unAddrFrom = ( U32 )Image$$RO$$Base + 
				( ( U32 )Image$$BOOT$$Limit -  ( U32 )Image$$BOOT$$Base )
			  + ( ( U32 )Image$$RO$$Limit -  ( U32 )Image$$RO$$Base );
	unAddrTo = ( U32 )Image$$RW$$Base;
		
	WordCopy( unAddrFrom, unAddrTo, nSize>>2 );
	/*
	if ( unAddrTo < unAddrFrom )
	{
		while ( nSize > 0 )
		{
			*( ( U32 *) unAddrTo ) = *( ( U32 * ) unAddrFrom );
			unAddrTo += 4;
			unAddrTo += 4;
			nSize -= 4;
		}
	}
	*/
	//zero-initializ ZI
	
	//end
}

⌨️ 快捷键说明

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