1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- /*
- * Copyright (c) 2006-2022, Synwit Technology Co.,Ltd.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2023-03-14 wcx1024979076 first version
- */
- #include "drv_wdt.h"
- #ifdef BSP_USING_WDT
- #define DBG_LEVEL DBG_LOG
- #include <rtdbg.h>
- #define LOG_TAG "DRV.WDT"
- struct rt_watchdog_device wdt_device;
- static rt_err_t _wdt_configure(rt_watchdog_t *wdt_device)
- {
- struct bflb_device_s* wdt = bflb_device_get_by_name("watchdog");
- struct bflb_wdg_config_s wdg_cfg;
- wdg_cfg.clock_source = BFLB_SYSTEM_XCLK;
- wdg_cfg.clock_div = 40;
- wdg_cfg.comp_val = 10000000;
- wdg_cfg.mode = WDG_MODE_RESET;
- bflb_wdg_init(wdt, &wdg_cfg);
- return RT_EOK;
- }
- static rt_err_t _wdt_control(rt_watchdog_t *wdt_device, int cmd, void *arg)
- {
- RT_ASSERT(wdt_device != RT_NULL);
- struct bflb_device_s* wdt = bflb_device_get_by_name("watchdog");
- struct bflb_wdg_config_s wdg_cfg;
- switch (cmd)
- {
- case RT_DEVICE_CTRL_WDT_KEEPALIVE:
- bflb_wdg_reset_countervalue(wdt);
- break;
- case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
- wdg_cfg.clock_source = BFLB_SYSTEM_XCLK;
- wdg_cfg.clock_div = 40;
- wdg_cfg.comp_val = 10000000 * (*(rt_uint32_t *)arg);
- wdg_cfg.mode = WDG_MODE_RESET;
- bflb_wdg_init(wdt, &wdg_cfg);
- bflb_wdg_start(wdt);
- wdt_device->parent.user_data = (rt_uint32_t)(*(rt_uint32_t *)arg);
- break;
- case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
- *(rt_uint32_t *)arg = (rt_uint32_t)wdt_device->parent.user_data;
- break;
- case RT_DEVICE_CTRL_WDT_GET_TIMELEFT:
- *(rt_uint32_t *)arg = bflb_wdg_get_countervalue(wdt) / 10000000;
- break;
- case RT_DEVICE_CTRL_WDT_START:
- bflb_wdg_start(wdt);
- break;
- case RT_DEVICE_CTRL_WDT_STOP:
- bflb_wdg_stop(wdt);
- break;
- default:
- LOG_W("This command is not supported.");
- return -RT_EINVAL;
- }
- return RT_EOK;
- }
- static const struct rt_watchdog_ops _wdt_ops =
- {
- .init = _wdt_configure,
- .control = _wdt_control
- };
- int rt_hw_wdt_init(void)
- {
- int result = RT_EOK;
- wdt_device.ops = &_wdt_ops;
- result = rt_hw_watchdog_register(&wdt_device, "wdt", RT_DEVICE_FLAG_RDWR, RT_NULL);
- if(result != RT_EOK)
- {
- LOG_E("wdt device register fail.");
- }
- return result;
- }
- INIT_BOARD_EXPORT(rt_hw_wdt_init);
- #endif /* BSP_USING_WDT */
|