//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(); } }
/*-----------------------------------------------------------------------* * 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) }