drv_wdt.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-08-20 Mr.Tiger first version
  9. */
  10. #include <rtthread.h>
  11. #include <rtdevice.h>
  12. #include <rthw.h>
  13. #include <drv_common.h>
  14. #include <drv_config.h>
  15. #include <hal_data.h>
  16. #ifdef RT_USING_WDT
  17. //#define DRV_DEBUG
  18. #define LOG_TAG "drv.wdt"
  19. #include <rtdbg.h>
  20. static struct rt_watchdog_device ra_wdt_dev;
  21. static struct rt_watchdog_ops ops;
  22. static rt_err_t wdt_init(rt_watchdog_t *wdt)
  23. {
  24. return RT_EOK;
  25. }
  26. static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
  27. {
  28. rt_err_t ret = -RT_ERROR;
  29. struct st_wdt_timeout_values *wdt_value = {0};
  30. switch (cmd)
  31. {
  32. /* feed the watchdog */
  33. case RT_DEVICE_CTRL_WDT_KEEPALIVE:
  34. if (R_WDT_Refresh(&g_wdt_ctrl) != FSP_SUCCESS)
  35. {
  36. LOG_E("watch dog keepalive fail.");
  37. ret = -RT_ERROR;
  38. }
  39. else
  40. {
  41. ret = RT_EOK;
  42. }
  43. break;
  44. /* set watchdog timeout */
  45. case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
  46. /**< set*/
  47. LOG_W("Use the FSP tool to modify the configuration parameters!");
  48. ret = -RT_EINVAL;
  49. break;
  50. case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
  51. wdt_value = (struct st_wdt_timeout_values *)arg;
  52. if (R_WDT_TimeoutGet(&g_wdt_ctrl, wdt_value) != FSP_SUCCESS)
  53. {
  54. LOG_E("wdt get timeout failed.");
  55. ret = -RT_ERROR;
  56. }
  57. else
  58. {
  59. ret = RT_EOK;
  60. }
  61. break;
  62. case RT_DEVICE_CTRL_WDT_START:
  63. if (R_WDT_Open(&g_wdt_ctrl, &g_wdt_cfg) == FSP_SUCCESS)
  64. {
  65. if (R_WDT_Refresh(&g_wdt_ctrl) != FSP_SUCCESS)
  66. {
  67. LOG_E("wdt start failed.");
  68. ret = -RT_ERROR;
  69. }
  70. else
  71. {
  72. ret = RT_EOK;
  73. }
  74. }
  75. else
  76. {
  77. LOG_E("wdt start failed.");
  78. ret = -RT_ERROR;
  79. }
  80. break;
  81. default:
  82. LOG_W("This command is not supported.");
  83. ret = -RT_ERROR;
  84. }
  85. return ret;
  86. }
  87. int rt_wdt_init(void)
  88. {
  89. ops.init = &wdt_init;
  90. ops.control = &wdt_control;
  91. ra_wdt_dev.ops = &ops;
  92. /* register watchdog device */
  93. if (rt_hw_watchdog_register(&ra_wdt_dev, "wdt", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK)
  94. {
  95. LOG_E("wdt device register failed.");
  96. return -RT_ERROR;
  97. }
  98. LOG_D("wdt device register success.");
  99. return RT_EOK;
  100. }
  101. INIT_BOARD_EXPORT(rt_wdt_init);
  102. #endif /* RT_USING_WDT */