test_rtc.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /*
  2. * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-12-30 CDT first version
  9. */
  10. /*
  11. * 程序清单:这是 RTC 设备使用例程和 Alarm 使用示例。
  12. * 例程导出了 rtc_sample 命令到控制终端。
  13. * 命令调用格式:rtc_sample x
  14. * 命令解释:命令第二个参数是要使用的功能对应的编号,
  15. * RTC 基本功能对应的编号为 0~3,Alarm 功能对应的编号为 4~9
  16. */
  17. #include <rtthread.h>
  18. #include <rtdevice.h>
  19. #include <board.h>
  20. #include "rtconfig.h"
  21. #include "rtdef.h"
  22. // #include "alarm.h"
  23. #if defined(BSP_USING_RTC)
  24. /* macros define */
  25. #define SAMPLE_RTC_NAME "rtc"
  26. /* variables define */
  27. static rt_device_t rtc_dev;
  28. #if defined(RT_USING_ALARM)
  29. extern void rt_alarm_dump(void);
  30. static rt_uint16_t callback_counter, alarm_idx = 0;
  31. static struct rt_alarm *ptr_alarm = RT_NULL;
  32. static struct rt_alarm_setup alarm_setup;
  33. #endif /* RT_USING_ALARM */
  34. /* command type */
  35. enum RTC_CMD
  36. {
  37. CMD_OPEN_RTC = 0x00,
  38. CMD_SET_TIME = 0x01,
  39. CMD_SET_DATE = 0x02,
  40. CMD_GET_DATE_TIME,
  41. #if defined(RT_USING_ALARM)
  42. CMD_SET_ALARM,
  43. CMD_SET_START_ALARM,
  44. CMD_STOP_ALARM,
  45. CMD_CTRL_ALARM,
  46. CMD_DUMP_ALARM,
  47. CMD_DEL_ALARM,
  48. };
  49. void alarm_callback_fun(rt_alarm_t alarm, time_t timestamp)
  50. {
  51. rt_kprintf("\nuser alarm %d callback function.\n", alarm_idx);
  52. if ((0 == (--callback_counter)) && (alarm_idx))
  53. {
  54. rt_kprintf("stop alarm %d \n", alarm_idx);
  55. if (RT_EOK != rt_alarm_stop(alarm))
  56. {
  57. rt_kprintf("failed to stop alarm\n");
  58. }
  59. /* enter callback 2 times */
  60. callback_counter = 2;
  61. --alarm_idx;
  62. }
  63. }
  64. #else
  65. };
  66. #endif /* RT_USING_ALARM */
  67. static int rtc_sample(int argc, char *argv[])
  68. {
  69. rt_uint8_t idx;
  70. rt_uint16_t temp1, temp2, temp3;
  71. time_t now;
  72. #if defined(RT_USING_ALARM)
  73. struct tm p_tm;
  74. #endif
  75. if (argc < 2)
  76. {
  77. rt_kprintf("unkown rtc command, rtc [usage] as the following: \n");
  78. rt_kprintf("\'0\': find and open rtc \n");
  79. rt_kprintf("\'1 xx:xx:xx\': set time with \n");
  80. rt_kprintf("\'2 xxxx-xx-xx\': set date with \n");
  81. rt_kprintf("\'3\': get time and date \n");
  82. #if defined(RT_USING_ALARM)
  83. rt_kprintf("\'4\': set current time + 10s as alarm \n");
  84. rt_kprintf("\'5\': start alarm \n");
  85. rt_kprintf("\'6\': stop alarm \n");
  86. rt_kprintf("cmd-7 based on cmd-4\n");
  87. rt_kprintf("\'7\' o: oneshot,\n\'7\' s: second,\n\'7\' m: minute \n");
  88. rt_kprintf("\'8\': dump all alarm \n");
  89. rt_kprintf("\'9\': delete all alarm \n");
  90. #endif /* RT_USING_ALARM */
  91. return -RT_ERROR;
  92. }
  93. idx = *(argv[1]) - '0';
  94. switch (idx)
  95. {
  96. case CMD_OPEN_RTC:
  97. /* find and open device with standard interface */
  98. rtc_dev = rt_device_find(SAMPLE_RTC_NAME);
  99. if (!rtc_dev)
  100. {
  101. rt_kprintf("find %s failed\n", SAMPLE_RTC_NAME);
  102. return -RT_ERROR;
  103. }
  104. if (RT_EOK != rt_device_open(rtc_dev, RT_NULL))
  105. {
  106. rt_kprintf("failed to open %s\n", SAMPLE_RTC_NAME);
  107. return -RT_ERROR;
  108. }
  109. rt_kprintf("rtc opened\n");
  110. break;
  111. case CMD_SET_TIME:
  112. /* set time with xx:xx:xx format characters */
  113. if (argc < 3)
  114. {
  115. rt_kprintf("unsurpported command\n");
  116. return -RT_ERROR;
  117. }
  118. temp1 = ((argv[2][0] - '0') * 10) + \
  119. (argv[2][1] - '0');
  120. temp2 = ((argv[2][3] - '0') * 10) + \
  121. (argv[2][4] - '0');
  122. temp3 = ((argv[2][6] - '0') * 10) + \
  123. (argv[2][7] - '0');
  124. if (RT_EOK != set_time(temp1, temp2, temp3))
  125. {
  126. rt_kprintf("set RTC time failed\n");
  127. return -RT_ERROR;
  128. }
  129. rt_kprintf("\nset RTC time as %2d:%2d:%2d\n", temp1, temp2, temp3);
  130. break;
  131. case CMD_SET_DATE:
  132. /* set data xxxx-xx-xx format characters */
  133. temp1 = ((argv[2][0] - '0') * 1000) + \
  134. ((argv[2][1] - '0') * 100) + \
  135. ((argv[2][2] - '0') * 10) + \
  136. (argv[2][3] - '0');
  137. temp2 = ((argv[2][5] - '0') * 10) + \
  138. (argv[2][6] - '0');
  139. temp3 = ((argv[2][8] - '0') * 10) + \
  140. (argv[2][9] - '0');
  141. if (RT_EOK != set_date(temp1, temp2, temp3))
  142. {
  143. rt_kprintf("failed to set date for %s\n", SAMPLE_RTC_NAME);
  144. return -RT_ERROR;
  145. }
  146. rt_kprintf("\nset RTC date as %4d-%2d-%2d\n", temp1, temp2, temp3);
  147. break;
  148. case CMD_GET_DATE_TIME:
  149. /* get current time and print it */
  150. now = time(NULL);
  151. rt_kprintf("GMT time is: %s\n", ctime(&now));
  152. break;
  153. #if defined(RT_USING_ALARM)
  154. case CMD_SET_ALARM:
  155. /* get current time (uint: second) from 1970-01-01 */
  156. now = time(NULL);
  157. rt_kprintf("GMT time is: \n%s\n", ctime(&now));
  158. now += 60;
  159. gmtime_r(&now, &p_tm);
  160. // localtime_r(&now, &p_tm);
  161. alarm_setup.flag = RT_ALARM_MINUTE;
  162. alarm_setup.wktime.tm_year = p_tm.tm_year;
  163. alarm_setup.wktime.tm_mon = p_tm.tm_mon;
  164. alarm_setup.wktime.tm_mday = p_tm.tm_mday;
  165. alarm_setup.wktime.tm_yday = p_tm.tm_yday;
  166. alarm_setup.wktime.tm_wday = p_tm.tm_wday;
  167. alarm_setup.wktime.tm_hour = p_tm.tm_hour;
  168. alarm_setup.wktime.tm_min = p_tm.tm_min;
  169. alarm_setup.wktime.tm_sec = p_tm.tm_sec;
  170. alarm_setup.wktime.tm_isdst = -1;
  171. rt_kprintf("UTC alarm Time: \n%d-%02d-%02d %02d:%02d:%02d\n\n",
  172. p_tm.tm_year + 1900,
  173. p_tm.tm_mon + 1,
  174. p_tm.tm_mday,
  175. p_tm.tm_hour,
  176. p_tm.tm_min,
  177. p_tm.tm_sec);
  178. ptr_alarm = rt_alarm_create(alarm_callback_fun, &alarm_setup);
  179. if (RT_NULL == ptr_alarm)
  180. {
  181. rt_kprintf("failed to create rtc alarm\n");
  182. return -RT_ERROR;
  183. }
  184. callback_counter = 2;
  185. ++alarm_idx;
  186. rt_alarm_dump();
  187. break;
  188. case CMD_SET_START_ALARM:
  189. if (RT_EOK != rt_alarm_start(ptr_alarm))
  190. {
  191. rt_kprintf("failed to start rtc alarm\n");
  192. return -RT_ERROR;
  193. }
  194. rt_kprintf("rtc alarm started\n");
  195. break;
  196. case CMD_STOP_ALARM:
  197. if (RT_EOK != rt_alarm_stop(ptr_alarm))
  198. {
  199. rt_kprintf("failed to stop rtc alarm\n");
  200. return -RT_ERROR;
  201. }
  202. rt_kprintf("rtc alarm stopped\n");
  203. break;
  204. case CMD_CTRL_ALARM:
  205. if (argc < 3)
  206. {
  207. rt_kprintf("unkown para to control rtc alarm\n");
  208. return -RT_ERROR;
  209. }
  210. switch (argv[2][0])
  211. {
  212. case 's':
  213. alarm_setup.flag = RT_ALARM_SECOND;
  214. break;
  215. case 'm':
  216. alarm_setup.flag = RT_ALARM_MINUTE;
  217. break;
  218. case 'o':
  219. default:
  220. alarm_setup.flag = RT_ALARM_ONESHOT;
  221. break;
  222. }
  223. if (RT_EOK != rt_alarm_control(ptr_alarm, RT_ALARM_CTRL_MODIFY, &alarm_setup))
  224. {
  225. rt_kprintf("failed to control rtc alarm\n");
  226. }
  227. rt_alarm_dump();
  228. break;
  229. case CMD_DUMP_ALARM:
  230. rt_alarm_dump();
  231. break;
  232. case CMD_DEL_ALARM:
  233. if (RT_EOK != rt_alarm_delete(ptr_alarm))
  234. {
  235. rt_kprintf("failed to delete alarm\n");
  236. }
  237. alarm_idx = 0;
  238. rt_kprintf("alarm deleted\n");
  239. break;
  240. #endif /* RT_USING_ALARM */
  241. default:
  242. if (RT_EOK != rt_device_close(rtc_dev))
  243. {
  244. rt_kprintf("failed to close RTC\n");
  245. return -RT_ERROR;
  246. }
  247. rt_kprintf("unkown rtc command, rtc closed \n");
  248. break;
  249. }
  250. /* fetch and print current time and date each second until next year */
  251. return RT_EOK;
  252. }
  253. MSH_CMD_EXPORT(rtc_sample, rtc option);
  254. #endif /* BSP_USING_RTC */
  255. /*
  256. EOF
  257. */