summaryrefslogtreecommitdiff
path: root/test/stm32f_rtc.c
diff options
context:
space:
mode:
authorTom Hughes <tomhughes@chromium.org>2020-04-29 15:13:36 -0700
committerCommit Bot <commit-bot@chromium.org>2020-04-30 20:43:05 +0000
commit1f692079b7ff0fd9f3bc1b0f0b7cd1a6b473b8d9 (patch)
tree3de73aa7786bbcec095225ba595f81f293be495f /test/stm32f_rtc.c
parenta3bfb8b262badd25ba65245b709362a7cda2e0df (diff)
downloadchrome-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.c52
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();
+}