133 lines
3.4 KiB
C
133 lines
3.4 KiB
C
#include "ucos_ii.h"
|
|
#include "type_define.h"
|
|
#include "dw_apb_timers.h"
|
|
#include "ucp_param.h"
|
|
#include "inter_vector.h"
|
|
#include "timers.h"
|
|
|
|
volatile int timer_s;
|
|
volatile int timer_end;
|
|
|
|
typedef struct timer_struct{
|
|
|
|
int timer_irq_num;
|
|
volatile UINT32 *load_count_reg;
|
|
volatile UINT32 * control_reg;
|
|
volatile UINT32 * eoi_reg;
|
|
irq_handler func;
|
|
|
|
}timer_desc;
|
|
|
|
void timer_isr();
|
|
|
|
|
|
|
|
timer_desc timer_val[8] = {
|
|
{
|
|
APC_TIMER10_INTR,
|
|
((volatile UINT32 *)(TIMER1_TIMER1BASE + TIMERLOADCOUNTOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER1BASE + TIMERCONTROLREGOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER1BASE + TIMEREOIOFF)),
|
|
timer_isr,
|
|
|
|
},
|
|
{
|
|
APC_TIMER11_INTR,
|
|
((volatile UINT32 *)(TIMER1_TIMER2BASE + TIMERLOADCOUNTOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER2BASE + TIMERCONTROLREGOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER2BASE + TIMEREOIOFF)),
|
|
timer_isr,
|
|
|
|
},
|
|
{
|
|
APC_TIMER12_INTR,
|
|
((volatile UINT32 *)(TIMER1_TIMER3BASE + TIMERLOADCOUNTOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER3BASE + TIMERCONTROLREGOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER3BASE + TIMEREOIOFF)),
|
|
timer_isr,
|
|
},
|
|
{
|
|
APC_TIMER13_INTR,
|
|
((volatile UINT32 *)(TIMER1_TIMER4BASE + TIMERLOADCOUNTOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER4BASE + TIMERCONTROLREGOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER4BASE + TIMEREOIOFF)),
|
|
timer_isr,
|
|
},
|
|
{
|
|
APC_TIMER14_INTR,
|
|
((volatile UINT32 *)(TIMER1_TIMER5BASE + TIMERLOADCOUNTOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER5BASE + TIMERCONTROLREGOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER5BASE + TIMEREOIOFF)),
|
|
timer_isr,
|
|
},
|
|
{
|
|
APC_TIMER15_INTR,
|
|
((volatile UINT32 *)(TIMER1_TIMER6BASE + TIMERLOADCOUNTOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER6BASE + TIMERCONTROLREGOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER6BASE + TIMEREOIOFF)),
|
|
timer_isr,
|
|
},
|
|
{
|
|
APC_TIMER16_INTR,
|
|
((volatile UINT32 *)(TIMER1_TIMER7BASE + TIMERLOADCOUNTOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER7BASE + TIMERCONTROLREGOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER7BASE + TIMEREOIOFF)),
|
|
timer_isr,
|
|
},
|
|
{
|
|
APC_TIMER17_INTR,
|
|
((volatile UINT32 *)(TIMER1_TIMER8BASE + TIMERLOADCOUNTOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER8BASE + TIMERCONTROLREGOFF)),
|
|
((volatile UINT32 *)(TIMER1_TIMER8BASE + TIMEREOIOFF)),
|
|
timer_isr,
|
|
},
|
|
|
|
};
|
|
|
|
void timer_isr()
|
|
{
|
|
int temp;
|
|
temp = *(timer_val[cur_apeid].eoi_reg);
|
|
OSTimeTick();
|
|
}
|
|
|
|
unsigned int get_cur_count_val()
|
|
{
|
|
return TIMER1_TIMER1CURRENTVAL;
|
|
}
|
|
|
|
unsigned int ape_get_timer(unsigned int count)
|
|
{
|
|
unsigned int now, base;
|
|
unsigned int value;
|
|
|
|
if (!count)
|
|
{
|
|
value = TIMER1_TIMER1CURRENTVAL;
|
|
return value;
|
|
}
|
|
|
|
base = count;
|
|
now = TIMER1_TIMER1CURRENTVAL;
|
|
if (base > now)
|
|
{
|
|
return (base - now);
|
|
}
|
|
else
|
|
{
|
|
base = 0xffffffff - now + base;
|
|
return base;
|
|
}
|
|
}
|
|
|
|
|
|
void timer_init(int ape_id)
|
|
{
|
|
smart_irq_request(timer_val[ape_id].timer_irq_num,timer_val[ape_id].func);
|
|
*(timer_val[ape_id].load_count_reg) = (5000000)*1; //100ms
|
|
|
|
*(timer_val[ape_id].control_reg) = 3;
|
|
|
|
}
|
|
|