📄 2440lib.c
字号:
{
rGPACON = ( rGPACON & (~( 1 << 12 ) ) ) | ( 0 << 12 ); //GPA12
rGPECON = ( rGPECON & ~( 3 << 22 ) ) | ( 1 << 22 ); //GPE11
rGPECON = ( rGPECON & ~( 3 << 24 ) ) | ( 1 << 24 ); //GPE12
if ( data & 1 )
rGPEDAT = ( rGPEDAT & ~( 1 << 12 ) ) | ( 1 << 12 );
else
rGPEDAT = ( rGPEDAT & ~( 1 << 12 ) ) | ( 0 << 12 );
if ( data & 2 )
rGPADAT = ( rGPADAT & ~( 1 << 12 ) ) | ( 1 << 12 );
else
rGPADAT = ( rGPADAT & ~( 1 << 12 ) ) | ( 0 << 12 );
if ( data & 4 )
rGPEDAT = ( rGPEDAT & ~( 1 << 11 ) ) | ( 1 << 11 );
else
rGPEDAT = ( rGPEDAT & ~( 1 << 11 ) ) | ( 0 << 11 );
}
/********************************************************************************************************************
【函数名称】U32 Get_Key_Status( void )
【功能描述】获取按键状态
********************************************************************************************************************/
U32 Get_Key_Status( void )
{
U32 ret = 0;
rGPGCON = ( rGPGCON & ~( 3 << 0 ) ) | ( 0 << 0 ); //GPG0
rGPGUP = rGPGUP | ( 1 << 0 ); //上拉电阻无效
rGPGCON = ( rGPGCON & ~( 3 << 4 ) ) | ( 0 << 4 ); //GPG2
rGPGUP = rGPGUP | ( 1 << 2 ); //上拉电阻无效
rGPGCON = ( rGPGCON & ~( 3 << 6 ) ) | ( 0 << 6 ); //GPG3
rGPGUP = rGPGUP | ( 1 << 3 ); //上拉电阻无效
if ( rGPGDAT & ( 1 << 0 ) )
{
ret |= 1;
}
if ( rGPGDAT & ( 1 << 2 ) )
{
ret |= 2;
}
if ( rGPGDAT & ( 1 << 3 ) )
{
ret |= 4;
}
return ( (~ret) & 0x07 ) ;
}
/********************************************************************************************************************
【函数名称】void Test_Keys_LEDs( void )
【功能描述】按键和LED测试
********************************************************************************************************************/
void Test_Keys_LEDs( void )
{
U32 m ;
Uart_Printf( "\nKEYs & LEDs Test, press 'ESC' key to exit !\n" ) ;
while ( Uart_GetKey() != ESC_KEY )
{
m = Get_Key_Status() ;
if ( m != 0 )
{
Uart_Printf( "key = 0x%x\n", m ) ;
}
Led_Display( ~m ) ;
}
}
/********************************************************************************************************************
【函数名称】int Ear_Jack_Detect( void )
【功能描述】探测耳机插头是否插入
********************************************************************************************************************/
int Ear_Jack_Detect( void )
{
rGPGCON &= ~( 3 << 24 ); //GPG12 is Ear Jack detect
rGPGUP &= ~( 1 << 12 );
if ( ( rGPGDAT & ( 1 << 12 ) ) == 0 )
{
return 0;
}
Delay( 500 );
if ( ( rGPGDAT & ( 1 << 12 ) ) == 0 )
{
return 0;
}
return 1;
}
/********************************************************************************************************************
【函数名称】int SD_MMC_Card_Detect( void )
【功能描述】探测SD、MMC卡是否插入
********************************************************************************************************************/
int SD_MMC_Card_Detect( void )
{
rGPGCON &= ~( 3 << 16 ); //GPG8 is SD Card detect
rGPGUP &= ~( 1 << 8 );
if ( rGPGDAT & ( 1 << 8 ) )
{
return 0;
}
Delay( 1000 );
if ( rGPGDAT & ( 1 << 8 ) )
{
return 0;
}
return 1;
}
/********************************************************************************************************************
【函数名称】int USB_Device_Detect( void )
【功能描述】探测USB插头是否插入
********************************************************************************************************************/
int USB_Device_Detect( void )
{
rGPGCON &= ~( 3 << 22 ); //GPG11 is USB detect
rGPGUP &= ~( 1 << 11 );
if ( rGPGDAT & ( 1 << 11 ) )
{
return 0;
}
Delay( 1000 );
if ( rGPGDAT & ( 1 << 11 ) )
{
return 0;
}
return 1;
}
/********************************************************************************************************************
【函数名称】Board_Status_Report( void )
【功能描述】报告板上的状态
********************************************************************************************************************/
void Board_Status_Report( void )
{
int m ;
if( USB_Device_Detect() == TRUE )
Uart_Printf( "Now USB Cable Is Insert!\n" );
else
Uart_Printf( "Now USB Cable Is NOT Insert!\n" );
if( SD_MMC_Card_Detect() == TRUE )
Uart_Printf( "Now SD/MMC Card Is Insert!\n" );
else
Uart_Printf( "Now SD/MMC Card Is NOT Insert!\n" );
m = Ear_Jack_Detect() ;
if( m == 0 )
Uart_Printf( "EAR JACK is NOT pluged in!\n" );
else
Uart_Printf( "EAR JACK is pluged in\n", m );
m = Get_Key_Status() ;
if( m == 0 )
Uart_Printf( "NO Key is pressed!\n" );
else
Uart_Printf( "key is pressed! Key value = 0x%x\n", m );
}
/********************************************************************************************************************
【函数名称】void NAND_Write_Protect_Enable( unsigned char m )
【功能描述】
********************************************************************************************************************/
void NAND_Write_Protect_Enable( unsigned char m )
{
rGPBCON = ( rGPBCON & ~( 0x3 << 10 ) ) | ( 0x01 << 10 );
if ( m == TRUE )
{
rGPBDAT = ( rGPBDAT & ~( 0x1 << 5 ) ) | ( 0x00 << 5 );
}
else
{
rGPBDAT = ( rGPBDAT & ~( 0x1 << 5 ) ) | ( 0x01 << 5 );
}
}
/********************************************************************************************************************
【函数名称】void Audio_Amp_PWR_ON_OFF( unsigned char m )
【功能描述】
********************************************************************************************************************/
void Audio_Amp_PWR_ON_OFF( unsigned char m )
{
rGPBCON = ( rGPBCON & ~( 0x3 << 12 ) ) | ( 0x01 << 12 );
if ( m == TRUE )
{
rGPBDAT = ( rGPBDAT & ~( 0x1 << 6 ) ) | ( 0x01 << 6 );
}
else
{
rGPBDAT = ( rGPBDAT & ~( 0x1 << 6 ) ) | ( 0x00 << 6 );
}
}
/********************************************************************************************************************
【函数名称】void SAA7113H_PWR_ON_OFF( void )
【功能描述】
********************************************************************************************************************/
void SAA7113H_PWR_ON_OFF( unsigned char m )
{
rGPJCON = ( rGPJCON & ~( 0x3 << 24 ) ) | ( 0x01 << 24 );
if ( m == TRUE )
{
rGPJDAT = ( rGPJDAT & ~( 0x1 << 12 ) ) | ( 0x01 << 12 );
}
else
{
rGPJDAT = ( rGPJDAT & ~( 0x1 << 12 ) ) | ( 0x00 << 12 );
}
}
/********************************************************************************************************************
【函数名称】void USB_1K5_Pull_UP_Down( unsigned char m )
【功能描述】
********************************************************************************************************************/
void USB_1K5_Pull_UP_Down( unsigned char m )
{
rGPHCON = ( rGPHCON & ~( 0x3 << 20 ) ) | ( 0x01 << 20 );
if ( m == TRUE )
{
rGPHDAT = ( rGPHDAT & ~( 0x1 << 10 ) ) | ( 0x01 << 10 );
}
else
{
rGPHDAT = ( rGPHDAT & ~( 0x1 << 10 ) ) | ( 0x00 << 10 );
}
}
//*************************[ Timer ]********************************
void Timer_Start( int divider ) //0:16us,1:32us 2:64us 3:128us
{
rWTCON = ( ( PCLK / 1000000 - 1 ) << 8 ) | ( divider << 3 ); //Watch-dog timer control register
rWTDAT = 0xffff; //Watch-dog timer data register
rWTCNT = 0xffff; //Watch-dog count register
// Watch-dog timer enable & interrupt disable
rWTCON = ( rWTCON & ~( 1 << 5 ) & ~( 1 << 2 ) ) | ( 1 << 5 );
}
//=================================================================
int Timer_Stop( void )
{
rWTCON = ( ( PCLK / 1000000 - 1 ) << 8 );
return ( 0xffff - rWTCNT );
}
//*************************[ MPLL ]*******************************
void ChangeMPllValue( int mdiv , int pdiv , int sdiv )
{
rMPLLCON = ( mdiv << 12 ) | ( pdiv << 4 ) | sdiv;
}
//************************[ HCLK, PCLK ]***************************
/*
// for 2410.
void ChangeClockDivider(int hdivn,int pdivn)
{
// hdivn,pdivn FCLK:HCLK:PCLK
// 0,0 1:1:1
// 0,1 1:1:2
// 1,0 1:2:2
// 1,1 1:2:4
rCLKDIVN = (hdivn<<1) | pdivn;
if(hdivn)
MMU_SetAsyncBusMode();
else
MMU_SetFastBusMode();
}
*/
// Modified for 2440.
void ChangeClockDivider( int hdivn_val , int pdivn_val )
{
int hdivn = 2, pdivn = 0;
// hdivn_val (FCLK:HCLK)ratio hdivn
// 11 1:1 (0)
// 12 1:2 (1)
// 13 1:3 (3)
// 14 1:4 (2)
// pdivn_val (HCLK:PCLK)ratio pdivn
// 11 1:1 (0)
// 12 1:2 (1)
switch ( hdivn_val )
{
case 11:
hdivn = 0; break;
case 12:
hdivn = 1; break;
case 13:
case 16:
hdivn = 3; break;
case 14:
case 18:
hdivn = 2; break;
}
switch ( pdivn_val )
{
case 11:
pdivn = 0; break;
case 12:
pdivn = 1; break;
}
//Uart_Printf("Clock division change [hdiv:%x, pdiv:%x]\n", hdivn, pdivn);
rCLKDIVN = ( hdivn << 1 ) | pdivn;
switch ( hdivn_val )
{
case 16:
// when 1, HCLK=FCLK/8.
rCAMDIVN = ( rCAMDIVN & ~( 3 << 8 ) ) | ( 1 << 8 );
break;
case 18:
// when 1, HCLK=FCLK/6.
rCAMDIVN = ( rCAMDIVN & ~( 3 << 8 ) ) | ( 1 << 9 );
break;
}
if ( hdivn != 0 )
MMU_SetAsyncBusMode();
else
MMU_SetFastBusMode();
}
//**************************[ UPLL ]*******************************
void ChangeUPllValue( int mdiv , int pdiv , int sdiv )
{
rUPLLCON = ( mdiv << 12 ) | ( pdiv << 4 ) | sdiv;
}
//*************************[ General Library ]**********************
void* malloc( unsigned nbyte )
//Very simple; Use malloc() & free() like Stack
//void *mallocPt=Image$$RW$$Limit;
{
void* returnPt = mallocPt;
mallocPt = ( int * ) mallocPt + nbyte / 4 + ( ( nbyte % 4 ) > 0 ); //To align 4byte
if ( ( int ) mallocPt > HEAPEND )
{
mallocPt = returnPt;
return NULL;
}
return returnPt;
}
//-------------------------------------------------------------------
void free( void* pt )
{
mallocPt = pt;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -