Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,26 @@ menu "On-chip Peripheral Drivers"
default n
endif



menuconfig BSP_USING_WDT
bool "Enable WDT"
default n
if BSP_USING_WDT
config BSP_USING_FWDT
bool "Enable FWDT"
default y
config BSP_USING_WWDT
bool "Enable WWDT"
default n
choice
prompt "Select WDT type"
default BSP_USING_FWDT
config BSP_USING_FWDT
bool "Enable FWDT"
config BSP_USING_WWDT
bool "Enable WWDT"
endchoice
endif

source "$(BSP_DIR)/../libraries/gd32_drivers/Kconfig"

endmenu
Expand Down
3 changes: 2 additions & 1 deletion bsp/gd32/risc-v/libraries/gd32_drivers/SConscript
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ if GetDepend('RT_USING_SFUD'):
src += ['drv_spi_flash.c', 'drv_spi.c']

# add wdt drivers.
if GetDepend('RT_USING_WDT'):
if GetDepend(['RT_USING_WDT', 'SOC_GD32VW553H']):
src += ['drv_wdt.c']

# add rtc drivers.
Expand All @@ -49,6 +49,7 @@ if GetDepend('RT_USING_ADC'):
if GetDepend(['RT_USING_PWM', 'SOC_GD32VW553H']):
src += ['drv_pwm.c']


path = [cwd]

group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path)
Expand Down
179 changes: 179 additions & 0 deletions bsp/gd32/risc-v/libraries/gd32_drivers/drv_wdt.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
/*
* Copyright (c) 2006-2023, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2026-02-04 Yixizhang first version
*/

#include <board.h>
#include <rtthread.h>
#ifdef RT_USING_WDT

#if defined(BSP_USING_FWDT)
#define HW_WDGT_DEV_NAME "fwdgt"
#elif defined(BSP_USING_WWDT)
#define HW_WDGT_DEV_NAME "wwdgt"
#endif

#define DBG_TAG "wdt"
#define DBG_LVL DBG_LOG

#include <rtdbg.h>
struct gd32_wdt_obj
{
rt_watchdog_t watchdog;
rt_uint16_t is_start;
};
static struct gd32_wdt_obj gd32_wdt;
static struct rt_watchdog_ops ops;

static rt_err_t wdt_init(rt_watchdog_t *wdt)
{
LOG_D("wdt init success.");
return RT_EOK;
}

static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
{

rt_uint32_t time_sec;
rt_uint32_t time_msec;
rt_uint32_t wdgt_count;
rt_uint32_t window_value;
switch (cmd)
{
/* feed the watchdog */
case RT_DEVICE_CTRL_WDT_KEEPALIVE:
#if defined(BSP_USING_FWDT)
fwdgt_counter_reload();
#elif defined(BSP_USING_WWDT)
wwdgt_counter_update(0x70);
LOG_D("wdt update success.");
#endif
break;
case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:

#if defined(BSP_USING_FWDT)
/* set timeout sec*/
time_sec = *(rt_uint32_t*)arg;
wdgt_count = 32*1000/32*time_sec;
ErrStatus res = fwdgt_prescaler_value_config(FWDGT_PSC_DIV32);
res = fwdgt_reload_value_config(wdgt_count);
LOG_D("timeout=%d sec,count=%d res=%d ", time_sec, wdgt_count, res);
#elif defined(BSP_USING_WWDT)
/* set timeout ms */
window_value = 0x7F;
time_msec = *(rt_uint32_t*)arg;
wdgt_count = (rt_uint32_t)((float)((float)1/0.78)*time_msec) + 0x3F;
wwdgt_config(wdgt_count, window_value, WWDGT_CFG_PSC_DIV8);
LOG_D("timeout=%d msec,count=%d ", time_msec, wdgt_count);
#endif

break;
case RT_DEVICE_CTRL_WDT_START:
#if defined(BSP_USING_FWDT)
fwdgt_enable();
#elif defined(BSP_USING_WWDT)
wwdgt_enable();
#endif
LOG_D("wdt control enable success.");
break;
default:
LOG_W("This command is not supported.");
return -RT_ERROR;
}
return RT_EOK;
}

int rt_wdt_init(void)
{
rcu_periph_clock_enable(RCU_WWDGT);
gd32_wdt.is_start = 0;
ops.init = &wdt_init;
ops.control = &wdt_control;
gd32_wdt.watchdog.ops = &ops;
/* register watchdog device */
if (rt_hw_watchdog_register(&gd32_wdt.watchdog, HW_WDGT_DEV_NAME, RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK)
{
LOG_E("wdt device register failed.");
return -RT_ERROR;
}
LOG_D(" wdt device register success.");
return RT_EOK;
}
INIT_BOARD_EXPORT(rt_wdt_init);

#if defined(BSP_USING_FWDT)
int fwdt_test_sample()
{
rt_err_t ret = RT_EOK;
rt_device_t hw_dev = RT_NULL;
rt_ubase_t time_out_sec = 4;
hw_dev = rt_device_find(HW_WDGT_DEV_NAME);

LOG_D("find fwdt device success,device=%x",hw_dev);
if (hw_dev == RT_NULL)
{
LOG_D("fwdt sample run failed! can't find %s device!", HW_WDGT_DEV_NAME);
return -RT_ERROR;
}
ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
LOG_D("open fwdt device success");
if (ret != RT_EOK)
{
LOG_D("open %s device failed!", HW_WDGT_DEV_NAME);
return ret;
}

ret = rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &time_out_sec);
if (ret != RT_EOK)
{
LOG_D("control %s device failed!", HW_WDGT_DEV_NAME);
return ret;
}
rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL);
return ret;
}

MSH_CMD_EXPORT(fwdt_test_sample, fwdt timeout 4 sec reset)

#elif defined(BSP_USING_WWDT)
int wwdt_test_sample()
{
rt_err_t ret = RT_EOK;
rt_device_t hw_dev = RT_NULL;
rt_ubase_t time_out_msec = 40;
hw_dev = rt_device_find(HW_WDGT_DEV_NAME);

LOG_D("find wwdt device success,device=%x",hw_dev);
if (hw_dev == RT_NULL)
{
LOG_D("wwdt sample run failed! can't find %s device!", HW_WDGT_DEV_NAME);
return -RT_ERROR;
}
ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
LOG_D("open wwdt device success");
if (ret != RT_EOK)
{
LOG_D("open %s device failed!", HW_WDGT_DEV_NAME);
return ret;
}

ret = rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &time_out_msec);
if (ret != RT_EOK)
{
LOG_D("control %s device failed!", HW_WDGT_DEV_NAME);
return ret;
}
rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL);
return ret;
}
MSH_CMD_EXPORT(wwdt_test_sample, wwdt timeout 40 msec reset)
#endif

#endif /* RT_USING_WDT */