summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2020-09-23 08:43:26 -0600
committerCommit Bot <commit-bot@chromium.org>2020-10-01 19:14:48 +0000
commit480a1dc59a883251019262147a8c306e98599436 (patch)
treeb3ace437b75856c62c3b31ea06fcb972ef9de475
parent326864e0a15bcd0de5890579f10c14fda888022a (diff)
downloadchrome-ec-480a1dc59a883251019262147a8c306e98599436.tar.gz
zephyr: shim in the timer module
This enables building timer.c in the Zephyr shim. In addition, we provide definitions for the symbols __hw_clock_source_read64 and __hw_clock_event_get defined for Zephyr to provide times to the CrOS EC. The event timer does not make sense for Zephyr code, but we need it defined to prevent link errors (timerinfo uses it). Perhaps the solution to this is to add a new config option (e.g., CONFIG_EVENT_TIMER) which can be used to selectively enable/disable the event timer in the CrOS EC. But punting this work for now and just adding a fake definition. BUG=b:167590251 BRANCH=none TEST=compile for posix-ec, run gettime and timerinfo commands Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Change-Id: I58990a6295625f9c34ec080360470431b46155bd Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2427100 Reviewed-by: Jett Rink <jettrink@chromium.org>
-rw-r--r--common/timer.c18
-rw-r--r--zephyr/CMakeLists.txt1
-rw-r--r--zephyr/Kconfig28
-rw-r--r--zephyr/shim/include/config_chip.h22
-rw-r--r--zephyr/shim/src/CMakeLists.txt1
-rw-r--r--zephyr/shim/src/hwtimer.c29
6 files changed, 98 insertions, 1 deletions
diff --git a/common/timer.c b/common/timer.c
index b4c31360b6..6a210ee9da 100644
--- a/common/timer.c
+++ b/common/timer.c
@@ -6,6 +6,7 @@
/* Timer module for Chrome EC operating system */
#include "atomic.h"
+#include "common.h"
#include "console.h"
#include "hooks.h"
#include "hwtimer.h"
@@ -15,6 +16,13 @@
#include "timer.h"
#include "watchdog.h"
+#ifdef CONFIG_ZEPHYR
+#include <kernel.h> /* For k_usleep() */
+#else
+extern __error("k_usleep() should only be called from Zephyr code")
+int32_t k_usleep(int32_t);
+#endif /* CONFIG_ZEPHYR */
+
#define TIMER_SYSJUMP_TAG 0x4d54 /* "TM" */
/* High 32-bits of the 64-bit timestamp counter. */
@@ -154,7 +162,15 @@ void timer_cancel(task_id_t tskid)
void usleep(unsigned us)
{
uint32_t evt = 0;
- uint32_t t0 = __hw_clock_source_read();
+ uint32_t t0;
+
+ if (IS_ENABLED(CONFIG_ZEPHYR)) {
+ while (us)
+ us = k_usleep(us);
+ return;
+ }
+
+ t0 = __hw_clock_source_read();
/* If task scheduling has not started, just delay */
if (!task_start_called()) {
diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt
index e13a080bd1..1959486797 100644
--- a/zephyr/CMakeLists.txt
+++ b/zephyr/CMakeLists.txt
@@ -28,3 +28,4 @@ add_subdirectory_ifdef(CONFIG_PLATFORM_EC "shim/src")
# Shimmed modules
zephyr_sources_ifdef(CONFIG_PLATFORM_EC "${PLATFORM_EC}/common/util.c")
+zephyr_sources_ifdef(CONFIG_PLATFORM_EC_TIMER "${PLATFORM_EC}/common/timer.c")
diff --git a/zephyr/Kconfig b/zephyr/Kconfig
index e70bb57fc7..e2a5f62ff4 100644
--- a/zephyr/Kconfig
+++ b/zephyr/Kconfig
@@ -28,4 +28,32 @@ config ZEPHYR
This should always be enabled. It's a workaround for
config.h not being available in some headers.
+menuconfig PLATFORM_EC_TIMER
+ bool "Enable the EC timer module"
+ default y
+ help
+ Enable compilation of the EC timer module
+
+if PLATFORM_EC_TIMER
+
+config PLATFORM_EC_TIMER_CMD_GETTIME
+ bool "Enable the gettime command"
+ default y
+ help
+ Enable the "gettime" command
+
+config PLATFORM_EC_TIMER_CMD_TIMERINFO
+ bool "Enable the timerinfo command"
+ default y
+ help
+ Enable the "timerinfo" command
+
+config PLATFORM_EC_TIMER_CMD_WAITMS
+ bool "Enable the waitms command"
+ default y
+ help
+ Enable the "waitms" command
+
+endif # PLATFORM_EC_TIMER
+
endif # PLATFORM_EC
diff --git a/zephyr/shim/include/config_chip.h b/zephyr/shim/include/config_chip.h
index 0929b20031..dc5f14865c 100644
--- a/zephyr/shim/include/config_chip.h
+++ b/zephyr/shim/include/config_chip.h
@@ -19,4 +19,26 @@
#define CONFIG_ZEPHYR
#define CHROMIUM_EC
+#ifdef CONFIG_PLATFORM_EC_TIMER
+#define CONFIG_HWTIMER_64BIT
+#define CONFIG_HW_SPECIFIC_UDELAY
+#undef CONFIG_WATCHDOG
+
+#undef CONFIG_CMD_GETTIME
+#ifdef CONFIG_PLATFORM_EC_TIMER_CMD_GETTIME
+#define CONFIG_CMD_GETTIME
+#endif /* CONFIG_PLATFORM_EC_TIMER_CMD_GETTIME */
+
+#undef CONFIG_CMD_TIMERINFO
+#ifdef CONFIG_PLATFORM_EC_TIMER_CMD_TIMERINFO
+#define CONFIG_CMD_TIMERINFO
+#endif /* CONFIG_PLATFORM_EC_TIMER_CMD_TIMERINFO */
+
+#undef CONFIG_CMD_WAITMS
+#ifdef CONFIG_PLATFORM_EC_TIMER_CMD_WAITMS
+#define CONFIG_CMD_WAITMS
+#endif /* CONFIG_PLATFORM_EC_TIMER_CMD_TIMERINFO */
+
+#endif /* CONFIG_PLATFORM_EC_TIMER */
+
#endif /* __CROS_EC_CONFIG_CHIP_H */
diff --git a/zephyr/shim/src/CMakeLists.txt b/zephyr/shim/src/CMakeLists.txt
index 0d54d82ad0..5f8eaf88ad 100644
--- a/zephyr/shim/src/CMakeLists.txt
+++ b/zephyr/shim/src/CMakeLists.txt
@@ -3,3 +3,4 @@
# found in the LICENSE file.
zephyr_sources(console.c)
+zephyr_sources_ifdef(CONFIG_PLATFORM_EC_TIMER hwtimer.c)
diff --git a/zephyr/shim/src/hwtimer.c b/zephyr/shim/src/hwtimer.c
new file mode 100644
index 0000000000..85c72c5c59
--- /dev/null
+++ b/zephyr/shim/src/hwtimer.c
@@ -0,0 +1,29 @@
+/* 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 <kernel.h>
+#include <stdint.h>
+#include <zephyr.h>
+
+#include "hwtimer.h"
+
+uint64_t __hw_clock_source_read64(void)
+{
+ return k_ticks_to_us_floor64(k_uptime_ticks());
+}
+
+uint32_t __hw_clock_event_get(void)
+{
+ /*
+ * CrOS EC event deadlines don't quite make sense in Zephyr
+ * terms. Evaluate what to do about this later...
+ */
+ return 0;
+}
+
+void udelay(unsigned us)
+{
+ k_busy_wait(us);
+}