📄 hw_timer.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : hw_timer.c
Desc : Timer接口函数的实现
Author : huangxinyu
Date : 2007-05-31
Notes :
$Log: hw_timer.c,v $
Revision 1.2 2008/06/19 04:43:37 Administrator
代码整理!
Revision 1.1.1.1 2008/05/07 04:15:08 Administrator
no message
Revision 1.10 2008/01/07 12:52:21 Huangshilin
no message
Revision 1.1.1.1 2007/12/21 02:34:34 Lingzhaojun
12.21
Revision 1.2 2007/12/14 15:09:32 Hanjiang
rm972 pp后的版本上传
Revision 1.1.1.1 2007/12/11 14:19:29 cvsadmin
no message
Revision 1.2 2007/12/01 08:46:02 Shenfuming
no message
Revision 1.1.1.1 2007/12/01 01:30:13 Lingzhaojun
no message
Revision 1.7 2007/11/21 11:56:36 Huangxinyu
修正videotimer问题
Revision 1.6 2007/11/15 14:07:46 Huangxinyu
增加video timer
Revision 1.5 2007/11/10 04:31:05 Huangxinyu
调试修改
Revision 1.4 2007/10/15 09:20:10 Huangxinyu
根据RK27提交修改driver
Revision 1.3 2007/10/08 02:38:50 Lingzhaojun
添加版本自动注释脚本
*********************************************************************/
#include "include.h"
#include "hw_include.h"
#include "hw_timer.h"
#define pTimerReg ((pTimerReg_t)TIMER_REG_BASE)
static pTimerCallBack gTimerIRQ[3] = {NULL, NULL, NULL};
static UINT32 gTimerTick[3] = {0, 20*1000, 0};
/**************************************************************************
* 函数描述: 得到指定Timer的count值
* 入口参数: index -- Timer0/Timer1/Timer2
* 出口参数: 无
* 返回值: 指定Timer的count值
*
***************************************************************************/
UINT32 Timer_GetCount(UINT8 index)
{
UINT32 count;
switch (index)
{
case 0:
count = ReadReg32(&(pTimerReg->TMR0CVR));
break;
case 1:
count = ReadReg32(&(pTimerReg->TMR1CVR));
break;
case 2:
count = ReadReg32(&(pTimerReg->TMR2CVR));
break;
default:
break;
}
return count;
}
/**************************************************************************
* 函数描述: 初始化Timer
* 入口参数: index -- Timer0/Timer1/Timer2
* mstick -- 每个tick的毫秒数
* 出口参数: 无
* 返回值: TRUE -- 初始化成功
* FALSE -- 初始化失败
***************************************************************************/
/* index: Timer0/Timer1/Timer2
mstick: set millisecond per tick */
BOOL Timer_PowerOnInit(UINT8 index, UINT32 mstick)
{
UINT32 pll_timer_conf[3];
UINT32 pll_timer_apb_clk;
gTimerTick[index] = mstick;
pll_timer_apb_clk = Pll_get_apb_freq();
pll_timer_conf[index] = PORSCHE_TIMER_EN |
PORSCHE_TIMER_CNT_MODE_PERIODICAL |
PRESCALE_1 |
PORSCHE_TIMER_INT_MASK_DIS |
PORSCHE_TIMER_INT_LEVEL_TRIG;
switch (index)
{
case 0:
/* Disable the timer 0*/
WriteReg32(&(pTimerReg->TMR0CON), PORSCHE_TIMER_DIS);
/* load the counting value to timer0 */
WriteReg32(&(pTimerReg->TMR0LR), mstick*pll_timer_apb_clk / 1000); // Video usTick
/* set periodical mode and enable the timer */
WriteReg32(&(pTimerReg->TMR0CON), pll_timer_conf[index]);
break;
case 1:
/* Disable the timer 1*/
WriteReg32(&(pTimerReg->TMR1CON), PORSCHE_TIMER_DIS); /* load the counting value to timer1 */
WriteReg32(&(pTimerReg->TMR1LR), mstick*pll_timer_apb_clk);
/* set periodical mode and enable the timer */
WriteReg32(&(pTimerReg->TMR1CON), pll_timer_conf[index]);
break;
case 2:
/* Disable the timer 2*/
WriteReg32(&(pTimerReg->TMR2CON), PORSCHE_TIMER_DIS);
/* load the counting value to timer2 */
WriteReg32(&(pTimerReg->TMR2LR), mstick*pll_timer_apb_clk);
/* set periodical mode and enable the timer */
WriteReg32(&(pTimerReg->TMR2CON), pll_timer_conf[index]);
break;
default:
break;
}
return TRUE;
}
/**************************************************************************
* 函数描述: Timer中断服务程序
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Timer0ISR(void)
{
pTimerCallBack callback;
Timer_ClearIntrFlag(0); // 同时只有一个中断产生
callback = gTimerIRQ[0];
// gTimerIRQ[gTimerIndex] = NULL; // 中断产生的速度比全局变量赋值快
if (callback)
callback();
}
/**************************************************************************
* 函数描述: Timer1中断服务程序
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Timer1ISR(void)
{
pTimerCallBack callback;
Timer_ClearIntrFlag(1); // 同时只有一个中断产生
callback = gTimerIRQ[1];
// gTimerIRQ[gTimerIndex] = NULL; // 中断产生的速度比全局变量赋值快
if (callback)
callback();
}
/**************************************************************************
* 函数描述: Timer1中断服务程序
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Timer2ISR(void)
{
pTimerCallBack callback;
Timer_ClearIntrFlag(1); // 同时只有一个中断产生
callback = gTimerIRQ[1];
// gTimerIRQ[gTimerIndex] = NULL; // 中断产生的速度比全局变量赋值快
if (callback)
callback();
}
/**************************************************************************
* 函数描述: 启动Timer
* 入口参数: index -- Timer0/Timer1/Timer2
* mstick -- 每个tick的毫秒数
* callbak -- 用户注册的回调函数
* 出口参数: 无
* 返回值: 无
* 说 明: 此接口仅供系统使用
***************************************************************************/
void StartHWTimer(UINT8 index, UINT32 mstick, pTimerCallBack callback)
{
gTimerTick[index] = mstick;
gTimerIRQ[index] = callback;
switch (index)
{
case 0:
Intr_RegISR(INTC_TMR0, Timer0ISR);
break;
case 1:
Intr_RegISR(INTC_TMR1, Timer1ISR);
break;
case 2:
Intr_RegISR(INTC_TMR2, Timer2ISR);
break;
default:
break;
}
Timer_PowerOnInit(index, mstick);
}
/**************************************************************************
* 函数描述: 启动用户Timer
* 入口参数: mstick -- 每个tick的毫秒数
* callbak -- 用户注册的回调函数
* 出口参数: 无
* 返回值: 无
* 说 明: 此硬件Timer提供给应用使用
***************************************************************************/
void StartHWUserTimer(UINT32 mstick, pTimerCallBack callback)
{
StartHWTimer(UserTimerNo, mstick, callback);
}
void StopHWUserTimer(void)
{
/* Disable the timer 0*/
WriteReg32(&(pTimerReg->TMR0CON), PORSCHE_TIMER_DIS);
Intr_Disable(INTC_TMR0);
}
/**************************************************************************
* 函数描述: 启动Video Timer
* 入口参数: ustick -- 每个tick的微秒数
* callbak -- 用户注册的回调函数
* 出口参数: 无
* 返回值: 无
* 说 明: 此硬件Timer提供给Video使用
***************************************************************************/
void StartHWVideoTimer(UINT32 ustick, pTimerCallBack callback)
{
StartHWTimer(0, ustick, callback);
}
/**************************************************************************
* 函数描述: 清除Timer中断标志
* 入口参数: index -- Timer0/Timer1/Timer2
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Timer_ClearIntrFlag(UINT8 index)
{
switch (index)
{
case 0:
ClrRegBits32(&(pTimerReg->TMR0CON), PORSCHE_TIMER_INT_FLAG);
break;
case 1:
ClrRegBits32(&(pTimerReg->TMR1CON), PORSCHE_TIMER_INT_FLAG);
break;
case 2:
ClrRegBits32(&(pTimerReg->TMR2CON), PORSCHE_TIMER_INT_FLAG);
break;
default:
break;
}
}
/**************************************************************************
* 函数描述: 根据改变的APB频率校准Timer 参数
* 入口参数: APBfreq: APB 频率(kHz)
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Timer_SetFreq(UINT32 APBfreq)
{
UINT8 i;
for (i = 0;i < 3;i++)
{
Timer_PowerOnInit(i, gTimerTick[i]); //Timer_PowerOnInit内部get apbfreq
}
}
/**************************************************************************
* 函数描述: 反初始化Timer
* 入口参数: index -- Timer0/Timer1/Timer2
* 出口参数: 无
* 返回值: TRUE -- 反初始化成功
* FALSE -- 反初始化失败
***************************************************************************/
BOOL Timer_PowerOffDeinit(UINT8 index)
{
switch (index)
{
case 0:
/* Disable the timer 0*/
WriteReg32(&(pTimerReg->TMR0CON), PORSCHE_TIMER_DIS);
gTimerIRQ[index] = NULL;
break;
case 1:
/* Disable the timer 1*/
WriteReg32(&(pTimerReg->TMR1CON), PORSCHE_TIMER_DIS);
gTimerIRQ[index] = NULL;
break;
case 2:
/* Disable the timer 1*/
WriteReg32(&(pTimerReg->TMR2CON), PORSCHE_TIMER_DIS);
gTimerIRQ[index] = NULL;
break;
default:
break;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -