//add while loop to fix a hardware bug.
static kal_uint16 GPT_return_current_count(void)
{
   kal_uint16 current_count;
   gpt_count=0;
   do
   {	
      gpt_count++;
		current_count=DRV_GPT_Reg(GPT3_LEN);
   }
   while((current_count!=DRV_GPT_Reg(GPT3_LEN)) && (gpt_count<100));
   return current_count;      
}   
//this function return the status of GPT1 and GPT2, which influence sleep mode.
//re-check with wy to remove GPT3 GPT4 
 kal_bool GPT_IsStop(void)
{
	#if defined(DRV_GPT_GPT3)
	if ( (((DRV_GPT_Reg(GPT1_CTRL)|DRV_GPT_Reg(GPT2_CTRL))&GPT_CTRL_Enable)==0)&& (!(DRV_GPT_Reg(GPT3_CTRL)&GPT3_ENABLE)))
	#else
	if ( ((DRV_GPT_Reg(GPT1_CTRL)|DRV_GPT_Reg(GPT2_CTRL))&GPT_CTRL_Enable)==0  )
	#endif	
	{
		return KAL_TRUE;
	}
	else
		return KAL_FALSE;
}
void GPT_Stop_Step2()
{
	if( (((DRV_GPT_Reg(GPT1_CTRL)|DRV_GPT_Reg(GPT2_CTRL))&GPT_CTRL_Enable)==0)
	#if defined(DRV_GPT_GPT3)
	&& (!(DRV_GPT_Reg(GPT3_CTRL)&GPT3_ENABLE))
	#endif /* defined(DRV_GPT_GPT3) */
	#if defined(DRV_GPT_GPT4)
	&& (!(DRV_GPT_Reg(GPT4_CTRL)&GPT4_ENABLE))
	#endif /* defined(DRV_GPT_GPT4) */
   ) 
      {
			GPT_PDN_disable();
   	}
}
Exemplo n.º 4
0
/*-----------------------------------------------------------------------*
* FUNCTION                                                            
*	GPT_LISR
*
* DESCRIPTION                                                           
*   	GPT interrupt handler
*
* CALLS  
*	It is called when GPT interrupt is coming
*
* PARAMETERS
*	None
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*------------------------------------------------------------------------*/
void GPT_LISR(void)
{
	kal_uint16 GPT_Status;
  	IRQMask(IRQ_GPT_CODE);
	GPT_Status = DRV_GPT_Reg(GPT_STS);
	
	if (GPT_Status & GPT_STS_1)
	{
		HGPT1_Callback();
	}
	if (GPT_Status & GPT_STS_2)
	{
		HGPT2_Callback();
	}
   IRQClearInt(IRQ_GPT_CODE);
   IRQUnmask(IRQ_GPT_CODE);
}
/*-----------------------------------------------------------------------*
* FUNCTION                                                            
*	GPT_LISR
*
* DESCRIPTION                                                           
*   	GPT interrupt handler
*
* CALLS  
*	It is called when GPT interrupt is coming
*
* PARAMETERS
*	None
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*------------------------------------------------------------------------*/
extern void GPT_MS_Time_Out_Handler(kal_uint16 *ms_handle_sta);	/*defined in dcl_gpt.c*/
extern  kal_uint16 gpt_ms_lisr_handle_status;	/*defined in dcl_gpt.c*/
void GPT_LISR(void)
{
	kal_uint16 GPT_Status;
  	IRQMask(IRQ_GPT_CODE);
	GPT_Status = DRV_GPT_Reg(GPT_STS);
	
	if (GPT_Status & GPT_STS_1)
	{
		HGPT1_Callback();
	}
	if (GPT_Status & GPT_STS_2)
	{
		/*--------*/
		//add for 1ms GPT run in LISR context
		GPT_MS_Time_Out_Handler(&gpt_ms_lisr_handle_status);

		HGPT2_Callback(); /* always active hisr ,here may be some optimize */
	}
   IRQClearInt(IRQ_GPT_CODE);
   IRQUnmask(IRQ_GPT_CODE);
}
static kal_uint32  GPT4_return_current_count(void)
{
   kal_uint32  current_count;
   current_count=DRV_GPT_Reg(GPT4_LEN);
   return current_count;      
}  
void GPT_Stop_Step1(kal_uint8 timerNum)
{
	register kal_uint32 gpt_ctrl1;
	register kal_uint32 gpt_ctrl2;
	#if defined(DRV_GPT_GPT3)
	register kal_uint32 gpt_ctrl3;
	#endif   
	#if defined(DRV_GPT_GPT4)
	register kal_uint32 gpt_ctrl4;
	#endif  
  
	gpt_ctrl1 = DRV_GPT_Reg(GPT1_CTRL);
	gpt_ctrl2 = DRV_GPT_Reg(GPT2_CTRL);
	#if defined(DRV_GPT_GPT3)
	gpt_ctrl3 = DRV_GPT_Reg(GPT3_CTRL);
	#endif   
	#if defined(DRV_GPT_GPT4)
	gpt_ctrl4 = DRV_GPT_Reg(GPT4_CTRL);
	#endif  

   if (timerNum == 1)
   {
      gpt_ctrl1 &= ~GPT_CTRL_Enable;
      DRV_GPT_WriteReg(GPT1_CTRL,gpt_ctrl1);
   }
   else if (timerNum == 2)
   {
      gpt_ctrl2 &= ~GPT_CTRL_Enable;
      DRV_GPT_WriteReg(GPT2_CTRL,gpt_ctrl2);
   }
	#if defined(DRV_GPT_GPT3)
   else if (timerNum == 3)
   {
		#if !defined(GEMINI23C_EVB_BB)
		GPT3_UseCount--;
		if(GPT3_UseCount == 0)
		{
			#endif
			gpt_ctrl3 =(kal_uint16) ~GPT3_ENABLE;
			DRV_GPT_WriteReg(GPT3_CTRL,gpt_ctrl3);
			#if !defined(GEMINI23C_EVB_BB)
		}
		#endif
   }
	#endif //#if defined(DRV_GPT_GPT3)
	#if defined(DRV_GPT_GPT4)
	else if (timerNum == 4)
	{
		gpt_ctrl4 =(kal_uint16) ~GPT4_ENABLE;
		DRV_GPT_WriteReg(GPT4_CTRL,gpt_ctrl4);
	}
	#endif //#if defined(DRV_GPT_GPT4)

	if ( (((gpt_ctrl1|gpt_ctrl2)&GPT_CTRL_Enable)==0)
	#if defined(DRV_GPT_GPT3)
	&& (!(gpt_ctrl3&GPT3_ENABLE))
	#endif /* defined(DRV_GPT_GPT3) */
	#if defined(DRV_GPT_GPT4)
	&& (!(gpt_ctrl4&GPT4_ENABLE))
	#endif /* defined(DRV_GPT_GPT4) */
	)
 	{
		register kal_uint32 GPT_Status;
		GPT_Status = DRV_GPT_Reg(GPT_STS);
		IRQMask(IRQ_GPT_CODE);
		IRQClearInt(IRQ_GPT_CODE);
	}
}
/*-----------------------------------------------------------------------*
*
*	It is called to stop GPT timer
*
*------------------------------------------------------------------------*/
static void GPT_Stop(kal_uint8 timerNum)
{
	#if defined(DRV_GPT_STOP_2_STEP)
	GPT_Stop_Step1(timerNum);
	GPT_Stop_Step2();
	#else
	register kal_uint32 gpt_ctrl1;
	register kal_uint32 gpt_ctrl2;
	#if defined(DRV_GPT_GPT3)
	register kal_uint32 gpt_ctrl3;
	#endif   
	#if defined(DRV_GPT_GPT4)
	register kal_uint32 gpt_ctrl4;
	#endif 

	gpt_ctrl1 = DRV_GPT_Reg(GPT1_CTRL);
	gpt_ctrl2 = DRV_GPT_Reg(GPT2_CTRL);
   
	#if defined(DRV_GPT_GPT3)
	gpt_ctrl3 = DRV_GPT_Reg(GPT3_CTRL);
	#endif   
	
	#if defined(DRV_GPT_GPT4)
  	gpt_ctrl4= DRV_GPT_Reg(GPT4_CTRL);
	#endif

	if (timerNum == GPT1)
	{
		gpt_ctrl1 &= ~GPT_CTRL_Enable;
		DRV_GPT_WriteReg(GPT1_CTRL,gpt_ctrl1);
	}
	else if (timerNum == GPT2)
	{
		gpt_ctrl2 &= ~GPT_CTRL_Enable;
		DRV_GPT_WriteReg(GPT2_CTRL,gpt_ctrl2);
	}
	
	#if defined(DRV_GPT_GPT3)
	else if (timerNum == GPT3)
	{
		#if !defined(GEMINI23C_EVB_BB)
	   kal_uint32 savedMask;
		GPT3_UseCount--;
	   savedMask = SaveAndSetIRQMask();		
	   if(GPT3_UseCount == 0)
	   {
		#endif
		gpt_ctrl3 =(kal_uint16) ~GPT3_ENABLE;
		DRV_GPT_WriteReg(GPT3_CTRL,gpt_ctrl3);
		}
		 #if !defined(GEMINI23C_EVB_BB)
	   RestoreIRQMask(savedMask);
	}
		#endif
	#endif /* defined(DRV_GPT_GPT3) */
	#if defined(DRV_GPT_GPT4)
	else if (timerNum == GPT4)
	{
		gpt_ctrl4 =(kal_uint16) ~GPT4_ENABLE;
		DRV_GPT_WriteReg(GPT4_CTRL,gpt_ctrl4);
	}
	#endif 
	if ( (((gpt_ctrl1|gpt_ctrl2)&GPT_CTRL_Enable)==0)
	#if defined(DRV_GPT_GPT3)
	&& (!(gpt_ctrl3&GPT3_ENABLE))
	#endif /* defined(DRV_GPT_GPT3) */
	#if defined(DRV_GPT_GPT4)
	&& (!(gpt_ctrl4&GPT4_ENABLE))
	#endif /* defined(DRV_GPT_GPT4) */
 	)
   if(KAL_TRUE==GPT_IsStop())
   {
		DRV_GPT_Reg(GPT_STS);
		IRQMask(IRQ_GPT_CODE);
		IRQClearInt(IRQ_GPT_CODE);
		GPT_PDN_disable();
    }
#endif //#if defined(DRV_GPT_STOP_2_STEP)
}