drv_wdt.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-12-07 balanceTWK first version
  9. */
  10. #include <board.h>
  11. #ifdef RT_USING_WDT
  12. //#define DRV_DEBUG
  13. #define LOG_TAG "drv.wdt"
  14. #include <drv_log.h>
  15. static IWDG_HandleTypeDef hiwdg;
  16. static struct rt_watchdog_ops ops;
  17. static rt_watchdog_t watchdog;
  18. static rt_err_t wdt_init(rt_watchdog_t *wdt)
  19. {
  20. hiwdg.Instance = IWDG;
  21. hiwdg.Init.Prescaler = IWDG_PRESCALER_32;
  22. hiwdg.Init.Reload = 0x00000FFE;
  23. #if defined(SOC_SERIES_STM32L4)
  24. hiwdg.Init.Window = 0x00000FFF;
  25. #endif
  26. if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  27. {
  28. LOG_E("wdt init failed.");
  29. return -RT_ERROR;
  30. }
  31. return RT_EOK;
  32. }
  33. static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
  34. {
  35. switch (cmd)
  36. {
  37. /* feed the watchdog */
  38. case RT_DEVICE_CTRL_WDT_KEEPALIVE:
  39. HAL_IWDG_Refresh(&hiwdg);
  40. break;
  41. /* set watchdog timeout */
  42. case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
  43. hiwdg.Init.Reload = (rt_uint32_t)arg;
  44. if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  45. {
  46. LOG_E("wdg set timeout failed.");
  47. return -RT_ERROR;
  48. }
  49. break;
  50. default:
  51. return -RT_ERROR;
  52. }
  53. return RT_EOK;
  54. }
  55. int rt_wdt_init(void)
  56. {
  57. ops.init = &wdt_init;
  58. ops.control = &wdt_control;
  59. watchdog.ops = &ops;
  60. /* register watchdog device */
  61. if (rt_hw_watchdog_register(&watchdog, "wdt", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK)
  62. {
  63. LOG_E("wdt device register failed.");
  64. return -RT_ERROR;
  65. }
  66. LOG_D("wdt device register success.");
  67. return RT_EOK;
  68. }
  69. INIT_BOARD_EXPORT(rt_wdt_init);
  70. #endif /* RT_USING_WDT */