/******************************************************************************
版权所有：	
文件名称：	gps_1588.c
文件版本：	01.01
创建作者:	   sunxi
创建日期：	2013-02-28
功能说明：	gps和1588合并对时模块。
其它说明：
修改记录：
*/
/*------------------------------- 头文件 --------------------------------------
*/
#include "bsp.h"
#include "rt.h"
 
/*------------------------------- 宏定义 --------------------------------------
*/
#define ATIMER_CHANNEL		0
/* FEC 1588 register bits */
#define FEC_T_CTRL_CAPTURE		0x00000800
#define FEC_T_CTRL_RESTART		0x00000200
#define FEC_T_CTRL_PERIOD_RST	0x00000030
#define FEC_T_CTRL_ENABLE		0x00000001

#define FEC_T_INC_MASK			0x0000007f
#define FEC_T_INC_OFFSET		0

#define FEC_T_INC_40MHZ			25

#define FEC_T_PERIOD_ONE_SEC	0x3B9ACA00


/*------------------------------ 类型结构 -------------------------------------
*/


/*------------------------------ 全局变量 -------------------------------------
*/


/*------------------------------ 函数声明 -------------------------------------
*/


/*------------------------------ 外部函数 -------------------------------------
外部函数供其它实体文件引用，必须仔细检查传入参数的合法性.
*/
int atimer_init(void)
{
#if 0
	MCF_ENET_ATCR(ATIMER_CHANNEL) = FEC_T_CTRL_RESTART;
	MCF_ENET_ATINC(ATIMER_CHANNEL) = 8;
	MCF_ENET_ATPER(ATIMER_CHANNEL) = FEC_T_PERIOD_ONE_SEC;
	MCF_ENET_ATCOR(ATIMER_CHANNEL) = 0;
	MCF_ENET_ATCR(ATIMER_CHANNEL) = 0x80 | FEC_T_CTRL_PERIOD_RST | FEC_T_CTRL_ENABLE;
#endif
	return 0;
}

#if 0
void atimer_set_atvr(uint32_t ns)
{
	//MCF_ENET_ATVR(ATIMER_CHANNEL)
= ns;
}
#endif
#if 0
int atimer_get(struct timespec *p_ts)
{
	uint32_t  flags;
	uint32_t ins = 0;
	long tv_sec,tv_nsec;
	
	//检查参数
	if(p_ts == 0)
		return -1;
	
	//关中断
	rt_irq_save(flags);

	MCF_ENET_ATCR(ATIMER_CHANNEL) = FEC_T_CTRL_CAPTURE;
	
	//得到当前时间
	tv_sec = g_sys_time.tv_sec;
	intevent = hwp->fec_ievent;
	if (intevent & FEC_ENET_TS_TIMER)
	{
		ins = 1;
		MCF_ENET_ATCR(ATIMER_CHANNEL) = FEC_T_CTRL_CAPTURE;
	}

	tv_nsec = MCF_ENET_ATVR(ATIMER_CHANNEL);
	
	//恢复中断级别
	rt_irq_restore(flags);

	// 修正增量
	p_ts->tv_nsec += ins*1000;
	if(p_ts->tv_nsec >= 1000000000)
	{
	    p_ts->tv_sec  += 1;
	    p_ts->tv_nsec -= 1000000000;
	}
	
	return 0;
}
#endif

extern unsigned int g_keep_alive_gps;
int atimer_stat(void)
{
#if 0
	MCF_ENET_ATCR(ATIMER_CHANNEL) = FEC_T_CTRL_CAPTURE;

	rt_printf("  ATCR:%08X\r\n",MCF_ENET_ATCR(ATIMER_CHANNEL));
	rt_printf("  ATVR:%08X\r\n",MCF_ENET_ATVR(ATIMER_CHANNEL));
	rt_printf(" ATOFF:%08X\r\n",MCF_ENET_ATOFF(ATIMER_CHANNEL));
	rt_printf(" ATPER:%08X\r\n",MCF_ENET_ATPER(ATIMER_CHANNEL));
	rt_printf(" ATCOR:%08X\r\n",MCF_ENET_ATCOR(ATIMER_CHANNEL));
	rt_printf(" ATINC:%08X\r\n",MCF_ENET_ATINC(ATIMER_CHANNEL));
	rt_printf("ATSTMP:%08X\r\n",MCF_ENET_ATSTMP(ATIMER_CHANNEL));

	rt_printf("g_keep_alive_gps=%d.\r\n", g_keep_alive_gps);
#endif
	return 0;
}


int atimer_stat_reset(void)
{
	return 0;
}

/*------------------------------ 内部函数 -------------------------------------
内部函数以下划线‘_’开头，不需要检查参数的合法性.
*/


/*------------------------------ 测试函数 -------------------------------------
一个实体文件必须带一个本模块的测试函数来进行单元测试，如果的确不方便在本模块中
进行单元测试，必须在此注明实际的测试位置（例如在哪个实体文件中使用哪个测试函数）.
*/


/*------------------------------ 文件结束 -------------------------------------
*/



