⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpt.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 2 页
字号:
*	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 + -