mirror of
https://github.com/esphome/esphome.git
synced 2026-09-15 00:58:40 +00:00
64 lines
1.6 KiB
C++
64 lines
1.6 KiB
C++
#ifdef USE_ZEPHYR
|
|
|
|
#include "esphome/core/defines.h"
|
|
#include "esphome/core/hal.h"
|
|
|
|
#include <zephyr/drivers/watchdog.h>
|
|
#include <zephyr/sys/reboot.h>
|
|
|
|
// Empty zephyr namespace block to satisfy ci-custom's lint_namespace check.
|
|
// HAL functions live in namespace esphome (root) — they are not part of the
|
|
// zephyr component's API.
|
|
namespace esphome::zephyr {} // namespace esphome::zephyr
|
|
|
|
namespace esphome {
|
|
|
|
#ifdef CONFIG_WATCHDOG
|
|
static int wdt_channel_id = -1; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
|
static const device *const WDT = DEVICE_DT_GET(DT_ALIAS(watchdog0));
|
|
#endif
|
|
|
|
// yield(), delay(), micros(), millis(), millis_64(), delayMicroseconds(),
|
|
// arch_get_cpu_cycle_count(), arch_get_cpu_freq_hz() inlined in
|
|
// components/zephyr/hal.h.
|
|
|
|
void arch_init() {
|
|
#ifdef CONFIG_WATCHDOG
|
|
if (device_is_ready(WDT)) {
|
|
static wdt_timeout_cfg wdt_config{};
|
|
wdt_config.flags = WDT_FLAG_RESET_SOC;
|
|
#ifdef USE_ZIGBEE
|
|
// zboss thread uses a lot of CPU cycles during startup
|
|
wdt_config.window.max = 10000;
|
|
#else
|
|
wdt_config.window.max = 2000;
|
|
#endif
|
|
wdt_channel_id = wdt_install_timeout(WDT, &wdt_config);
|
|
if (wdt_channel_id >= 0) {
|
|
uint8_t options = 0;
|
|
#ifdef USE_DEBUG
|
|
options |= WDT_OPT_PAUSE_HALTED_BY_DBG;
|
|
#endif
|
|
#ifdef USE_DEEP_SLEEP
|
|
options |= WDT_OPT_PAUSE_IN_SLEEP;
|
|
#endif
|
|
wdt_setup(WDT, options);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void arch_feed_wdt() {
|
|
#ifdef CONFIG_WATCHDOG
|
|
if (wdt_channel_id >= 0) {
|
|
wdt_feed(WDT, wdt_channel_id);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void arch_restart() { sys_reboot(SYS_REBOOT_COLD); }
|
|
|
|
} // namespace esphome
|
|
|
|
#endif // USE_ZEPHYR
|