rtc.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*!
  2. * Copyright (C) Fraunhofer-Institut for Photonic Microsystems (IPMS)
  3. * Maria-Reiche-Str. 2
  4. * 01109 Dresden
  5. *
  6. * Unauthorized copying of this file, via any medium is strictly prohibited
  7. * Proprietary and confidential
  8. *
  9. * \file rtc.c
  10. * \author zimmerli
  11. * \date 2020-01-15
  12. * \brief Real-Time-Clock generic driver
  13. *
  14. */
  15. #include "rtc.h"
  16. #include <kernel/base/kernel.h>
  17. /* FreeRTOS includes. */
  18. #include "FreeRTOS.h"
  19. #include "semphr.h"
  20. // ----------------------------------------------------------------
  21. static uint32_t _rtc_dev_cnt = 0;
  22. struct rtc_s *default_rtc = NULL;
  23. // ----------------------------------------------------------------
  24. /**
  25. * \brief Allocate and register RTC device driver
  26. *
  27. * @return pointer to RTC device driver structure, NULL on error
  28. */
  29. struct rtc_s *rtc_register(void)
  30. {
  31. struct rtc_s *p;
  32. // alloc struct
  33. p = (struct rtc_s *)kallocz(sizeof(struct rtc_s));
  34. if (!p)
  35. return NULL;
  36. //set first rtc as default
  37. if (!default_rtc && _rtc_dev_cnt == 0)
  38. default_rtc = p;
  39. // fill fields
  40. p->id = _rtc_dev_cnt;
  41. _rtc_dev_cnt++;
  42. return p;
  43. }
  44. struct rtc_s *rtc_default(void)
  45. {
  46. return default_rtc;
  47. }
  48. /**
  49. * \brief Get time of local clock
  50. *
  51. * @param rtc pointer to device driver
  52. * @param localtime pointer to timespec, result
  53. */
  54. void rtc_get_local_time64(struct rtc_s *rtc, struct timespec64 *localtime)
  55. {
  56. if (!rtc || !rtc->getLocalTime64)
  57. return;
  58. rtc->getLocalTime64(rtc, localtime);
  59. }
  60. /**
  61. * \brief Get RTC offset
  62. *
  63. * @param rtc pointer to device driver
  64. * @param offset pointer to timespec, resulting offset
  65. */
  66. void rtc_get_rtc_offset(struct rtc_s *rtc, struct timespec64 *offset)
  67. {
  68. if (!rtc || !rtc->getRtcOffset)
  69. return;
  70. rtc->getRtcOffset(rtc, offset);
  71. }
  72. /**
  73. * \brief Set RTC offset
  74. *
  75. * @param rtc pointer to device driver
  76. * @param offset pointer to timespec, offset to be set
  77. */
  78. void rtc_set_rtc_offset(struct rtc_s *rtc, struct timespec64 *offset)
  79. {
  80. if (!rtc || !rtc->setRtcOffset)
  81. return;
  82. rtc->setRtcOffset(rtc, offset);
  83. }
  84. /**
  85. * \brief Fine adjust nominal frequency of RTC.
  86. *
  87. * @param rtc pointer to device driver
  88. * @param ppb frequency adjustment in parts-per-billion
  89. */
  90. void rtc_adjfine(struct rtc_s *rtc, int64_t ppb)
  91. {
  92. if (!rtc || !rtc->adjFine)
  93. return;
  94. rtc->adjFine(rtc, ppb);
  95. }