?? main.c
字號:
AT91F_TWI_Read( AT91C_BASE_TWI , 0x0 , data , EEP_RW_CHK_CNT );
for ( loop = 0; loop < EEP_RW_CHK_CNT; loop++ )
if ( data[loop] != loop )
break;
printf( "Check data %s\n" , ( loop == EEP_RW_CHK_CNT ) ? "success" : "fail" );
#endif /* IIC_SUPPORT */
}
static void ShowLed( U32 led )
{
int set = 0, clr = 0;
if ( led & 1 )
clr |= 1 << 8;
else
set |= 1 << 8;
if ( led & 2 )
clr |= 1 << 15;
else
set |= 1 << 15;
if ( led & 4 )
clr |= 1 << 16;
else
set |= 1 << 16;
if ( led & 8 )
clr |= 1 << 17;
else
set |= 1 << 17;
AT91F_PIO_SetOutput( AT91C_BASE_PIOB , set );
AT91F_PIO_ClearOutput( AT91C_BASE_PIOB , clr );
}
static void Buzzer( int freq , int ms )
{
int val;
AT91PS_TC pTC = AT91C_BASE_TC2;
val = ( AT91F_PMC_GetMasterClock( AT91C_BASE_PMC , AT91C_BASE_CKGR , 32768 ) >> 3 ) / freq;
if ( val > 65535 )
val = 65535;
if ( val < 2 )
val = 2;
pTC->TC_RB = val >> 1;
pTC->TC_RC = val;
pTC->TC_CCR = 5; //enable timer-counter and trig it
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA , // PIO controller base address
0 , // Peripheral A
AT91C_PA22_TIOB2 ); // Peripheral B
delay( ms );
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA , AT91C_PIO_PA22 );
//AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA22);
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA , AT91C_PIO_PA22 );
}
void ComDownload( U32 a1 , U32 a2 );
void Program_eep( U32 addr , U32 size );
void WrFileToNF( U32 FileAddr , U32 FileSize );
void RdFileFrNF( U32 FileAddr , U32 FileSize );
//void XmodemDownload( U32 a1 , U32 a2 );
//void TestNandFlash(U32 a1, U32 a2);
void EraseNandPart( U32 a1 , U32 a2 );
void RunProgFrNor( U32 addr , U32 size );
//void tftp_main( U32 addr , U32 dummy );
//void Test_ADS7843( U32 m , U32 n ) ;
void Test_MCP2510( U32 m , U32 n ) ;
//void SD_MMC_Test(U32 a1,U32 a2);
static struct
{
void ( *FuncAddr )( U32 , U32 );
char* str;
} Functions[] =
{
//{ComDownload, "Download File By Uart(DNW)"},
//{tftp_main, "Download File By Tftp"},
//{XmodemDownload, "Download File By Xmodem"},
//{Program_eep, "Write File To IIC Rom"},
//{WrFileToNF, "Write File To Nand Flash"},
//{RdFileFrNF, "Run Pragram From Nand Flash"},
//{EraseNandPart, "Erase Nand Flash Partition"},
//{WrFileToNor, "Write File To Nor Flash"},
//{RunProgFrNor, "Run Program From Nor Flash"},
//{test_s1d13506,"Test VGA"},
{Test_SED1356_LCD_640_480,"Test LCD 640x480"},
{Test_SED1356_VGA_640_480,"Test VGA 640x480"},
{Test_SED1356_LCD_240_320,"Test LCD 240x320"},
//{TestNandFlash, "Test nand flash"},
//{Test_ADS7843, "Test Touchpanel( ADS7843 )"},
{Test_MCP2510, "Test CAN BUS( MCP2510 )"},
{TestRs485,"Test 485"},
//{SD_MMC_Test,"Test SD or MMC Card"},
{0, 0}
};
//*----------------------------------------------------------------------------
//* \fn main
//* \brief
//*
//*----------------------------------------------------------------------------
int main( void )
{
AT91PS_EMAC pEmac = AT91C_BASE_EMAC;
AT91F_RTC_InterruptDisable( AT91C_BASE_RTC , 0x1f );
AT91F_ST_DisableIt( AT91C_BASE_ST , 0xf );
AT91C_BASE_ST->ST_PIMR = 328; // 328/32768 S
// *AT91C_PMC_IDR = 0xf0f; //disabled in InitSDRAM(init.c)
// printf("\nST_PIMR = 0x%08x\n", AT91C_BASE_ST->ST_PIMR);
// AT91F_ST_EnableIt(AT91C_BASE_ST, AT91C_ST_PITS);
//設置網口MAC地址,先使能EMAC時鐘,啟動linux前要設置好MAC地址.
AT91F_EMAC_CfgPMC();
pEmac->EMAC_SA1L = ( ( int ) OurEmacAddr[2] << 24 ) |
( ( int ) OurEmacAddr[3] << 16 ) |
( ( int ) OurEmacAddr[4] << 8 ) |
OurEmacAddr[5];
pEmac->EMAC_SA1H = ( ( int ) OurEmacAddr[0] << 8 ) | OurEmacAddr[1];
//when set an irq handler, the irq will be disabled in AT91F_AIC_ConfigureIt,
//so enable it after AT91F_AIC_ConfigureIt!!!
AT91F_AIC_ConfigureIt( AT91C_BASE_AIC , // AIC base address
AT91C_ID_SYS , // System peripheral ID
AT91C_AIC_PRIOR_HIGHEST , // Max priority
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE , // Level sensitive
SysIrqHandler ); // 將設置處理函數地址填入AIC_SVC[AT91C_ID_SYS]
//使能系統中斷(包括ST,DBGU等)
//AT91F_AIC_EnableIt( AT91C_BASE_AIC , AT91C_ID_SYS );
MMU_EnableICache();
downloadAddress = LINUX_KERNEL_ADDR;
puts( "\n*********************************************\n" );
// puts( "* *\n" );
puts( "* BIOS For AT91RM9200 *\n" );
// puts( "* *\n" );
puts( "*********************************************\n" );
//get counter from CKGR_MCFR
printf( "Processor Clock = %dHz, Master Clock = %dHz\n" ,
AT91F_PMC_GetProcessorClock( AT91C_BASE_PMC , AT91C_BASE_CKGR , 32768 ) ,
AT91F_PMC_GetMasterClock( AT91C_BASE_PMC , AT91C_BASE_CKGR , 32768 ) );
InitPio();
//InitTwi();
InitNorFlash();
InitNandFlash();
ShowLed( 0xa );
//TestRs485(0,0);
//Buzzer( 2100 , 120 );
//test_s1d13506();
while ( 1 )
{
U16 i;
int c;
puts( "Select\n" );
for ( i = 0; Functions[i].FuncAddr; i++ )
printf( "%d : %s\n" , i , Functions[i].str );
//putch( '\n' );
//puts("Please input number to select:\n");
c = getch();
if((c>='0')&&(c<('0'+i)))
(*Functions[c-'0'].FuncAddr)(downloadAddress, downloadFileSize);
}
}
static volatile U8* RxTmp;
void DBGU_Rx_Isr( void )
{
//讀完狀態寄存器后才清掉中斷源
unsigned int csr = ( ( ( AT91PS_USART ) AT91C_BASE_DBGU )->US_CSR & ( ( AT91PS_USART ) AT91C_BASE_DBGU )->US_IMR );
if ( csr & AT91C_US_RXRDY )
{
*RxTmp = AT91F_US_GetChar( ( AT91PS_USART ) AT91C_BASE_DBGU );
// putch(*RxTmp);
RxTmp++;
}
}
U32 WaitComDownload( void );
void ComDownload( U32 a1 , U32 a2 )
{
U8 sel;
puts( "Select\n1: Kernel\n2: initrd\n3: boot\nEsc: exit\n" );
while ( 1 )
{
sel = getch();
if ( sel == '1' )
{
downloadAddress = LINUX_KERNEL_ADDR;
break;
}
if ( sel == '2' )
{
downloadAddress = INITRD_START;
break;
}
if ( sel == '3' )
{
downloadAddress = BOOT_PORG_ADDR;
break;
}
if ( sel == 0x1b )
return;
}
if ( WaitComDownload() )
return;
if ( sel == '2' )
return;
if ( sel == '3' )
start_kernel( downloadAddress , 0 );
puts( "Do you want to run it ?\n1: boot without initrd\n2: boot wiht initrd\nEsc: exit\n" );
while ( 1 )
{
char c = getch();
if ( c == 0x1b )
break;
if ( ( c == '1' ) || ( c == '2' ) )
start_kernel( downloadAddress , ( c == '1' ) ? 0 : INITRD_START );
}
}
/*
void RunProg(U32 addr, U32 size)
{
start_kernel(downloadAddress, 0);
}*/
void Program_eep( U32 addr , U32 size )
{
#ifdef IIC_SUPPORT
char* pdata;
U32 eep_addr;
int bytes, len;
U32 loop;
char data[EEP_RW_CHK_CNT];
eep_addr = 0;
pdata = ( char * ) addr;
len = size;
while ( len > 0 )
{
putchar( '.' );
bytes = ( len > EEP_RW_CHK_CNT ) ? EEP_RW_CHK_CNT : len;
AT91F_TWI_Write( AT91C_BASE_TWI , eep_addr , pdata , bytes );
eep_addr += bytes;
pdata += bytes;
len -= bytes;
//for (loop=0; loop<30000; loop++);
delay( 5 );
}
puts( "end\n" );
eep_addr = 0;
pdata = ( char * ) addr;
len = size;
while ( len )
{
bytes = ( len > EEP_RW_CHK_CNT ) ? EEP_RW_CHK_CNT : len;
AT91F_TWI_Read( AT91C_BASE_TWI , eep_addr , data , bytes );
for ( loop = 0; loop < bytes; loop++ )
if ( data[loop] != pdata[loop] )
{
puts( "Program EEPROM fail!\n" );
printf( "%x,%x\n" , loop , data[loop] );
return;
}
eep_addr += bytes;
pdata += bytes;
len -= bytes;
}
puts( "Program EEPROM Success!\n" );
#endif
}
U32 WaitComDownload( void )
{
U32 size;
U16 dnCS, CheckSum;
U8* buf;
puts( "Now downloadfile from uart0...\n" );
buf = ( U8 * ) downloadAddress;
RxTmp = buf - 4;
//設置調試串口中斷處理程序入口,使能屬于調試串口的子中斷
DbguIrqHandler = DBGU_Rx_Isr;
AT91F_US_EnableIt( ( AT91PS_USART ) AT91C_BASE_DBGU ,
( AT91C_US_RXRDY | AT91C_US_OVRE | AT91C_US_FRAME | AT91C_US_PARE ) );
while ( ( U32 ) RxTmp < ( U32 ) buf )
{
ShowLed( 15 );
delay( 80 );
ShowLed( 0 );
delay( 80 );
} //接收文件長度,4 bytes
size = *( U32 * ) ( buf - 4 );
downloadFileSize = size - 6;
printf( "Download File Size = %d\n" , size );
while ( ( ( U32 ) RxTmp - ( U32 ) buf ) < ( size - 4 ) )
{
ShowLed( 15 );
delay( 80 );
ShowLed( 0 );
delay( 80 );
}
AT91F_US_DisableIt( ( AT91PS_USART ) AT91C_BASE_DBGU ,
( AT91C_US_RXRDY | AT91C_US_OVRE | AT91C_US_FRAME | AT91C_US_PARE ) );
DbguIrqHandler = NULL;
dnCS = ( buf[downloadFileSize + 1] << 8 ) | buf[downloadFileSize];
CheckSum = 0;
for ( size = 0; size < downloadFileSize; size++ )
CheckSum += buf[size];
if ( dnCS != CheckSum )
{
puts( "\nCheckSum error!\n" );
return 1;
}
puts( "\nDwonload success\n" );
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -