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