diff options
author | Tom Hughes <tomhughes@chromium.org> | 2020-04-29 15:13:36 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-04-30 20:43:05 +0000 |
commit | 1f692079b7ff0fd9f3bc1b0f0b7cd1a6b473b8d9 (patch) | |
tree | 3de73aa7786bbcec095225ba595f81f293be495f /test/stm32f_rtc.c | |
parent | a3bfb8b262badd25ba65245b709362a7cda2e0df (diff) | |
download | chrome-ec-1f692079b7ff0fd9f3bc1b0f0b7cd1a6b473b8d9.tar.gz |
test: Add on-device unit test for STM32 RTC
BRANCH=none
BUG=b:151105339
TEST=make BOARD=bloonchipper test-stm32f_rtc -j
Flash stm32f_rtc.bin and "runtest" in the console
Signed-off-by: Tom Hughes <tomhughes@chromium.org>
Change-Id: I3debfd93b62cb269ad61af0e4ca7e195554b5548
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2171569
Reviewed-by: Eric Yilun Lin <yllin@chromium.org>
Diffstat (limited to 'test/stm32f_rtc.c')
-rw-r--r-- | test/stm32f_rtc.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/test/stm32f_rtc.c b/test/stm32f_rtc.c new file mode 100644 index 0000000000..9224b9f757 --- /dev/null +++ b/test/stm32f_rtc.c @@ -0,0 +1,52 @@ +/* Copyright 2020 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. + */ + +#include "clock-f.h" +#include "test_util.h" + +static volatile uint32_t rtc_fired; +static struct rtc_time_reg rtc_irq; +static const int rtc_delay_ms = 500; + +/* Override default RTC interrupt handler */ +void __rtc_alarm_irq(void) +{ + atomic_add(&rtc_fired, 1); + reset_rtc_alarm(&rtc_irq); +} + +test_static int test_rtc_alarm(void) +{ + struct rtc_time_reg rtc; + uint32_t rtc_diff_us; + uint32_t rtc_diff_ms; + const int delay_us = rtc_delay_ms * MSEC; + + set_rtc_alarm(0, delay_us, &rtc, 0); + + msleep(2 * rtc_delay_ms); + + /* Make sure the interrupt fired exactly once. */ + TEST_EQ(1, atomic_read_clear(&rtc_fired), "%d"); + + rtc_diff_us = get_rtc_diff(&rtc, &rtc_irq); + + ccprintf("rtc_diff_us: %d\n", rtc_diff_us); + + /* Assume we'll always fire within 1 ms. May need to be adjusted if + * this doesn't hold. + */ + rtc_diff_ms = rtc_diff_us / MSEC; + TEST_EQ(rtc_diff_ms, rtc_delay_ms, "%d"); + + return EC_SUCCESS; +} + +void run_test(void) +{ + RUN_TEST(test_rtc_alarm); + + test_print_result(); +} |