gps_1588.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: gps_1588.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2013-02-28
  7. 功能说明: gps和1588合并对时模块。
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "bsp.h"
  14. #include "rt.h"
  15. /*------------------------------- 宏定义 --------------------------------------
  16. */
  17. #define ATIMER_CHANNEL 0
  18. /* FEC 1588 register bits */
  19. #define FEC_T_CTRL_CAPTURE 0x00000800
  20. #define FEC_T_CTRL_RESTART 0x00000200
  21. #define FEC_T_CTRL_PERIOD_RST 0x00000030
  22. #define FEC_T_CTRL_ENABLE 0x00000001
  23. #define FEC_T_INC_MASK 0x0000007f
  24. #define FEC_T_INC_OFFSET 0
  25. #define FEC_T_INC_40MHZ 25
  26. #define FEC_T_PERIOD_ONE_SEC 0x3B9ACA00
  27. /*------------------------------ 类型结构 -------------------------------------
  28. */
  29. /*------------------------------ 全局变量 -------------------------------------
  30. */
  31. /*------------------------------ 函数声明 -------------------------------------
  32. */
  33. /*------------------------------ 外部函数 -------------------------------------
  34. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  35. */
  36. int atimer_init(void)
  37. {
  38. #if 0
  39. MCF_ENET_ATCR(ATIMER_CHANNEL) = FEC_T_CTRL_RESTART;
  40. MCF_ENET_ATINC(ATIMER_CHANNEL) = 8;
  41. MCF_ENET_ATPER(ATIMER_CHANNEL) = FEC_T_PERIOD_ONE_SEC;
  42. MCF_ENET_ATCOR(ATIMER_CHANNEL) = 0;
  43. MCF_ENET_ATCR(ATIMER_CHANNEL) = 0x80 | FEC_T_CTRL_PERIOD_RST | FEC_T_CTRL_ENABLE;
  44. #endif
  45. return 0;
  46. }
  47. #if 0
  48. void atimer_set_atvr(uint32_t ns)
  49. {
  50. //MCF_ENET_ATVR(ATIMER_CHANNEL)
  51. = ns;
  52. }
  53. #endif
  54. #if 0
  55. int atimer_get(struct timespec *p_ts)
  56. {
  57. uint32_t flags;
  58. uint32_t ins = 0;
  59. long tv_sec,tv_nsec;
  60. //检查参数
  61. if(p_ts == 0)
  62. return -1;
  63. //关中断
  64. rt_irq_save(flags);
  65. MCF_ENET_ATCR(ATIMER_CHANNEL) = FEC_T_CTRL_CAPTURE;
  66. //得到当前时间
  67. tv_sec = g_sys_time.tv_sec;
  68. intevent = hwp->fec_ievent;
  69. if (intevent & FEC_ENET_TS_TIMER)
  70. {
  71. ins = 1;
  72. MCF_ENET_ATCR(ATIMER_CHANNEL) = FEC_T_CTRL_CAPTURE;
  73. }
  74. tv_nsec = MCF_ENET_ATVR(ATIMER_CHANNEL);
  75. //恢复中断级别
  76. rt_irq_restore(flags);
  77. // 修正增量
  78. p_ts->tv_nsec += ins*1000;
  79. if(p_ts->tv_nsec >= 1000000000)
  80. {
  81. p_ts->tv_sec += 1;
  82. p_ts->tv_nsec -= 1000000000;
  83. }
  84. return 0;
  85. }
  86. #endif
  87. extern unsigned int g_keep_alive_gps;
  88. int atimer_stat(void)
  89. {
  90. #if 0
  91. MCF_ENET_ATCR(ATIMER_CHANNEL) = FEC_T_CTRL_CAPTURE;
  92. rt_printf(" ATCR:%08X\r\n",MCF_ENET_ATCR(ATIMER_CHANNEL));
  93. rt_printf(" ATVR:%08X\r\n",MCF_ENET_ATVR(ATIMER_CHANNEL));
  94. rt_printf(" ATOFF:%08X\r\n",MCF_ENET_ATOFF(ATIMER_CHANNEL));
  95. rt_printf(" ATPER:%08X\r\n",MCF_ENET_ATPER(ATIMER_CHANNEL));
  96. rt_printf(" ATCOR:%08X\r\n",MCF_ENET_ATCOR(ATIMER_CHANNEL));
  97. rt_printf(" ATINC:%08X\r\n",MCF_ENET_ATINC(ATIMER_CHANNEL));
  98. rt_printf("ATSTMP:%08X\r\n",MCF_ENET_ATSTMP(ATIMER_CHANNEL));
  99. rt_printf("g_keep_alive_gps=%d.\r\n", g_keep_alive_gps);
  100. #endif
  101. return 0;
  102. }
  103. int atimer_stat_reset(void)
  104. {
  105. return 0;
  106. }
  107. /*------------------------------ 内部函数 -------------------------------------
  108. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  109. */
  110. /*------------------------------ 测试函数 -------------------------------------
  111. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  112. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  113. */
  114. /*------------------------------ 文件结束 -------------------------------------
  115. */