drv_rtc.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /*
  2. * Copyright (c) 2021-2023 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-09-19 HPMicro First version
  9. * 2023-05-08 HPMicro Adapt RT-Thread V5.0.0
  10. */
  11. #include "board.h"
  12. #include "drv_rtc.h"
  13. #include "hpm_rtc_drv.h"
  14. #include <rtthread.h>
  15. #include <rtdevice.h>
  16. #include <rtdbg.h>
  17. #ifdef RT_USING_RTC
  18. /*******************************************************************************************
  19. *
  20. * Prototypes
  21. *
  22. ******************************************************************************************/
  23. static rt_err_t hpm_rtc_init(rt_device_t dev);
  24. static rt_err_t hpm_rtc_open(rt_device_t dev, rt_uint16_t oflag);
  25. static rt_err_t hpm_rtc_close(rt_device_t dev);
  26. static rt_ssize_t hpm_rtc_read(rt_device_t dev, rt_off_t pos, void *buf, rt_size_t size);
  27. static rt_ssize_t hpm_rtc_write(rt_device_t dev, rt_off_t pos, const void *buf, rt_size_t size);
  28. static rt_err_t hpm_rtc_control(rt_device_t dev, int cmd, void *args);
  29. static time_t hpm_rtc_get_timestamp(void);
  30. static int hpm_rtc_set_timestamp(time_t timestamp);
  31. /*******************************************************************************************
  32. *
  33. * Variables
  34. *
  35. ******************************************************************************************/
  36. #ifdef RT_USING_DEVICE_OPS
  37. const struct rt_device_ops hpm_rtc_ops = {
  38. .init = hpm_rtc_init,
  39. .open = hpm_rtc_open,
  40. .close = hpm_rtc_close,
  41. .read = hpm_rtc_read,
  42. .write = hpm_rtc_write,
  43. .control = hpm_rtc_control,
  44. };
  45. #endif
  46. static struct rt_device hpm_rtc= {
  47. .type = RT_Device_Class_RTC,
  48. #ifdef RT_USING_DEVICE_OPS
  49. .ops = &hpm_rtc_ops,
  50. #else
  51. .init = hpm_rtc_init,
  52. .open = hpm_rtc_open,
  53. .close = hpm_rtc_close,
  54. .read = hpm_rtc_read,
  55. .write = hpm_rtc_write,
  56. .control = hpm_rtc_control,
  57. #endif
  58. };
  59. /*******************************************************************************************
  60. *
  61. * Codes
  62. *
  63. ******************************************************************************************/
  64. static rt_err_t hpm_rtc_init(rt_device_t dev)
  65. {
  66. return RT_EOK;
  67. }
  68. static rt_err_t hpm_rtc_open(rt_device_t dev, rt_uint16_t oflag)
  69. {
  70. return RT_EOK;
  71. }
  72. static rt_err_t hpm_rtc_close(rt_device_t dev)
  73. {
  74. return RT_EOK;
  75. }
  76. static rt_ssize_t hpm_rtc_read(rt_device_t dev, rt_off_t pos, void *buf, rt_size_t size)
  77. {
  78. return 0;
  79. }
  80. static rt_ssize_t hpm_rtc_write(rt_device_t dev, rt_off_t pos, const void *buf, rt_size_t size)
  81. {
  82. return 0;
  83. }
  84. static rt_err_t hpm_rtc_control(rt_device_t dev, int cmd, void *args)
  85. {
  86. RT_ASSERT(dev != RT_NULL);
  87. rt_err_t err = RT_EOK;
  88. switch(cmd) {
  89. case RT_DEVICE_CTRL_RTC_GET_TIME:
  90. *(uint32_t *)args = hpm_rtc_get_timestamp();
  91. break;
  92. case RT_DEVICE_CTRL_RTC_SET_TIME:
  93. hpm_rtc_set_timestamp(*(time_t *)args);
  94. break;
  95. default:
  96. err = RT_EINVAL;
  97. break;
  98. }
  99. return err;
  100. }
  101. static time_t hpm_rtc_get_timestamp(void)
  102. {
  103. time_t time = rtc_get_time(HPM_RTC);
  104. return time;
  105. }
  106. static int hpm_rtc_set_timestamp(time_t timestamp)
  107. {
  108. (void)rtc_config_time(HPM_RTC, timestamp);
  109. return RT_EOK;
  110. }
  111. int rt_hw_rtc_init(void)
  112. {
  113. rt_err_t err = RT_EOK;
  114. err = rt_device_register(&hpm_rtc, "rtc", RT_DEVICE_FLAG_RDWR);
  115. if (err != RT_EOK) {
  116. LOG_E("rt device %s failed, status=%d\n", "rtc", err);
  117. return err;
  118. }
  119. rt_device_open(&hpm_rtc, RT_DEVICE_FLAG_RDWR);
  120. return RT_EOK;
  121. }
  122. INIT_DEVICE_EXPORT(rt_hw_rtc_init);
  123. #endif /* RT_USING_RTC */