浏览代码

sandbox: add a sandbox timer and basic test

Add a sandbox timer which get time from host os and a basic
test.

Signed-off-by: Thomas Chou <thomas@wytron.com.tw>
Reviewed-by: Simon Glass <sjg@chromium.org>
Thomas Chou 9 年之前
父节点
当前提交
9961a0b6fb

+ 4 - 0
arch/sandbox/dts/sandbox.dts

@@ -177,6 +177,10 @@
 		sides = <4>;
 		sides = <4>;
 	};
 	};
 
 
+	timer {
+		compatible = "sandbox,timer";
+	};
+
 	tpm {
 	tpm {
 		compatible = "google,sandbox-tpm";
 		compatible = "google,sandbox-tpm";
 	};
 	};

+ 2 - 0
board/sandbox/sandbox.c

@@ -26,6 +26,7 @@ void flush_cache(unsigned long start, unsigned long size)
 {
 {
 }
 }
 
 
+#ifndef CONFIG_TIMER
 /* system timer offset in ms */
 /* system timer offset in ms */
 static unsigned long sandbox_timer_offset;
 static unsigned long sandbox_timer_offset;
 
 
@@ -38,6 +39,7 @@ unsigned long timer_read_counter(void)
 {
 {
 	return os_get_nsec() / 1000 + sandbox_timer_offset * 1000;
 	return os_get_nsec() / 1000 + sandbox_timer_offset * 1000;
 }
 }
+#endif
 
 
 int dram_init(void)
 int dram_init(void)
 {
 {

+ 2 - 0
configs/sandbox_defconfig

@@ -53,6 +53,8 @@ CONFIG_SANDBOX_SERIAL=y
 CONFIG_SOUND=y
 CONFIG_SOUND=y
 CONFIG_SOUND_SANDBOX=y
 CONFIG_SOUND_SANDBOX=y
 CONFIG_SANDBOX_SPI=y
 CONFIG_SANDBOX_SPI=y
+CONFIG_TIMER=y
+CONFIG_SANDBOX_TIMER=y
 CONFIG_TPM_TIS_SANDBOX=y
 CONFIG_TPM_TIS_SANDBOX=y
 CONFIG_USB=y
 CONFIG_USB=y
 CONFIG_DM_USB=y
 CONFIG_DM_USB=y

+ 7 - 0
doc/device-tree-bindings/timer/sandbox_timer.txt

@@ -0,0 +1,7 @@
+Sandbox timer
+
+The sandbox timer device is an emulated device which gets time from
+host os.
+
+Required properties:
+  compatible: "sandbox,timer"

+ 7 - 0
drivers/timer/Kconfig

@@ -16,4 +16,11 @@ config ALTERA_TIMER
 	  Select this to enable an timer for Altera devices. Please find
 	  Select this to enable an timer for Altera devices. Please find
 	  details on the "Embedded Peripherals IP User Guide" of Altera.
 	  details on the "Embedded Peripherals IP User Guide" of Altera.
 
 
+config SANDBOX_TIMER
+	bool "Sandbox Timer support"
+	depends on SANDBOX && TIMER
+	help
+	  Select this to enable an emulated timer for sandbox. It gets
+	  time from host os.
+
 endmenu
 endmenu

+ 1 - 0
drivers/timer/Makefile

@@ -6,3 +6,4 @@
 
 
 obj-$(CONFIG_TIMER)		+= timer-uclass.o
 obj-$(CONFIG_TIMER)		+= timer-uclass.o
 obj-$(CONFIG_ALTERA_TIMER)	+= altera_timer.o
 obj-$(CONFIG_ALTERA_TIMER)	+= altera_timer.o
+obj-$(CONFIG_SANDBOX_TIMER)	+= sandbox_timer.o

+ 53 - 0
drivers/timer/sandbox_timer.c

@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 Thomas Chou <thomas@wytron.com.tw>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <timer.h>
+#include <os.h>
+
+/* system timer offset in ms */
+static unsigned long sandbox_timer_offset;
+
+void sandbox_timer_add_offset(unsigned long offset)
+{
+	sandbox_timer_offset += offset;
+}
+
+static int sandbox_timer_get_count(struct udevice *dev, unsigned long *count)
+{
+	*count = os_get_nsec() / 1000 + sandbox_timer_offset * 1000;
+
+	return 0;
+}
+
+static int sandbox_timer_probe(struct udevice *dev)
+{
+	struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
+
+	uc_priv->clock_rate = 1000000;
+
+	return 0;
+}
+
+static const struct timer_ops sandbox_timer_ops = {
+	.get_count = sandbox_timer_get_count,
+};
+
+static const struct udevice_id sandbox_timer_ids[] = {
+	{ .compatible = "sandbox,timer" },
+	{ }
+};
+
+U_BOOT_DRIVER(sandbox_timer) = {
+	.name	= "sandbox_timer",
+	.id	= UCLASS_TIMER,
+	.of_match = sandbox_timer_ids,
+	.probe = sandbox_timer_probe,
+	.ops	= &sandbox_timer_ops,
+	.flags = DM_FLAG_PRE_RELOC,
+};

+ 2 - 0
include/configs/sandbox.h

@@ -19,7 +19,9 @@
 #define CONFIG_IO_TRACE
 #define CONFIG_IO_TRACE
 #define CONFIG_CMD_IOTRACE
 #define CONFIG_CMD_IOTRACE
 
 
+#ifndef CONFIG_TIMER
 #define CONFIG_SYS_TIMER_RATE		1000000
 #define CONFIG_SYS_TIMER_RATE		1000000
+#endif
 
 
 #define CONFIG_SYS_STDIO_DEREGISTER
 #define CONFIG_SYS_STDIO_DEREGISTER
 
 

+ 1 - 0
test/dm/Makefile

@@ -33,5 +33,6 @@ obj-y += syscon.o
 obj-$(CONFIG_DM_USB) += usb.o
 obj-$(CONFIG_DM_USB) += usb.o
 obj-$(CONFIG_DM_PMIC) += pmic.o
 obj-$(CONFIG_DM_PMIC) += pmic.o
 obj-$(CONFIG_DM_REGULATOR) += regulator.o
 obj-$(CONFIG_DM_REGULATOR) += regulator.o
+obj-$(CONFIG_TIMER) += timer.o
 obj-$(CONFIG_ADC) += adc.o
 obj-$(CONFIG_ADC) += adc.o
 endif
 endif

+ 27 - 0
test/dm/timer.c

@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 Thomas Chou <thomas@wytron.com.tw>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <timer.h>
+#include <dm/test.h>
+#include <test/ut.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Basic test of the timer uclass.
+ */
+static int dm_test_timer_base(struct unit_test_state *uts)
+{
+	struct udevice *dev;
+
+	ut_assertok(uclass_get_device(UCLASS_TIMER, 0, &dev));
+	ut_asserteq(1000000, timer_get_rate(dev));
+
+	return 0;
+}
+DM_TEST(dm_test_timer_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);