drv_wdt.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. struct st_wdt_timeout_values *wdt_value = {0};
  29. switch (cmd)
  30. {
  31. /* feed the watchdog */
  32. case RT_DEVICE_CTRL_WDT_KEEPALIVE:
  33. if (R_WDT_Refresh(&g_wdt_ctrl) != FSP_SUCCESS)
  34. {
  35. LOG_E("watch dog keepalive fail.");
  36. }
  37. break;
  38. /* set watchdog timeout */
  39. case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
  40. /**< set*/
  41. break;
  42. case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
  43. wdt_value = (struct st_wdt_timeout_values *)arg;
  44. if (R_WDT_TimeoutGet(&g_wdt_ctrl, wdt_value) != FSP_SUCCESS)
  45. {
  46. LOG_E("wdt get timeout failed.");
  47. return -RT_ERROR;
  48. }
  49. break;
  50. case RT_DEVICE_CTRL_WDT_START:
  51. if (R_WDT_Open(&g_wdt_ctrl, &g_wdt_cfg) == FSP_SUCCESS)
  52. {
  53. if (R_WDT_Refresh(&g_wdt_ctrl) != FSP_SUCCESS)
  54. {
  55. LOG_E("wdt start failed.");
  56. return -RT_ERROR;
  57. }
  58. }
  59. else
  60. {
  61. LOG_E("wdt start failed.");
  62. return -RT_ERROR;
  63. }
  64. break;
  65. default:
  66. LOG_W("This command is not supported.");
  67. return -RT_ERROR;
  68. }
  69. return RT_EOK;
  70. }
  71. int rt_wdt_init(void)
  72. {
  73. ops.init = &wdt_init;
  74. ops.control = &wdt_control;
  75. ra_wdt_dev.ops = &ops;
  76. /* register watchdog device */
  77. if (rt_hw_watchdog_register(&ra_wdt_dev, "wdt", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK)
  78. {
  79. LOG_E("wdt device register failed.");
  80. return -RT_ERROR;
  81. }
  82. LOG_D("wdt device register success.");
  83. return RT_EOK;
  84. }
  85. INIT_BOARD_EXPORT(rt_wdt_init);
  86. #endif /* RT_USING_WDT */