From e4ff61ff6c5fa97beceec0cdb68c758c5f8b0fec Mon Sep 17 00:00:00 2001 From: Andre Guedes Date: Thu, 2 Jul 2015 17:57:03 -0300 Subject: [PATCH] galileo: Support for rtimer library This patch adds support for rtimer library on Galileo's platform. We use the PIT to implement the rtimer platform dependent functionalities. We chose the PIT for mainly two reason: I) its configuration is very simple II) it has a high frequency which provides us a good clock resolution (requirement from rtimer library). Since we keep track of the number of ticks in software, we define rtimer_clock_t type as uint64_t. This gives us a good amount of time til the variable overflows. For instance, a 32-bit type would overflow in about one hour for high clock resolution (~ 1us). The rtimer clock frequency (RTIMER_ARCH_SECOND) is setup to 1 kHz. There is no technical matter regarding this value. It is just an initial guess. Just for the record, we might want to use HPET in future to implement the rtimer library since it seems to be more appropriate. The reason why we don't use it at this moment is that, in order to configure it, we need support for ACPI 2.0 which we don't. Once we have use-cases for the rtimer library we'll probably replace PIT by HPET or any other timer more suitable for the job. --- platform/galileo/Makefile.galileo | 2 +- platform/galileo/contiki-conf.h | 4 ++ platform/galileo/contiki-main.c | 1 + platform/galileo/rtimer-arch.c | 65 +++++++++++++++++++++++++++++++ platform/galileo/rtimer-arch.h | 2 + 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 platform/galileo/rtimer-arch.c diff --git a/platform/galileo/Makefile.galileo b/platform/galileo/Makefile.galileo index 350f0c899..9fd8b60ba 100644 --- a/platform/galileo/Makefile.galileo +++ b/platform/galileo/Makefile.galileo @@ -3,7 +3,7 @@ LIBGCC_PATH = /usr/lib/gcc/$(shell gcc -dumpmachine)/$(shell gcc -dumpversion) CONTIKI_TARGET_DIRS = . CONTIKI_TARGET_MAIN = ${addprefix $(OBJECTDIR)/,contiki-main.o} -CONTIKI_SOURCEFILES += contiki-main.c newlib-syscalls.c loader.S clock.c +CONTIKI_SOURCEFILES += contiki-main.c newlib-syscalls.c loader.S clock.c rtimer-arch.c LINKERSCRIPT = $(CONTIKI)/platform/galileo/galileo.ld diff --git a/platform/galileo/contiki-conf.h b/platform/galileo/contiki-conf.h index 8cc6aa9d6..4f1b0fe4b 100644 --- a/platform/galileo/contiki-conf.h +++ b/platform/galileo/contiki-conf.h @@ -36,6 +36,10 @@ #define CLOCK_CONF_SECOND 128 typedef unsigned long clock_time_t; +typedef uint64_t rtimer_clock_t; +#define RTIMER_ARCH_SECOND 1024 +#define RTIMER_CLOCK_LT(a, b) ((int64_t)((a) - (b)) < 0) + /* We define the following macros and types otherwise Contiki does not * compile. */ diff --git a/platform/galileo/contiki-main.c b/platform/galileo/contiki-main.c index 53b7f9cb1..199ae45cc 100644 --- a/platform/galileo/contiki-main.c +++ b/platform/galileo/contiki-main.c @@ -37,6 +37,7 @@ main(void) { cpu_init(); clock_init(); + rtimer_init(); ENABLE_IRQ(); diff --git a/platform/galileo/rtimer-arch.c b/platform/galileo/rtimer-arch.c new file mode 100644 index 000000000..862c26692 --- /dev/null +++ b/platform/galileo/rtimer-arch.c @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2015, Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "sys/rtimer.h" + +#include "contiki-conf.h" +#include "drivers/pit.h" + +static volatile rtimer_clock_t tick_count = 0; +static rtimer_clock_t trigger = UINT64_MAX; + +static void +update_ticks(void) +{ + if(++tick_count >= trigger) { + /* Disable trigger by assigning it to the maximum value */ + trigger = UINT64_MAX; + rtimer_run_next(); + } +} +/*---------------------------------------------------------------------------*/ +void +rtimer_arch_init(void) +{ + pit_init(RTIMER_ARCH_SECOND, update_ticks); +} +/*---------------------------------------------------------------------------*/ +rtimer_clock_t +rtimer_arch_now() +{ + return tick_count; +} +/*---------------------------------------------------------------------------*/ +void +rtimer_arch_schedule(rtimer_clock_t t) +{ + trigger = t; +} diff --git a/platform/galileo/rtimer-arch.h b/platform/galileo/rtimer-arch.h index 086602aa2..3f12056e1 100644 --- a/platform/galileo/rtimer-arch.h +++ b/platform/galileo/rtimer-arch.h @@ -31,4 +31,6 @@ #ifndef RTIMER_ARCH_H #define RTIMER_ARCH_H +rtimer_clock_t rtimer_arch_now(); + #endif /* RTIMER_ARCH_H */