int hal_watchdog_init(uint32_t expire_msecs) { #ifndef WATCHDOG_STUB wdog_config_t config; NVIC_SetVector(WDOG_EWM_IRQn, (uint32_t) nxp_wdt_irq_handler); WDOG_GetDefaultConfig(&config); config.timeoutValue = (expire_msecs * 32768ULL) / 1000; config.enableUpdate = true; WDOG_Init(wdog_base, &config); #endif return (0); }
static int mcux_wdog_install_timeout(struct device *dev, const struct wdt_timeout_cfg *cfg) { const struct mcux_wdog_config *config = dev->config->config_info; struct mcux_wdog_data *data = dev->driver_data; struct device *clock_dev; u32_t clock_freq; if (data->timeout_valid) { LOG_ERR("No more timeouts can be installed"); return -ENOMEM; } clock_dev = device_get_binding(config->clock_name); if (clock_dev == NULL) { return -EINVAL; } if (clock_control_get_rate(clock_dev, config->clock_subsys, &clock_freq)) { return -EINVAL; } WDOG_GetDefaultConfig(&data->wdog_config); data->wdog_config.timeoutValue = clock_freq * cfg->window.max / 1000; if (cfg->window.min) { data->wdog_config.enableWindowMode = true; data->wdog_config.windowValue = clock_freq * cfg->window.min / 1000; } else { data->wdog_config.enableWindowMode = false; data->wdog_config.windowValue = 0; } if ((data->wdog_config.timeoutValue < MIN_TIMEOUT) || (data->wdog_config.timeoutValue < data->wdog_config.windowValue)) { LOG_ERR("Invalid timeout"); return -EINVAL; } data->wdog_config.clockSource = kWDOG_LpoClockSource; data->wdog_config.enableInterrupt = cfg->callback != NULL; data->callback = cfg->callback; data->timeout_valid = true; return 0; }