From 21a255ea953e8ac64d05147ad7f11491db126cf4 Mon Sep 17 00:00:00 2001 From: Jerry Bradshaw Date: Thu, 6 Jun 2019 08:52:13 -0500 Subject: Basic implentation of the Maxim Integrated MAX32660 within the EC OS Includes System Clock, Timer, Uart, Watchdog Change-Id: I195059c87d97e70c6a134304143613b86b623e22 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1647741 Reviewed-by: Jes Klinke Reviewed-by: Randall Spangler Tested-by: Jerry Bradshaw Commit-Queue: Jes Klinke --- chip/max32660/wdt_chip.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 chip/max32660/wdt_chip.c (limited to 'chip/max32660/wdt_chip.c') diff --git a/chip/max32660/wdt_chip.c b/chip/max32660/wdt_chip.c new file mode 100644 index 0000000000..1c99c798fc --- /dev/null +++ b/chip/max32660/wdt_chip.c @@ -0,0 +1,67 @@ +/* Copyright 2019 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* MAX32660 Watchdog Module */ + +#include "clock.h" +#include "common.h" +#include "gpio.h" +#include "hooks.h" +#include "task.h" +#include "util.h" +#include "watchdog.h" +#include "console.h" +#include "registers.h" +#include "board.h" +#include "wdt_regs.h" + +#define CPUTS(outstr) cputs(CC_COMMAND, outstr) +#define CPRINTS(format, args...) cprints(CC_COMMAND, format, ##args) + +/* For a System clock of 96MHz, + * Time in seconds = 96000000 / 2 * 2^power + * Example for MXC_S_WDT_CTRL_INT_PERIOD_WDT2POW29 + * Time in seconds = 96000000 / 2 * 2^29 + * = 11.1 Seconds + */ +#define WATCHDOG_TIMER_PERIOD MXC_S_WDT_CTRL_INT_PERIOD_WDT2POW29 + +volatile int starve_dog = 0; + +void watchdog_reload(void) +{ + if (!starve_dog) { + /* Reset the watchdog */ + MXC_WDT0->rst = 0x00A5; + MXC_WDT0->rst = 0x005A; + } +} +DECLARE_HOOK(HOOK_TICK, watchdog_reload, HOOK_PRIO_DEFAULT); + +int watchdog_init(void) +{ + /* Set the Watchdog period */ + MXC_SETFIELD(MXC_WDT0->ctrl, MXC_F_WDT_CTRL_RST_PERIOD, + (WATCHDOG_TIMER_PERIOD << 4)); + + /* We want the WD to reset us if it is not fed in time. */ + MXC_WDT0->ctrl |= MXC_F_WDT_CTRL_RST_EN; + /* Enable the watchdog */ + MXC_WDT0->ctrl |= MXC_F_WDT_CTRL_WDT_EN; + /* Reset the watchdog */ + MXC_WDT0->rst = 0x00A5; + MXC_WDT0->rst = 0x005A; + return EC_SUCCESS; +} + +static int command_watchdog_test(int argc, char **argv) +{ + starve_dog = 1; + + CPRINTS("done command_watchdog_test."); + return EC_SUCCESS; +} +DECLARE_CONSOLE_COMMAND(wdttest, command_watchdog_test, "wdttest", + "Force a WDT reset."); -- cgit v1.2.1