📄 gpt.c
字号:
* It is called to start GPT timer
*
* PARAMETERS
* timerNum = 1(GPT1) or 2(GPT2)
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* external_global
*/
void GPT_Start(kal_uint8 timerNum)
{
if (timerNum == 1)
{
DRV_Reg(GPT1_CTRL) |= GPT_CTRL_Enable;
DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_GPT,PDN_GPT);
}
if (timerNum == 2)
{
DRV_Reg(GPT2_CTRL) |= GPT_CTRL_Enable;
DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_GPT,PDN_GPT);
}
#if ( defined(MT6218B) || defined(MT6219) || defined(MT6217)|| defined(MT6228)|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
if (timerNum == 3)
{
DRV_Reg(GPT3_CTRL) |= GPT3_ENABLE;
DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_GPT,PDN_GPT);
}
#endif
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
*/
void GPT_LISR(void)
{
kal_uint16 GPT_Status;
IRQMask(IRQ_GPT_CODE);
GPT_Status = DRV_Reg(GPT_STS);
if (GPT_Status & GPT_STS_1)
{
GPTTimer.GPT_FUNC.gpt1_func();
}
if (GPT_Status & GPT_STS_2)
{
GPTTimer.GPT_FUNC.gpt2_func();
}
}
/*
* FUNCTION
* GPT_init
*
* DESCRIPTION
* GPT initial function
*
* CALLS
* Initialize the GPT module
*
* PARAMETERS
* timerNum = 1(GPT1) or 2(GPT2)
* GPT_Callback = callback function, called when GPT intr. is coming
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* external_global
*/
void GPT_init(kal_uint8 timerNum, void (*GPT_Callback)(void))
{
IRQ_Register_LISR(IRQ_GPT_CODE, GPT_LISR,"GPT handler");
if (timerNum == 1)
{
GPTTimer.GPT_FUNC.gpt1_func = GPT_Callback;
GPT_clock(1,clk_1k);
IRQSensitivity(IRQ_GPT_CODE,LEVEL_SENSITIVE);
IRQUnmask(IRQ_GPT_CODE);
}
if (timerNum == 2)
{
GPTTimer.GPT_FUNC.gpt2_func = GPT_Callback;
GPT_clock(2,clk_1k);
IRQSensitivity(IRQ_GPT_CODE,LEVEL_SENSITIVE);
IRQUnmask(IRQ_GPT_CODE);
}
}
/*
* FUNCTION
* GPTI_GetHandle
*
* DESCRIPTION
* GPT handle function, each module should get handle once(only one).
*
* CALLS
*
*
* PARAMETERS
* *handle = handle value
*
* RETURNS
* KAL_TRUE, Action is ok.
* KAL_FALSE, Action is failed.
*
* GLOBALS AFFECTED
* external_global
*/
/*actual value = 0~31*/
kal_uint8 GPTI_GetHandle(kal_uint8 *handle)
{
kal_uint32 savedMask;
savedMask = SaveAndSetIRQMask();
*handle = GPTTimer.MAX_GPTIMER_ITEMS;
GPTTimer.MAX_GPTIMER_ITEMS++;
RestoreIRQMask(savedMask);
if (GPTTimer.MAX_GPTIMER_ITEMS <= 32)
return KAL_TRUE;
else
{
GPTTimer.MAX_GPTIMER_ITEMS = 32;
ASSERT(0);
return KAL_FALSE;
}
}
/*
* FUNCTION
* GPTI_StartItem
*
* DESCRIPTION
* GPT start a item.
*
* CALLS
*
* PARAMETERS
* moudle = UART_Module, SIM_Module, GPT_Module
* tick = the delay(the unit is 10ms)
* gptimer_func = the callback function when the tick is reached.
* parameter = the parameter inputed into gptimer_func
*
* RETURNS
* KAL_TRUE, start item successfully
* KAL_FALSE, start item fail
*
* GLOBALS AFFECTED
* external_global
*/
kal_bool GPTI_StartItem(kal_uint8 module,kal_uint16 tick,void (*gptimer_func)(void *),void *parameter)
{
kal_uint32 savedMask;
if (GPTTimer.status & (1<<module))
{
return KAL_FALSE;
}
savedMask = SaveAndSetIRQMask();
//if (tick == 0)
// tick =1;
GPTTimer.status |= (1<<module);
GPTTimer.GPTItems[module].tick = GPTTimer.GPT_TICK+tick;
GPTTimer.GPTItems[module].gptimer_func = gptimer_func;
GPTTimer.GPTItems[module].parameter = parameter;
if(GPTTimer.GPTSTOP == KAL_TRUE)
{
GPTTimer.GPTSTOP = KAL_FALSE;
GPT_Start(gptimer_num);
}
RestoreIRQMask(savedMask);
return KAL_TRUE;
}
/*
* FUNCTION
* GPTI_StopItem
*
* DESCRIPTION
* GPT stop a item.
*
* CALLS
*
* PARAMETERS
* moudle = UART_Module, SIM_Module, GPT_Module
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* external_global
*/
void GPTI_StopItem(kal_uint8 module)
{
kal_uint32 savedMask;
savedMask = SaveAndSetIRQMask();
GPTTimer.status &= ~(1<<module);
if (GPTTimer.status == 0)
{
GPTTimer.GPTSTOP = KAL_TRUE;
GPTTimer.GPT_TICK = 0;
GPT_Stop(gptimer_num);
}
RestoreIRQMask(savedMask);
}
/*
* FUNCTION
* GPTI_HISR
*
* DESCRIPTION
* GPTI HISR
*
* CALLS
*
* PARAMETERS
* void
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* external_global
*/
void GPTI_HISR(void)
{
kal_uint8 index;
for (index = 0;index < GPTTimer.MAX_GPTIMER_ITEMS;index++)
{
GPTProcess(index);
}
GPTTimer.GPT_TICK++;
if (GPTTimer.status == 0)
{
GPTTimer.GPTSTOP = KAL_TRUE;
GPTTimer.GPT_TICK = 0;
GPT_Stop(gptimer_num);
}
IRQClearInt(IRQ_GPT_CODE);
IRQUnmask(IRQ_GPT_CODE);
}
/*
* FUNCTION
* GPTI_Callback
*
* DESCRIPTION
* GPT1 LISR
*
* CALLS
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* external_global
*/
void GPTI_Callback(void)
{
//kal_activate_hisr(GPTTimer.hisr);
drv_active_hisr(DRV_GPT_HISR_ID);
}
/*
* FUNCTION
* GPTI_init
*
* DESCRIPTION
* Initialize the GPTI module with GPT
*
* CALLS
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* external_global
*/
void GPTI_init(void)
{
if (GPTTimer.hisr == NULL)
{
//GPTTimer.hisr = kal_create_hisr("GPTIMER",2,512,GPTI_HISR,NULL);
GPTTimer.hisr= (void*)0x1234;
DRV_Register_HISR(DRV_GPT_HISR_ID, GPTI_HISR);
}
GPT_init(gptimer_num,GPTI_Callback);
GPT_ResetTimer(gptimer_num,gptimer_interval-1,KAL_TRUE);
GPTTimer.GPT_TICK = 0;
GPTTimer.MAX_GPTIMER_ITEMS = 0;
GPTTimer.GPTSTOP = KAL_TRUE;
GPTTimer.status =0;
}
/*
* FUNCTION
* GPTI_BusyWait
*
* DESCRIPTION
* Use GPT2 as a counter to perform a busy waiting
*
* CALLS
*
* PARAMETERS
* len: length of the counter in unit of 1ms
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*/
void GPTI_BusyWait(kal_uint16 len)
{
// disable PDN
#if (defined(MT6208)||defined(MT6205))
DRV_Reg(DRVPDN_CON1) &= ~DRVPDN_CON1_GPT;
#else
DRV_WriteReg(DRVPDN_CON1_CLR, DRVPDN_CON1_GPT);
#endif
DRV_WriteReg(GPT2_LEN, len);
DRV_WriteReg(GPT2_PRESCALER, clk_1k); // 1K HZ
// one shot
DRV_WriteReg(GPT2_CTRL, GPT_CTRL_Enable);
while(!(DRV_Reg(GPT_STS) & GPT_STS_2));
// set PDN
#if (defined(MT6208)||defined(MT6205))
DRV_Reg(DRVPDN_CON1) |= DRVPDN_CON1_GPT;
#else
DRV_WriteReg(DRVPDN_CON1_SET, DRVPDN_CON1_GPT);
#endif
}
#if ( defined(MT6218B) || defined(MT6219) || defined(MT6217)|| defined(MT6228)|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
void GPT3_Init(void)
{
DRV_WriteReg(GPT3_PRESCALER,GPT_PRESCALER_div32);
}
kal_uint16 GPT_return_current_count(void)
{
kal_uint16 current_count;
current_count=DRV_Reg(GPT3_LEN);
return current_count;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -