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

📄 isr.c

📁 usb host在ARM7上的实现
💻 C
字号:
/****************************************************************************/
/*	includes																*/
/****************************************************************************/
#include "HostStack.h"


OS_EVENT	*OS_rhsc_event;

/****************************************************************************/
/*	global vars																*/
/****************************************************************************/

volatile	unsigned long	g_sof_counter			= 0;
unsigned long	g_sof_counter_prev		= 0;

unsigned long	g_operation_time		= 0;


volatile	unsigned short		g_isr_flag;
volatile	unsigned short		g_event_marker		= 0;
volatile	unsigned short		g_event_counter			= 0;

volatile	funcPtr			g_SOF_service_routine[ MAXMUM_NUMBER_OF_SOF_SERVICE_ROUTINE_METHOD ]
										= SERVICE_ROUTINE_INITIALIZE;
										
volatile	funcPtr			g_ATLInt_service_routine[ MAXMUM_NUMBER_OF_SOF_SERVICE_ROUTINE_METHOD ]
										= SERVICE_ROUTINE_INITIALIZE;
										
unsigned short	hardware_configuration_setting;

unsigned short	level			= 0;  //	ebnable/disable control


/****************************************************************************/
/*	function prototypes														*/
/****************************************************************************/

void	interrupt_handler_USB_Hc( unsigned short intr );
void	clear_HcuPInterrupt_bit( unsigned short flag );
void	HcuInterrupt_OPR_Reg_handler( unsigned long intr_stat );
void	clear_HcInterruptStatus_bit( unsigned long flag );


/****************************************************************************/
/*	function definitions													*/
/****************************************************************************/


void USB_Host_Serve(void)
{
	unsigned char err;
	OSSemPend(OS_rhsc_event,0,&err);
	if(g_event_marker&HUB_EVENT)
		hub_handler();
}


//*******************************************************************
//函数名称:wait_ms
//输入参数:等待时间长度,单位为毫秒
//输出参数:无
//功能描述:等特mS函数。注间要调中该函数时不可以关中断。
//*******************************************************************
void wait_ms( unsigned long timeout )
{
	//unsigned long	timelimit=0;
	
	//timelimit	= g_sof_counter + timeout;
	//while ( g_sof_counter < timelimit);// 等待中时间
	
		OSTimeDly(timeout/5);
}	 

//************************************************************************
// 函数名称:isr_USB_Hc
// 输入参数:无
// 输出参数:无
// 功能描述:USB主机中断服备函数
//************************************************************************
void  isr_USB_Hc( void )
{
	unsigned short	intr;
	unsigned short	inter_en;
	
	disable();

	inter_en	= disable_Hc();							// 关闭USB主机中断,保存使能的中断标志位
	intr		= read_register16( Com16_HcuPInterrupt );		// 读中断寄存器,获取中断标志
	clear_HcuPInterrupt_bit( intr );						//	Clear all interrupt here
	
	interrupt_handler_USB_Hc( intr & inter_en );			// USB主机中断处理
	
	enable_Hc( inter_en );								// 使用USB主机中断

	enable();
}


//****************************************************************************
// 函数名称:disable_Hc
// 输入参数:无
// 输出参数:inter_en,已使能的中断标志位
// 功能描述:禁止主机芯片向微控制器产生中断信号
//***************************************************************************
unsigned short disable_Hc( void )
{
	unsigned short	inter_en;

	inter_en	= read_register16( Com16_HcuPInterruptEnable );
	write_register16( Com16_HcuPInterruptEnable, 0x0000 );
	
	return ( inter_en );
}

//****************************************************************************
// 函数名称:enable_Hc
// 输入参数:inter_en,使能的中断
// 输出参数:无
// 功能描述:设置主机芯片向微控制器产生中断
//***************************************************************************
void enable_Hc( unsigned short inter_en )
{
	write_register16( Com16_HcuPInterruptEnable, inter_en );
}


//****************************************************************************
// 函数名称:interrupt_handler_USB_Hc
// 输入参数:intr,中断产生的标志号
// 输出参数:无
// 功能描述:设置主机芯片向微控制器产生中断
//***************************************************************************
void interrupt_handler_USB_Hc( unsigned short intr )
{
	int						i;

	if ( intr & HcuInterrupt_AllEOTInterrupt )
		;
			
	if ( intr & HcuInterrupt_SOFITInt )
	{
		for ( i = 0; i < MAXMUM_NUMBER_OF_SOF_SERVICE_ROUTINE_METHOD; i++ )
			if ( g_SOF_service_routine[ i ] )
				(*g_SOF_service_routine[ i ])();

		g_sof_counter = (g_sof_counter & 0xFFFF0000) | (read_register32( Com32_HcFmNumber ) & 0x0000FFFF);
 	}
	
	if ( intr & HcuInterrupt_ATLInt )
	{
		for ( i = 0; i < MAXMUM_NUMBER_OF_SOF_SERVICE_ROUTINE_METHOD; i++ )
			if ( g_ATLInt_service_routine[ i ] )
				(*g_ATLInt_service_routine[ i ])();
	}
	
	if ( intr & HcuInterrupt_OPR_Reg )
	{
		unsigned long	intr32;
		
		intr32 = read_register32( Com32_HcInterruptStatus );	// 读主机中断寄存器
		clear_HcInterruptStatus_bit( intr32 );				// 清主机中断寄存器中断标志位

		HcuInterrupt_OPR_Reg_handler( intr32 );			// 主机中断寄存器处理
	}
	
	if ( intr & HcuInterrupt_HCSuspend )
		;
	
	if ( intr & HcuInterrupt_ClkReady )
		;
		
}
//*****************************************************************************
// 函数名称:clear_HcuPInterrupt_bit
// 输入参数:flag
// 输出参数:无
// 功能描述:清主机微控器中断状态标志位
//*****************************************************************************
void clear_HcuPInterrupt_bit( unsigned short flag )
{
	g_isr_flag		|= flag;
	
	write_register16( Com16_HcuPInterrupt, flag );
}

//**********************************************************************************
// 函数名称:HcuInterrupt_OPR_Reg_handler
// 输入参数:cause,中断标志位
// 输出参数:无
// 功能描述:主机控制器中断处理
//**********************************************************************************
void HcuInterrupt_OPR_Reg_handler( unsigned long cause )
{
	unsigned long	intr_stat;

	intr_stat	= cause & read_register32( Com32_HcInterruptEnable );

	if ( intr_stat & HcInterruptStatus_SO )
		;

	if ( intr_stat & HcInterruptStatus_SF )
		;

	if ( intr_stat & HcInterruptStatus_RD )
		;

	if ( intr_stat & HcInterruptStatus_UE )
		;

	if ( intr_stat & HcInterruptStatus_RHSC )
	{
		g_event_marker = ROOT_HUB_EVENT;
		OSSemPost(OS_rhsc_event);
	}
	if ( intr_stat & HcInterruptStatus_ATD )
		;
		
	if ( intr_stat & HcInterruptStatus_FNO )
		g_sof_counter	+= (g_sof_counter & 0x00008000) ? 0 : (1L << 16);
}


//*****************************************************************************
// 函数名称:clear_HcInterruptStatus_bit
// 输入参数:flag
// 输出参数:无
// 功能描述:清主机中断状态标志位
//*****************************************************************************
void clear_HcInterruptStatus_bit( unsigned long flag )
{
	g_isr_flag		|= flag << 8;

	write_register32( Com32_HcInterruptStatus, flag );
}

//*****************************************************************************
// 函数名称:install_SOF_service_routine
// 输入参数:number
// 输出参数:function_ptr
// 功能描述:安装同步服务函数
//*****************************************************************************
funcPtr install_SOF_service_routine( unsigned char number, funcPtr function_ptr )
{
	funcPtr		tmp;
	if ( !(number < MAXMUM_NUMBER_OF_SOF_SERVICE_ROUTINE_METHOD) )
	{
		return (funcPtr) -1;
	}
	tmp									= g_SOF_service_routine[ number ];
	g_SOF_service_routine[ number ]		= function_ptr;
	return ( tmp );
}

//*****************************************************************************
// 函数名称:install_SOF_service_routine
// 输入参数:number
// 输出参数:function_ptr
// 功能描述:安装ATL中断服务函数
//*****************************************************************************
funcPtr install_ATLInt_service_routine( unsigned char number, funcPtr function_ptr )
{
	funcPtr		tmp;

	if ( !(number < MAXMUM_NUMBER_OF_SOF_SERVICE_ROUTINE_METHOD) )
	{
		return (funcPtr) -1;
	}
	tmp	= g_ATLInt_service_routine[ number ];
	g_ATLInt_service_routine[ number ]	= function_ptr;
	return ( tmp );
}

⌨️ 快捷键说明

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