rtc.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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 <rtthread.h>
  15. #include <time.h>
  16. #include <s3c24x0.h>
  17. #include "rtc.h"
  18. /**
  19. * This function get rtc time
  20. */
  21. void rt_hw_rtc_get(struct rtc_time *ti)
  22. {
  23. rt_uint8_t sec, min, hour, mday, wday, mon, year;
  24. /* enable access to RTC registers */
  25. RTC_ENABLE();
  26. /* read RTC registers */
  27. do
  28. {
  29. sec = BCDSEC;
  30. min = BCDMIN;
  31. hour = BCDHOUR;
  32. mday = BCDDATE;
  33. wday = BCDDAY;
  34. mon = BCDMON;
  35. year = BCDYEAR;
  36. } while (sec != BCDSEC);
  37. /* disable access to RTC registers */
  38. RTC_DISABLE();
  39. ti->tm_sec = BCD2BIN(sec & 0x7F);
  40. ti->tm_min = BCD2BIN(min & 0x7F);
  41. ti->tm_hour = BCD2BIN(hour & 0x3F);
  42. ti->tm_mday = BCD2BIN(mday & 0x3F);
  43. ti->tm_mon = BCD2BIN(mon & 0x1F);
  44. ti->tm_year = BCD2BIN(year);
  45. ti->tm_wday = BCD2BIN(wday & 0x07);
  46. ti->tm_yday = 0;
  47. ti->tm_isdst = 0;
  48. }
  49. /**
  50. * This function set rtc time
  51. */
  52. void rt_hw_rtc_set(struct rtc_time *ti)
  53. {
  54. rt_uint8_t sec, min, hour, mday, wday, mon, year;
  55. year = BIN2BCD(ti->tm_year);
  56. mon = BIN2BCD(ti->tm_mon);
  57. wday = BIN2BCD(ti->tm_wday);
  58. mday = BIN2BCD(ti->tm_mday);
  59. hour = BIN2BCD(ti->tm_hour);
  60. min = BIN2BCD(ti->tm_min);
  61. sec = BIN2BCD(ti->tm_sec);
  62. /* enable access to RTC registers */
  63. RTC_ENABLE();
  64. /* write RTC registers */
  65. BCDSEC = sec;
  66. BCDMIN = min;
  67. BCDHOUR = hour;
  68. BCDDATE = mday;
  69. BCDDAY = wday;
  70. BCDMON = mon;
  71. BCDYEAR = year;
  72. /* disable access to RTC registers */
  73. RTC_DISABLE();
  74. }
  75. /**
  76. * This function reset rtc
  77. */
  78. void rt_hw_rtc_reset (void)
  79. {
  80. RTCCON = (RTCCON & ~0x06) | 0x08;
  81. RTCCON &= ~(0x08|0x01);
  82. }
  83. static struct rt_device rtc;
  84. static rt_err_t rt_rtc_open(rt_device_t dev, rt_uint16_t oflag)
  85. {
  86. RTC_ENABLE();
  87. return RT_EOK;
  88. }
  89. static rt_err_t rt_rtc_close(rt_device_t dev)
  90. {
  91. RTC_DISABLE();
  92. return RT_EOK;
  93. }
  94. static rt_size_t rt_rtc_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  95. {
  96. return RT_EOK;
  97. }
  98. static rt_err_t rt_rtc_control(rt_device_t dev, rt_uint8_t cmd, void *args)
  99. {
  100. struct rtc_time* time;
  101. RT_ASSERT(dev != RT_NULL);
  102. time = (struct rtc_time*)args;
  103. switch (cmd)
  104. {
  105. case RT_DEVICE_CTRL_RTC_GET_TIME:
  106. /* read device */
  107. rt_hw_rtc_get(time);
  108. break;
  109. case RT_DEVICE_CTRL_RTC_SET_TIME:
  110. /* write device */
  111. rt_hw_rtc_set(time);
  112. break;
  113. }
  114. return RT_EOK;
  115. }
  116. void rt_hw_rtc_init(void)
  117. {
  118. rtc.type = RT_Device_Class_RTC;
  119. /* register rtc device */
  120. rtc.init = RT_NULL;
  121. rtc.open = rt_rtc_open;
  122. rtc.close = rt_rtc_close;
  123. rtc.read = rt_rtc_read;
  124. rtc.write = RT_NULL;
  125. rtc.control = rt_rtc_control;
  126. /* no private */
  127. rtc.private = RT_NULL;
  128. rt_device_register(&rtc, "rtc", RT_DEVICE_FLAG_RDWR);
  129. }
  130. time_t time(time_t* t)
  131. {
  132. rt_device_t device;
  133. struct tm ti;
  134. time_t time;
  135. device = rt_device_find("rtc");
  136. if (device != RT_NULL)
  137. {
  138. rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &ti);
  139. if (t != RT_NULL)
  140. {
  141. time = mktime(&ti);
  142. *t = time;
  143. }
  144. }
  145. return time;
  146. }
  147. #ifdef RT_USING_FINSH
  148. #include <finsh.h>
  149. void set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
  150. {
  151. struct rtc_time ti;
  152. rt_device_t device;
  153. device = rt_device_find("rtc");
  154. if (device != RT_NULL)
  155. {
  156. rt_rtc_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &ti);
  157. ti.tm_year = year - 1900;
  158. ti.tm_mon = month - 1;
  159. ti.tm_mday = day;
  160. rt_rtc_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &ti);
  161. }
  162. }
  163. FINSH_FUNCTION_EXPORT(set_date, set date(year, month, day))
  164. void set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)
  165. {
  166. struct rtc_time ti;
  167. rt_device_t device;
  168. device = rt_device_find("rtc");
  169. if (device != RT_NULL)
  170. {
  171. rt_rtc_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &ti);
  172. ti.tm_hour = hour;
  173. ti.tm_min = minute;
  174. ti.tm_sec = second;
  175. rt_rtc_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &ti);
  176. }
  177. }
  178. FINSH_FUNCTION_EXPORT(set_time, set time(hour, minute, second))
  179. void list_date(void)
  180. {
  181. time_t now;
  182. time(&now);
  183. rt_kprintf("%s\n", ctime(&now));
  184. }
  185. FINSH_FUNCTION_EXPORT(list_date, list date)
  186. #endif