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