drv_wdt.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * Copyright (c) 2006-2022, Synwit Technology Co.,Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-03-14 wcx1024979076 first version
  9. */
  10. #include "drv_wdt.h"
  11. #ifdef BSP_USING_WDT
  12. #define DBG_LEVEL DBG_LOG
  13. #include <rtdbg.h>
  14. #define LOG_TAG "DRV.WDT"
  15. struct rt_watchdog_device wdt_device;
  16. static rt_err_t _wdt_configure(rt_watchdog_t *wdt_device)
  17. {
  18. struct bflb_device_s* wdt = bflb_device_get_by_name("watchdog");
  19. struct bflb_wdg_config_s wdg_cfg;
  20. wdg_cfg.clock_source = BFLB_SYSTEM_XCLK;
  21. wdg_cfg.clock_div = 40;
  22. wdg_cfg.comp_val = 10000000;
  23. wdg_cfg.mode = WDG_MODE_RESET;
  24. bflb_wdg_init(wdt, &wdg_cfg);
  25. return RT_EOK;
  26. }
  27. static rt_err_t _wdt_control(rt_watchdog_t *wdt_device, int cmd, void *arg)
  28. {
  29. RT_ASSERT(wdt_device != RT_NULL);
  30. struct bflb_device_s* wdt = bflb_device_get_by_name("watchdog");
  31. struct bflb_wdg_config_s wdg_cfg;
  32. switch (cmd)
  33. {
  34. case RT_DEVICE_CTRL_WDT_KEEPALIVE:
  35. bflb_wdg_reset_countervalue(wdt);
  36. break;
  37. case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
  38. wdg_cfg.clock_source = BFLB_SYSTEM_XCLK;
  39. wdg_cfg.clock_div = 40;
  40. wdg_cfg.comp_val = 10000000 * (*(rt_uint32_t *)arg);
  41. wdg_cfg.mode = WDG_MODE_RESET;
  42. bflb_wdg_init(wdt, &wdg_cfg);
  43. bflb_wdg_start(wdt);
  44. wdt_device->parent.user_data = (rt_uint32_t)(*(rt_uint32_t *)arg);
  45. break;
  46. case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
  47. *(rt_uint32_t *)arg = (rt_uint32_t)wdt_device->parent.user_data;
  48. break;
  49. case RT_DEVICE_CTRL_WDT_GET_TIMELEFT:
  50. *(rt_uint32_t *)arg = bflb_wdg_get_countervalue(wdt) / 10000000;
  51. break;
  52. case RT_DEVICE_CTRL_WDT_START:
  53. bflb_wdg_start(wdt);
  54. break;
  55. case RT_DEVICE_CTRL_WDT_STOP:
  56. bflb_wdg_stop(wdt);
  57. break;
  58. default:
  59. LOG_W("This command is not supported.");
  60. return -RT_EINVAL;
  61. }
  62. return RT_EOK;
  63. }
  64. static const struct rt_watchdog_ops _wdt_ops =
  65. {
  66. .init = _wdt_configure,
  67. .control = _wdt_control
  68. };
  69. int rt_hw_wdt_init(void)
  70. {
  71. int result = RT_EOK;
  72. wdt_device.ops = &_wdt_ops;
  73. result = rt_hw_watchdog_register(&wdt_device, "wdt", RT_DEVICE_FLAG_RDWR, RT_NULL);
  74. if(result != RT_EOK)
  75. {
  76. LOG_E("wdt device register fail.");
  77. }
  78. return result;
  79. }
  80. INIT_BOARD_EXPORT(rt_hw_wdt_init);
  81. #endif /* BSP_USING_WDT */