/************************************************************************* * FUNCTION * EINT_LISR * * DESCRIPTION * Entry function of External Interrupt Service Routine * * CALLS * * PARAMETERS * * RETURNS * No return * * GLOBALS AFFECTE * *************************************************************************/ void EINT_LISR(void) { kal_uint8 index; kal_uint16 status; status = *EINT_STATUS; // for conventional external interrupt! for(index=0;index<EINT_MAX_CHANNEL;index++) { if (status & EINT_STATUS_EINT(index)) { GPTI_StopItem(eint_sw_debounce[index].eint_sw_debounce_handle); if ( (eint_sw_debounce[index].eint_intr_allow == KAL_FALSE) && (eint_sw_debounce_time_delay[index] > 0) ) { GPTI_StartItem(eint_sw_debounce[index].eint_sw_debounce_handle, eint_sw_debounce_time_delay[index], EINT_TIMER_CALLBACK, &eint_sw_debounce[index]); EINT_Mask(index); } else { eint_sw_debounce[index].eint_intr_allow = KAL_FALSE; // disable interrupt EINT_Mask(index); ASSERT(EINT_FUNC.eint_func[index]!=NULL); if ( EINT_FUNC.eint_func[index] ) { EINT_FUNC.eint_active[index] = KAL_TRUE; drv_active_hisr(DRV_EINT_HISR_ID); } } *EINT_INTACK = EINT_INTACK_EINT(index); } } // for external interrupt without hardware debounce and always edge sensitive for (index=EINT_MAX_CHANNEL; index<EINT_TOTAL_CHANNEL; index++) { if (status & EINT_STATUS_EINT(index)) { EINT_Mask(index); ASSERT(EINT_FUNC.eint_func[index]!=NULL); if ( EINT_FUNC.eint_func[index] ) { EINT_FUNC.eint_active[index] = KAL_TRUE; drv_active_hisr(DRV_EINT_HISR_ID); } *EINT_INTACK = EINT_INTACK_EINT(index); } } }
/************************************************************************* * FUNCTION * EINT_LISR * * DESCRIPTION * Entry function of External Interrupt Service Routine * * CALLS * * PARAMETERS * * RETURNS * No return * * GLOBALS AFFECTE * *************************************************************************/ void EINT_LISR(void) { kal_uint8 index; kal_uint32 status,mask_bits; status = EINT_L2_STA(); if (EINT_Internal_LISR_Handler(&status)) { return; } // for conventional external interrupt! for(index=0;index<EINT_TOTAL_CHANNEL;index++) { //EINT_PRINT("\tEINT triggered!"); if ( EINT_CheckHWDebounce(index) ) { mask_bits = EINT_Get_Mask_Bits(); if (status & EINT_STATUS_EINT(index) && !BU_G_BIT(mask_bits, index)) { if(eint_sw_debounce[index].eint_sw_debounce_handle != 0x7f) { DclSGPT_Control(eint_sw_debounce[index].eint_sw_debounce_handle,SGPT_CMD_STOP,0); DclSGPT_Close(&(eint_sw_debounce[index].eint_sw_debounce_handle)); } if ( (eint_sw_debounce[index].eint_intr_allow == KAL_FALSE) && (eint_sw_debounce_time_delay[index] > 0) ) { SGPT_CTRL_START_T start; //EINT_PRINT("\tstart timer, eint_sw_debounce_time_delay[%d] = %d",index,eint_sw_debounce_time_delay[index]); eint_sw_debounce[index].eint_sw_debounce_handle=DclSGPT_Open(DCL_GPT_CB,0); start.u2Tick=eint_sw_debounce_time_delay[index]; start.pfCallback=EINT_TIMER_CALLBACK; start.vPara=&eint_sw_debounce[index]; DclSGPT_Control(eint_sw_debounce[index].eint_sw_debounce_handle,SGPT_CMD_START,(DCL_CTRL_DATA_T*)&start); EINT_Mask(index); } else { eint_sw_debounce[index].eint_intr_allow = KAL_FALSE; // disable interrupt EINT_Mask(index); //EINT_PRINT("\tEINT trigger HISR"); ASSERT(EINT_FUNC.eint_func[index]!=NULL); if ( EINT_FUNC.eint_func[index] ) { EINT_FUNC.eint_active[index] = KAL_TRUE; drv_active_hisr(DRV_EINT_HISR_ID); } } EINT_L2_ACK(index); } } else { mask_bits = EINT_Get_Mask_Bits(); if (status & EINT_STATUS_EINT(index) && !BU_G_BIT(mask_bits, index)) { EINT_Mask(index); ASSERT(EINT_FUNC.eint_func[index]!=NULL); if ( EINT_FUNC.eint_func[index] ) { EINT_FUNC.eint_active[index] = KAL_TRUE; drv_active_hisr(DRV_EINT_HISR_ID); } EINT_L2_ACK(index); } } } }