/****************************************************************************** 版权所有: 文件名称: 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; } /*------------------------------ 内部函数 ------------------------------------- 内部函数以下划线‘_’开头,不需要检查参数的合法性. */ /*------------------------------ 测试函数 ------------------------------------- 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数). */ /*------------------------------ 文件结束 ------------------------------------- */