예제 #1
0
파일: Eint.c 프로젝트: 12019/mtktest
/*************************************************************************
* 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);
      }
   }
}
예제 #2
0
/*************************************************************************
* 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);
         }
      }
   }
}