drv_wdt.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. * Copyright (c) 2022, xiaoxiaolisunny
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2022-07-11 xiaoxiaolisunny first version
  10. */
  11. #include <drv_config.h>
  12. #include <board_config.h>
  13. #include "drv_irq.h"
  14. #ifdef RT_USING_WDT
  15. #define LOG_TAG "drv.dwt"
  16. #include <drv_log.h>
  17. struct hc32_wdt_obj
  18. {
  19. rt_watchdog_t watchdog;
  20. stc_wdt_init_t hiwdg;
  21. rt_uint16_t is_start;
  22. };
  23. static struct hc32_wdt_obj hc32_wdt;
  24. static struct rt_watchdog_ops ops;
  25. static rt_err_t wdt_init(rt_watchdog_t *wdt)
  26. {
  27. return RT_EOK;
  28. }
  29. /* timeout(s) = PERI * CKS / PCLK3
  30. 16384 * 8192 / 50M = 2.68s
  31. */
  32. static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
  33. {
  34. switch (cmd)
  35. {
  36. /* feed the watchdog */
  37. case RT_DEVICE_CTRL_WDT_KEEPALIVE:
  38. WDT_FeedDog();
  39. break;
  40. /* set watchdog timeout */
  41. case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
  42. hc32_wdt.hiwdg.u32CountPeriod = WDT_CNT_PERIOD16384;
  43. if(hc32_wdt.hiwdg.u32RefreshRange > 0xFFFF)
  44. {
  45. LOG_E("wdg set timeout parameter too large, please less than %ds", 0xFFFF);
  46. return -RT_EINVAL;
  47. }
  48. if(hc32_wdt.is_start)
  49. {
  50. if (WDT_Init(&hc32_wdt.hiwdg) != LL_OK)
  51. {
  52. LOG_E("wdg set timeout failed.");
  53. return -RT_ERROR;
  54. }
  55. }
  56. break;
  57. case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
  58. (*((rt_uint32_t*)arg)) = 16384 * 8192 / 50000000;
  59. break;
  60. case RT_DEVICE_CTRL_WDT_START:
  61. if (WDT_Init(&hc32_wdt.hiwdg) != LL_OK)
  62. {
  63. LOG_E("wdt start failed.");
  64. return -RT_ERROR;
  65. }
  66. hc32_wdt.is_start = 1;
  67. break;
  68. default:
  69. LOG_W("This command is not supported.");
  70. return -RT_ERROR;
  71. }
  72. return RT_EOK;
  73. }
  74. int rt_wdt_init(void)
  75. {
  76. hc32_wdt.hiwdg.u32ClockDiv = WDT_CLK_DIV8192;
  77. hc32_wdt.hiwdg.u32CountPeriod = WDT_CNT_PERIOD16384;
  78. hc32_wdt.hiwdg.u32RefreshRange = WDT_RANGE_0TO100PCT;
  79. hc32_wdt.hiwdg.u32LPMCount = WDT_LPM_CNT_STOP;
  80. hc32_wdt.hiwdg.u32ExceptionType = WDT_EXP_TYPE_RST;
  81. hc32_wdt.is_start = 0;
  82. ops.init = &wdt_init;
  83. ops.control = &wdt_control;
  84. hc32_wdt.watchdog.ops = &ops;
  85. /* register watchdog device */
  86. if (rt_hw_watchdog_register(&hc32_wdt.watchdog, "wdt", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK)
  87. {
  88. LOG_E("wdt device register failed.");
  89. return -RT_ERROR;
  90. }
  91. LOG_D("wdt device register success.");
  92. return RT_EOK;
  93. }
  94. INIT_BOARD_EXPORT(rt_wdt_init);
  95. #endif