rtc.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * File : rtc.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://openlab.rt-thread.com/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2009-04-26 yi.qiu first version
  13. */
  14. #include "rtc.h"
  15. /**
  16. * This function access to rtc
  17. */
  18. rt_inline void rt_hw_rtc_access(int a)
  19. {
  20. switch (a)
  21. {
  22. case RTC_ENABLE:
  23. RTCCON |= 0x01;
  24. break;
  25. case RTC_DISABLE:
  26. RTCCON &= ~0x01;
  27. break;
  28. }
  29. }
  30. rt_inline rt_uint32_t BCD2BIN(rt_uint8_t n)
  31. {
  32. return ((((n >> 4) & 0x0F) * 10) + (n & 0x0F));
  33. }
  34. rt_inline rt_uint8_t BIN2BCD(rt_uint32_t n)
  35. {
  36. return (((n / 10) << 4) | (n % 10));
  37. }
  38. /**
  39. * This function get rtc time
  40. */
  41. void rt_hw_rtc_get (struct rtc_time *tmp)
  42. {
  43. rt_uint8_t sec, min, hour, mday, wday, mon, year;
  44. rt_uint8_t a_sec,a_min, a_hour, a_date, a_mon, a_year, a_armed;
  45. /* enable access to RTC registers */
  46. rt_hw_rtc_access(RTC_ENABLE);
  47. /* read RTC registers */
  48. do
  49. {
  50. sec = BCDSEC;
  51. min = BCDMIN;
  52. hour = BCDHOUR;
  53. mday = BCDDATE;
  54. wday = BCDDAY;
  55. mon = BCDMON;
  56. year = BCDYEAR;
  57. } while (sec != BCDSEC);
  58. /* read ALARM registers */
  59. a_sec = ALMSEC;
  60. a_min = ALMMIN;
  61. a_hour = ALMHOUR;
  62. a_date = ALMDATE;
  63. a_mon = ALMMON;
  64. a_year = ALMYEAR;
  65. a_armed = RTCALM;
  66. /* disable access to RTC registers */
  67. rt_hw_rtc_access(RTC_DISABLE);
  68. #ifdef RTC_DEBUG
  69. rt_kprintf ( "Get RTC year: %02x mon/cent: %02x mday: %02x wday: %02x "
  70. "hr: %02x min: %02x sec: %02x\n",
  71. year, mon, mday, wday,
  72. hour, min, sec);
  73. rt_kprintf ( "Alarms: %02x: year: %02x month: %02x date: %02x hour: %02x min: %02x sec: %02x\n",
  74. a_armed,
  75. a_year, a_mon, a_date,
  76. a_hour, a_min, a_sec);
  77. #endif
  78. tmp->tm_sec = BCD2BIN(sec & 0x7F);
  79. tmp->tm_min = BCD2BIN(min & 0x7F);
  80. tmp->tm_hour = BCD2BIN(hour & 0x3F);
  81. tmp->tm_mday = BCD2BIN(mday & 0x3F);
  82. tmp->tm_mon = BCD2BIN(mon & 0x1F);
  83. tmp->tm_year = BCD2BIN(year);
  84. tmp->tm_wday = BCD2BIN(wday & 0x07);
  85. if(tmp->tm_year < 70) tmp->tm_year += 2000;
  86. else tmp->tm_year += 1900;
  87. tmp->tm_yday = 0;
  88. tmp->tm_isdst = 0;
  89. #ifdef RTC_DEBUG
  90. rt_kprintf ( "Get DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
  91. tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
  92. tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
  93. #endif
  94. }
  95. /**
  96. * This function set rtc time
  97. */
  98. void rt_hw_rtc_set (struct rtc_time *tmp)
  99. {
  100. rt_uint8_t sec, min, hour, mday, wday, mon, year;
  101. #ifdef RTC_DEBUG
  102. rt_kprintf ( "Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
  103. tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
  104. tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
  105. #endif
  106. year = BIN2BCD(tmp->tm_year % 100);
  107. mon = BIN2BCD(tmp->tm_mon);
  108. wday = BIN2BCD(tmp->tm_wday);
  109. mday = BIN2BCD(tmp->tm_mday);
  110. hour = BIN2BCD(tmp->tm_hour);
  111. min = BIN2BCD(tmp->tm_min);
  112. sec = BIN2BCD(tmp->tm_sec);
  113. /* enable access to RTC registers */
  114. rt_hw_rtc_access(RTC_ENABLE);
  115. /* write RTC registers */
  116. BCDSEC = sec;
  117. BCDMIN = min;
  118. BCDHOUR = hour;
  119. BCDDATE = mday;
  120. BCDDAY = wday;
  121. BCDMON = mon;
  122. BCDYEAR = year;
  123. /* disable access to RTC registers */
  124. rt_hw_rtc_access(RTC_DISABLE);
  125. }
  126. /**
  127. * This function reset rtc
  128. */
  129. void rt_hw_rtc_reset (void)
  130. {
  131. RTCCON = (RTCCON & ~0x06) | 0x08;
  132. RTCCON &= ~(0x08|0x01);
  133. }