/*
 * timer.c
 *
 *  Created on: 20211210
 *      Author: Administrator
 */

#include "timer.h"
#include "uart.h"
alt_u32 timer_done;
extern uint8_t flag;
/******************************************************************************
*   : Timer_Init
* 	: ʼTimerṹ岢ؽṹַָ
* 	: timer_base system.hжtimerĻַ
* 		timer_ic_idʱжϿid
* 		timer_irqʱжϺ
* 	: 
* Return	:ʼTimerṹָ
******************************************************************************/
TIMER_HANDLE Timer_Init(
		const alt_u32 timer_base,
		const alt_u32 timer_ic_id,
		const alt_u32 timer_irq
		){
	alt_u8 bSuccess = Timer_TRUE;
	CoreCourse_TIMER *p;
	int rc;
	p = malloc(sizeof(CoreCourse_TIMER));
	if (!p)
		return p;
	memset(p, 0, sizeof(CoreCourse_TIMER));
	p->timer_base = timer_base;
	p->timer_ic_id = timer_ic_id;
	p->timer_irq = timer_irq;
	IOWR_ALTERA_AVALON_TIMER_PERIODH(p->timer_base,Timer_Period >> 16);//ʱʱӦĸ16λ
	IOWR_ALTERA_AVALON_TIMER_PERIODL(p->timer_base,Timer_Period);//ʱʱӦĵ16λ
	IOWR_ALTERA_AVALON_TIMER_CONTROL(p->timer_base,START_MSK | CONT_MSK | ITO_MSK);//öʱжϿ
	//עж
	rc = alt_ic_isr_register(
			p->timer_ic_id,
			p->timer_irq,
			Timer_isr,
			p,
			NULL);
	if (rc != 0){
		//DEBUG_OUT(("[Timer]register IRQ fail\n"));
		bSuccess = Timer_FALSE;
	}else{
		//DEBUG_OUT(("[Timer]register IRQ success\n"));
	}
	if (!bSuccess && p){
		free(p);
		p = NULL;
	}
	return p;
}
/******************************************************************************
*   : Timer_isr
* 	: ʱжϷжϣ״̬Ĵеֵ
* 	: context Timerṹָ
* 		id,жID
* Return	0
*******************************************************************************/
alt_isr_func Timer_isr(void* context, alt_u32 id)
{
	CoreCourse_TIMER *p = (CoreCourse_TIMER *)context;
//	timer_done = 1;
	if(FLAG_FrameData || !flag)
		timer_done = 1;
	else
		timer_done = 0;
//	Judge_ETB();
	IOWR_ALTERA_AVALON_TIMER_STATUS(p->timer_base,0);
	return 0;
}
