[PATCH v2 09/15] HiFive1: add clock driver support
Denis Obrezkov
denisobrezkov at gmail.com
Mon Aug 21 23:56:26 UTC 2017
---
c/src/lib/libbsp/riscv32/hifive1/clock/clock.c | 60 ++++++++++++++++++++++++
c/src/lib/libbsp/riscv32/hifive1/include/fe310.h | 5 +-
c/src/lib/libbsp/riscv32/hifive1/include/irq.h | 6 ++-
c/src/lib/libbsp/riscv32/hifive1/irq/irq.c | 4 +-
4 files changed, 71 insertions(+), 4 deletions(-)
create mode 100644 c/src/lib/libbsp/riscv32/hifive1/clock/clock.c
diff --git a/c/src/lib/libbsp/riscv32/hifive1/clock/clock.c b/c/src/lib/libbsp/riscv32/hifive1/clock/clock.c
new file mode 100644
index 0000000..ce20663
--- /dev/null
+++ b/c/src/lib/libbsp/riscv32/hifive1/clock/clock.c
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2017 Denis Obrezkov <denisobrezkov at gmail.com>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <bsp/irq.h>
+#include <bsp/fatal.h>
+#include <bsp/fe310.h>
+
+static void FE310_clock_driver_support_install_isr(
+ rtems_isr_entry Clock_isr
+)
+{
+ rtems_status_code sc = RTEMS_SUCCESSFUL;
+
+ sc = rtems_interrupt_handler_install(
+ 1,
+ "Clock",
+ RTEMS_INTERRUPT_UNIQUE,
+ (rtems_interrupt_handler) Clock_isr,
+ NULL
+ );
+ if ( sc != RTEMS_SUCCESSFUL ) {
+ rtems_fatal_error_occurred(0xdeadbeef);
+ }
+}
+
+static void FE310_clock_driver_support_at_tick ( void )
+{
+ (*MTIMECMP) += FE310_CLOCK_PERIOD;
+}
+
+static void FE310_clock_init ( void )
+{
+ (*MTIMECMP) = (*MTIME) + FE310_CLOCK_PERIOD;
+ enable_mtime_interrupts();
+}
+
+static void FE310_clock_driver_support_shutdown_hardware( void )
+{
+}
+
+#define Clock_driver_support_initialize_hardware() \
+ FE310_clock_init()
+
+#define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER
+
+#define Clock_driver_support_install_isr(isr,old) \
+ FE310_clock_driver_support_install_isr ( isr )
+
+#define Clock_driver_support_at_tick() \
+ FE310_clock_driver_support_at_tick()
+
+#define Clock_driver_support_shutdown_hardware() \
+ FE310_clock_driver_support_shutdown_hardware()
+
+#include "../../../shared/clockdrv_shell.h"
diff --git a/c/src/lib/libbsp/riscv32/hifive1/include/fe310.h b/c/src/lib/libbsp/riscv32/hifive1/include/fe310.h
index c73db99..e32bc38 100644
--- a/c/src/lib/libbsp/riscv32/hifive1/include/fe310.h
+++ b/c/src/lib/libbsp/riscv32/hifive1/include/fe310.h
@@ -23,8 +23,11 @@
#define USE_PLL
/* Clock parameters */
+/*
+ * FIXME: 512 is a good value just to try out the BSP,
+ * but additional configuration is required
+ */
#define FE310_CLOCK_PERIOD 512
-#define CONFIGURE_MICROSECONDS_PER_TICK 15625
#endif /* FE310_H */
diff --git a/c/src/lib/libbsp/riscv32/hifive1/include/irq.h b/c/src/lib/libbsp/riscv32/hifive1/include/irq.h
index 46d29c7..8f44089 100644
--- a/c/src/lib/libbsp/riscv32/hifive1/include/irq.h
+++ b/c/src/lib/libbsp/riscv32/hifive1/include/irq.h
@@ -47,7 +47,6 @@
#define BSP_INTERRUPT_VECTOR_MIN 0x0
#define BSP_INTERRUPT_VECTOR_MAX 0x24
-
#define MCAUSE_INT 0x80000000
#define MCAUSE_MSWI 0x3
@@ -65,5 +64,10 @@
#define MTIME ((volatile uint64_t *)0x0200bff8)
#define MSIP_REG ((volatile uint32_t *) 0x02000000)
+static inline void enable_mtime_interrupts() {
+ asm volatile ("li t0, 0x80\n\t"
+ "csrs mie, t0");
+}
+
#endif /* ASM */
#endif /* LIBBSP_GENERIC_RISCV_IRQ_H */
diff --git a/c/src/lib/libbsp/riscv32/hifive1/irq/irq.c b/c/src/lib/libbsp/riscv32/hifive1/irq/irq.c
index fadfdb7..7d7a80b 100644
--- a/c/src/lib/libbsp/riscv32/hifive1/irq/irq.c
+++ b/c/src/lib/libbsp/riscv32/hifive1/irq/irq.c
@@ -70,8 +70,8 @@ void handle_trap (uint32_t cause)
if (cause & MCAUSE_INT) {
/* an interrupt occurred */
if ((cause & MCAUSE_MTIME) == MCAUSE_MTIME) {
- /* Timer interrupt */
- (*MTIMECMP) = (*MTIME) + FE310_CLOCK_PERIOD;
+ /* Timer interrupt */
+ /* TODO: Proper (not manual) dispatching should be implemented */
bsp_interrupt_handler_table[1].handler(bsp_interrupt_handler_table[1].arg);
} else if ((cause & MCAUSE_MEXT) == MCAUSE_MEXT) {
/*External interrupt */
--
2.1.4
More information about the devel
mailing list