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

📄 2440lib.c

📁 2440 开发板的测试程序。包括uart,iic,lcd
💻 C
📖 第 1 页 / 共 3 页
字号:
{
	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 + -