drv_rtc.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. * Copyright (c) 2021 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. */
  10. #include "board.h"
  11. #include "drv_rtc.h"
  12. #include "hpm_rtc_drv.h"
  13. #include <rtthread.h>
  14. #include <rtdevice.h>
  15. #include <rtdbg.h>
  16. #ifdef RT_USING_RTC
  17. /*******************************************************************************************
  18. *
  19. * Prototypes
  20. *
  21. ******************************************************************************************/
  22. static rt_err_t hpm_rtc_init(rt_device_t dev);
  23. static rt_err_t hpm_rtc_open(rt_device_t dev, rt_uint16_t oflag);
  24. static rt_err_t hpm_rtc_close(rt_device_t dev);
  25. static rt_size_t hpm_rtc_read(rt_device_t dev, rt_off_t pos, void *buf, rt_size_t size);
  26. static rt_size_t hpm_rtc_write(rt_device_t dev, rt_off_t pos, const void *buf, rt_size_t size);
  27. static rt_err_t hpm_rtc_control(rt_device_t dev, int cmd, void *args);
  28. static time_t hpm_rtc_get_timestamp(void);
  29. static int hpm_rtc_set_timestamp(time_t timestamp);
  30. /*******************************************************************************************
  31. *
  32. * Variables
  33. *
  34. ******************************************************************************************/
  35. static struct rt_device hpm_rtc= {
  36. .type = RT_Device_Class_RTC,
  37. .init = hpm_rtc_init,
  38. .open = hpm_rtc_open,
  39. .close = hpm_rtc_close,
  40. .read = hpm_rtc_read,
  41. .write = hpm_rtc_write,
  42. .control = hpm_rtc_control,
  43. };
  44. /*******************************************************************************************
  45. *
  46. * Codes
  47. *
  48. ******************************************************************************************/
  49. static rt_err_t hpm_rtc_init(rt_device_t dev)
  50. {
  51. return RT_EOK;
  52. }
  53. static rt_err_t hpm_rtc_open(rt_device_t dev, rt_uint16_t oflag)
  54. {
  55. return RT_EOK;
  56. }
  57. static rt_err_t hpm_rtc_close(rt_device_t dev)
  58. {
  59. return RT_EOK;
  60. }
  61. static rt_size_t hpm_rtc_read(rt_device_t dev, rt_off_t pos, void *buf, rt_size_t size)
  62. {
  63. return 0;
  64. }
  65. static rt_size_t hpm_rtc_write(rt_device_t dev, rt_off_t pos, const void *buf, rt_size_t size)
  66. {
  67. return 0;
  68. }
  69. static rt_err_t hpm_rtc_control(rt_device_t dev, int cmd, void *args)
  70. {
  71. RT_ASSERT(dev != RT_NULL);
  72. rt_err_t err = RT_EOK;
  73. switch(cmd) {
  74. case RT_DEVICE_CTRL_RTC_GET_TIME:
  75. *(uint32_t *)args = hpm_rtc_get_timestamp();
  76. break;
  77. case RT_DEVICE_CTRL_RTC_SET_TIME:
  78. hpm_rtc_set_timestamp(*(time_t *)args);
  79. break;
  80. default:
  81. err = RT_EINVAL;
  82. break;
  83. }
  84. return err;
  85. }
  86. static time_t hpm_rtc_get_timestamp(void)
  87. {
  88. time_t time = rtc_get_time(HPM_RTC);
  89. return time;
  90. }
  91. static int hpm_rtc_set_timestamp(time_t timestamp)
  92. {
  93. (void)rtc_config_time(HPM_RTC, timestamp);
  94. return RT_EOK;
  95. }
  96. int rt_hw_rtc_init(void)
  97. {
  98. rt_err_t err = RT_EOK;
  99. err = rt_device_register(&hpm_rtc, "rtc", RT_DEVICE_FLAG_RDWR);
  100. if (err != RT_EOK) {
  101. LOG_E("rt device %s failed, status=%d\n", "rtc", err);
  102. return err;
  103. }
  104. rt_device_open(&hpm_rtc, RT_DEVICE_FLAG_RDWR);
  105. return RT_EOK;
  106. }
  107. INIT_DEVICE_EXPORT(rt_hw_rtc_init);
  108. #endif /* RT_USING_RTC */