📄 bootfun.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 + -