drv_wdt.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-11-15 JasonHu first version
  9. */
  10. #include <rtthread.h>
  11. #include <rthw.h>
  12. #include <rtdevice.h>
  13. #include <sunxi_hal_watchdog.h>
  14. #define DBG_SECTION_NAME "wdt"
  15. #include <rtdbg.h>
  16. #if defined(RT_USING_WDT) && defined(BSP_USING_WDT)
  17. /* hardware only support (1-16)s */
  18. static rt_uint32_t wdg_timeout = 0;
  19. static rt_err_t wdg_init(rt_watchdog_t *wdt)
  20. {
  21. wdg_timeout = 0;
  22. hal_watchdog_init();
  23. return RT_EOK;
  24. }
  25. static rt_err_t wdg_control(rt_watchdog_t *wdt, int cmd, void *arg)
  26. {
  27. switch (cmd)
  28. {
  29. case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
  30. if (arg)
  31. {
  32. wdg_timeout = *(rt_uint32_t *)arg;
  33. }
  34. else
  35. {
  36. LOG_E("arg is NULL!");
  37. return -RT_EIO;
  38. }
  39. break;
  40. case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
  41. if (arg)
  42. {
  43. *((rt_uint32_t *)arg) = wdg_timeout;
  44. }
  45. else
  46. {
  47. LOG_E("arg is NULL!");
  48. return -RT_EIO;
  49. }
  50. break;
  51. case RT_DEVICE_CTRL_WDT_GET_TIMELEFT:
  52. LOG_E("not support RT_DEVICE_CTRL_WDT_GET_TIMELEFT on this platform!");
  53. if (arg)
  54. {
  55. *((rt_uint32_t *)arg) = 0;
  56. }
  57. else
  58. {
  59. LOG_E("arg is NULL!");
  60. }
  61. return -RT_EIO;
  62. case RT_DEVICE_CTRL_WDT_KEEPALIVE:
  63. hal_watchdog_feed();
  64. break;
  65. case RT_DEVICE_CTRL_WDT_START:
  66. hal_watchdog_start(wdg_timeout);
  67. break;
  68. case RT_DEVICE_CTRL_WDT_STOP:
  69. hal_watchdog_stop(wdg_timeout);
  70. break;
  71. default:
  72. return -RT_EIO;
  73. }
  74. return RT_EOK;
  75. }
  76. static const struct rt_watchdog_ops wdg_pos =
  77. {
  78. wdg_init,
  79. wdg_control,
  80. };
  81. static rt_watchdog_t wdg;
  82. int rt_hw_wdg_init(void)
  83. {
  84. wdg.ops = &wdg_pos;
  85. rt_hw_watchdog_register(&wdg, "wdt", 0, RT_NULL);
  86. return RT_EOK;
  87. }
  88. INIT_DEVICE_EXPORT(rt_hw_wdg_init);
  89. void rt_hw_cpu_reset(void)
  90. {
  91. rt_hw_interrupt_disable();
  92. hal_watchdog_start(1);
  93. while(1);
  94. }
  95. MSH_CMD_EXPORT_ALIAS(rt_hw_cpu_reset, reboot, reset machine);
  96. #endif /* RT_USING_WDT && BSP_USING_WDT */