timer: added timer driver for the pulpino SOC
The pulpino_timer driver does not implement TICKLESS_IDLE
for the time being.
Change-Id: I0cce8c8a7e203d551a924863462e6c86af4c98ff
Signed-off-by: Jean-Paul Etienne <fractalclone@gmail.com>
diff --git a/drivers/timer/Kconfig b/drivers/timer/Kconfig
index c5b4ef1..903c4cb 100644
--- a/drivers/timer/Kconfig
+++ b/drivers/timer/Kconfig
@@ -159,6 +159,14 @@
Counter NRF_RTC1 and provides the standard "system clock driver"
interfaces.
+config PULPINO_TIMER
+ bool "pulpino Timer"
+ default y
+ depends on SOC_RISCV32_PULPINO
+ help
+ This module implements a kernel device driver for the pulpino processor
+ timer driver. It provides the standard "system clock driver" interfaces.
+
config SYSTEM_CLOCK_DISABLE
bool "API to disable system clock"
default n
diff --git a/drivers/timer/Makefile b/drivers/timer/Makefile
index f85466b..f33cf73 100644
--- a/drivers/timer/Makefile
+++ b/drivers/timer/Makefile
@@ -3,6 +3,7 @@
obj-$(CONFIG_ARCV2_TIMER) += arcv2_timer0.o
obj-$(CONFIG_ALTERA_AVALON_TIMER) += altera_avalon_timer.o
obj-$(CONFIG_NRF_RTC_TIMER) += nrf_rtc_timer.o
+obj-$(CONFIG_PULPINO_TIMER) += pulpino_timer.o
obj-$(CONFIG_CORTEX_M_SYSTICK) += cortex_m_systick.o
diff --git a/drivers/timer/pulpino_timer.c b/drivers/timer/pulpino_timer.c
new file mode 100644
index 0000000..3ee55ae
--- /dev/null
+++ b/drivers/timer/pulpino_timer.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016 Jean-Paul Etienne <fractalclone@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <kernel.h>
+#include <arch/cpu.h>
+#include <device.h>
+#include <system_timer.h>
+#include <board.h>
+
+/* Timer Ctrl Bitfields */
+#define TIMER_CTRL_EN (1 << 0) /* Timer Enable Bit */
+#define TIMER_CTRL_PRE(x) (((x) & 0x07) << 3) /* Prescaler Value */
+
+typedef struct {
+ uint32_t val;
+ uint32_t ctrl;
+ uint32_t cmp;
+} pulpino_timer_t;
+
+static volatile pulpino_timer_t *timer = (pulpino_timer_t *)PULP_TIMER_A_BASE;
+
+static uint32_t accumulated_cycle_count;
+
+static void pulpino_timer_irq_handler(void *unused)
+{
+ ARG_UNUSED(unused);
+
+ /* Reset counter */
+ timer->val = 0;
+
+ accumulated_cycle_count += sys_clock_hw_cycles_per_tick;
+
+ _sys_clock_tick_announce();
+}
+
+#ifdef CONFIG_TICKLESS_IDLE
+#error "Tickless idle not yet implemented for pulpino timer"
+#endif
+
+int _sys_clock_driver_init(struct device *device)
+{
+ ARG_UNUSED(device);
+ IRQ_CONNECT(PULP_TIMER_A_CMP_IRQ, 0,
+ pulpino_timer_irq_handler, NULL, 0);
+ irq_enable(PULP_TIMER_A_CMP_IRQ);
+
+ /*
+ * Initialize timer.
+ * Reset counter and set timer to generate interrupt
+ * every sys_clock_hw_cycles_per_tick
+ */
+ timer->val = 0;
+ timer->cmp = sys_clock_hw_cycles_per_tick;
+ timer->ctrl = TIMER_CTRL_EN;
+
+ return 0;
+}
+
+/**
+ *
+ * @brief Read the platform's timer hardware
+ *
+ * This routine returns the current time in terms of timer hardware clock
+ * cycles.
+ *
+ * @return up counter of elapsed clock cycles
+ */
+uint32_t k_cycle_get_32(void)
+{
+ return accumulated_cycle_count + timer->val;
+}