diff options
author | Thomas Chou <thomas@wytron.com.tw> | 2015-10-30 15:35:52 +0800 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2015-11-19 20:13:41 -0700 |
commit | 9961a0b6fbe199cd7b08203415a905c4c7d0a731 (patch) | |
tree | b0237f5dba73dc69f63d4d3dca28a1f4195c3cd0 /drivers | |
parent | 67521957605494a11fa5161dcc54757dc5b6b8a1 (diff) |
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/timer/Kconfig | 7 | ||||
-rw-r--r-- | drivers/timer/Makefile | 1 | ||||
-rw-r--r-- | drivers/timer/sandbox_timer.c | 53 |
3 files changed, 61 insertions, 0 deletions
diff --git a/drivers/timer/Kconfig b/drivers/timer/Kconfig index 97c4128005..601e493d4f 100644 --- a/drivers/timer/Kconfig +++ b/drivers/timer/Kconfig @@ -16,4 +16,11 @@ config ALTERA_TIMER Select this to enable an timer for Altera devices. Please find 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 diff --git a/drivers/timer/Makefile b/drivers/timer/Makefile index ae66c07d0e..300946e8d9 100644 --- a/drivers/timer/Makefile +++ b/drivers/timer/Makefile @@ -6,3 +6,4 @@ obj-$(CONFIG_TIMER) += timer-uclass.o obj-$(CONFIG_ALTERA_TIMER) += altera_timer.o +obj-$(CONFIG_SANDBOX_TIMER) += sandbox_timer.o diff --git a/drivers/timer/sandbox_timer.c b/drivers/timer/sandbox_timer.c new file mode 100644 index 0000000000..38de76365c --- /dev/null +++ b/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, +}; |