drivers: watchdog: Add support for Apollo3 SoCs watchdog
This commit adds support for the watchdog which can be found in Apollo3 SoCs Signed-off-by: Hao Luo <hluo@ambiq.com>
This commit is contained in:
parent
ddc1d8706e
commit
35aae8b5c1
5 changed files with 42 additions and 3 deletions
|
@ -91,6 +91,10 @@
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&wdt0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
&gpio0_31 {
|
&gpio0_31 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,6 +9,7 @@ toolchain:
|
||||||
- gnuarmemb
|
- gnuarmemb
|
||||||
supported:
|
supported:
|
||||||
- uart
|
- uart
|
||||||
|
- watchdog
|
||||||
- gpio
|
- gpio
|
||||||
testing:
|
testing:
|
||||||
ignore_tags:
|
ignore_tags:
|
||||||
|
|
|
@ -91,6 +91,10 @@
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&wdt0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
&gpio0_31 {
|
&gpio0_31 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,6 +9,7 @@ toolchain:
|
||||||
- gnuarmemb
|
- gnuarmemb
|
||||||
supported:
|
supported:
|
||||||
- uart
|
- uart
|
||||||
|
- watchdog
|
||||||
- gpio
|
- gpio
|
||||||
testing:
|
testing:
|
||||||
ignore_tags:
|
ignore_tags:
|
||||||
|
|
|
@ -35,10 +35,13 @@ static void wdt_ambiq_isr(void *arg)
|
||||||
const struct device *dev = (const struct device *)arg;
|
const struct device *dev = (const struct device *)arg;
|
||||||
struct wdt_ambiq_data *data = dev->data;
|
struct wdt_ambiq_data *data = dev->data;
|
||||||
|
|
||||||
|
#if defined(CONFIG_SOC_SERIES_APOLLO3X)
|
||||||
|
am_hal_wdt_int_clear();
|
||||||
|
#else
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
|
||||||
am_hal_wdt_interrupt_status_get(AM_HAL_WDT_MCU, &status, false);
|
am_hal_wdt_interrupt_status_get(AM_HAL_WDT_MCU, &status, false);
|
||||||
am_hal_wdt_interrupt_clear(AM_HAL_WDT_MCU, status);
|
am_hal_wdt_interrupt_clear(AM_HAL_WDT_MCU, status);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (data->callback) {
|
if (data->callback) {
|
||||||
data->callback(dev, 0);
|
data->callback(dev, 0);
|
||||||
|
@ -51,6 +54,25 @@ static int wdt_ambiq_setup(const struct device *dev, uint8_t options)
|
||||||
struct wdt_ambiq_data *data = dev->data;
|
struct wdt_ambiq_data *data = dev->data;
|
||||||
am_hal_wdt_config_t cfg;
|
am_hal_wdt_config_t cfg;
|
||||||
|
|
||||||
|
#if defined(CONFIG_SOC_SERIES_APOLLO3X)
|
||||||
|
uint32_t ui32ClockSource = AM_HAL_WDT_LFRC_CLK_DEFAULT;
|
||||||
|
|
||||||
|
if (dev_cfg->clk_freq == 128) {
|
||||||
|
ui32ClockSource = AM_HAL_WDT_LFRC_CLK_128HZ;
|
||||||
|
} else if (dev_cfg->clk_freq == 16) {
|
||||||
|
ui32ClockSource = AM_HAL_WDT_LFRC_CLK_16HZ;
|
||||||
|
} else if (dev_cfg->clk_freq == 1) {
|
||||||
|
ui32ClockSource = AM_HAL_WDT_LFRC_CLK_1HZ;
|
||||||
|
}
|
||||||
|
cfg.ui32Config = ui32ClockSource | _VAL2FLD(WDT_CFG_RESEN, data->reset) |
|
||||||
|
AM_HAL_WDT_ENABLE_INTERRUPT;
|
||||||
|
cfg.ui16InterruptCount = data->timeout;
|
||||||
|
cfg.ui16ResetCount = data->timeout;
|
||||||
|
am_hal_clkgen_control(AM_HAL_CLKGEN_CONTROL_LFRC_START, 0);
|
||||||
|
am_hal_wdt_init(&cfg);
|
||||||
|
am_hal_wdt_int_enable();
|
||||||
|
am_hal_wdt_start();
|
||||||
|
#else
|
||||||
if (dev_cfg->clk_freq == 128) {
|
if (dev_cfg->clk_freq == 128) {
|
||||||
cfg.eClockSource = AM_HAL_WDT_128HZ;
|
cfg.eClockSource = AM_HAL_WDT_128HZ;
|
||||||
} else if (dev_cfg->clk_freq == 16) {
|
} else if (dev_cfg->clk_freq == 16) {
|
||||||
|
@ -68,7 +90,7 @@ static int wdt_ambiq_setup(const struct device *dev, uint8_t options)
|
||||||
am_hal_wdt_config(AM_HAL_WDT_MCU, &cfg);
|
am_hal_wdt_config(AM_HAL_WDT_MCU, &cfg);
|
||||||
am_hal_wdt_interrupt_enable(AM_HAL_WDT_MCU, AM_HAL_WDT_INTERRUPT_MCU);
|
am_hal_wdt_interrupt_enable(AM_HAL_WDT_MCU, AM_HAL_WDT_INTERRUPT_MCU);
|
||||||
am_hal_wdt_start(AM_HAL_WDT_MCU, false);
|
am_hal_wdt_start(AM_HAL_WDT_MCU, false);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,8 +98,11 @@ static int wdt_ambiq_disable(const struct device *dev)
|
||||||
{
|
{
|
||||||
ARG_UNUSED(dev);
|
ARG_UNUSED(dev);
|
||||||
|
|
||||||
|
#if defined(CONFIG_SOC_SERIES_APOLLO3X)
|
||||||
|
am_hal_wdt_halt();
|
||||||
|
#else
|
||||||
am_hal_wdt_stop(AM_HAL_WDT_MCU);
|
am_hal_wdt_stop(AM_HAL_WDT_MCU);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +139,11 @@ static int wdt_ambiq_feed(const struct device *dev, int channel_id)
|
||||||
ARG_UNUSED(dev);
|
ARG_UNUSED(dev);
|
||||||
ARG_UNUSED(channel_id);
|
ARG_UNUSED(channel_id);
|
||||||
|
|
||||||
|
#if defined(CONFIG_SOC_SERIES_APOLLO3X)
|
||||||
|
am_hal_wdt_restart();
|
||||||
|
#else
|
||||||
am_hal_wdt_restart(AM_HAL_WDT_MCU);
|
am_hal_wdt_restart(AM_HAL_WDT_MCU);
|
||||||
|
#endif
|
||||||
LOG_DBG("Fed the watchdog");
|
LOG_DBG("Fed the watchdog");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue