Perfect! The headers move patch has been completed, I will send it together
with the other updates to come.
DanielH
On 02/27/2015 03:06 PM, Gedare Bloom wrote:
Yes I prefer to have fixes posted as a follow-up patch. We don't need
to slog through another 100 patches for a few tweaks.
Gedare
On Fri, Feb 27, 2015 at 5:39 AM, Joel Sherrill
<joel.sherr...@oarcorp.com> wrote:
On February 27, 2015 3:55:22 AM EST, Daniel Hellstrom <dan...@gaisler.com>
wrote:
On 02/26/2015 07:13 PM, Gedare Bloom wrote:
bsp-specific headers should not be installed to include/. this has
historically been allowed but we want to get away from it.
Ok, this is a problem for all drivers I submit. I will add a patch in
the end to move all existing BSP drivers and all new BSP drivers
headers into include/bsp. Is that okay?
I think so. Given the number of patches, this may be hard to do and rebase.
Plus it isn't merging something that does not build.
On Thu, Feb 26, 2015 at 11:38 AM, Daniel Hellstrom
<dan...@gaisler.com> wrote:
Last timer instance of GPTIMER is sometimes a watchdog timer that
can reset the system on timer underflow.
---
c/src/lib/libbsp/sparc/leon3/Makefile.am | 2 +
c/src/lib/libbsp/sparc/leon3/include/watchdog.h | 49
++++++++++++
c/src/lib/libbsp/sparc/leon3/preinstall.am | 4 +
c/src/lib/libbsp/sparc/leon3/timer/watchdog.c | 90
+++++++++++++++++++++++
4 files changed, 145 insertions(+), 0 deletions(-)
create mode 100644 c/src/lib/libbsp/sparc/leon3/include/watchdog.h
create mode 100644 c/src/lib/libbsp/sparc/leon3/timer/watchdog.c
diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am
b/c/src/lib/libbsp/sparc/leon3/Makefile.am
index cec0b34..4cb6e79 100644
--- a/c/src/lib/libbsp/sparc/leon3/Makefile.am
+++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am
@@ -125,6 +125,8 @@ libbsp_a_SOURCES +=
../../sparc/shared/i2c/i2cmst.c
# timer
libbsp_a_SOURCES += timer/timer.c
+libbsp_a_SOURCES += timer/watchdog.c
+include_HEADERS += include/watchdog.h
# Cache
libbsp_a_SOURCES += ../../../libcpu/shared/src/cache_manager.c
diff --git a/c/src/lib/libbsp/sparc/leon3/include/watchdog.h
b/c/src/lib/libbsp/sparc/leon3/include/watchdog.h
new file mode 100644
index 0000000..fd984e1
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/leon3/include/watchdog.h
@@ -0,0 +1,49 @@
+/* watchdog.h
+ *
+ * The LEON3 BSP timer watch-dog interface
+ *
+ * COPYRIGHT (c) 2012.
+ * Cobham Gaisler AB.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#ifndef __WATCHDOG_H__
+#define __WATCHDOG_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Initialize BSP watchdog routines. Returns number of watchdog
timers found.
+ * Currently only one is supported.
+ */
+int bsp_watchdog_init(void);
+
+/* Reload watchdog (last timer on the first GPTIMER core), all
systems does not
+ * feature a watchdog, it is expected that if this function is
called the
+ * user knows that there is a watchdog available.
+ *
+ * The prescaler is normally set to number of MHz of system, this
is to
+ * make the system clock tick be stable.
+ *
+ * Arguments
+ * watchdog - Always 0 for now
+ * reload_value - Number of timer clocks (after prescaler) to
count before
+ * watchdog is woken.
+ */
+void bsp_watchdog_reload(int watchdog, unsigned int reload_value);
+
+/* Stop watchdog timer */
+void bsp_watchdog_stop(int watchdog);
+
+/* Use watchdog0 timer to reset the system */
+void bsp_watchdog_system_reset(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/c/src/lib/libbsp/sparc/leon3/preinstall.am
b/c/src/lib/libbsp/sparc/leon3/preinstall.am
index d7b28e4..0c0139f 100644
--- a/c/src/lib/libbsp/sparc/leon3/preinstall.am
+++ b/c/src/lib/libbsp/sparc/leon3/preinstall.am
@@ -165,3 +165,7 @@ $(PROJECT_INCLUDE)/i2cmst.h:
../../sparc/shared/include/i2cmst.h $(PROJECT_INCLU
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/i2cmst.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/i2cmst.h
+$(PROJECT_INCLUDE)/watchdog.h: include/watchdog.h
$(PROJECT_INCLUDE)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/watchdog.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/watchdog.h
+
diff --git a/c/src/lib/libbsp/sparc/leon3/timer/watchdog.c
b/c/src/lib/libbsp/sparc/leon3/timer/watchdog.c
new file mode 100644
index 0000000..15e2142
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/leon3/timer/watchdog.c
@@ -0,0 +1,90 @@
+/* GPTIMER Watchdog timer routines. On some systems the first
GPTIMER
+ * core's last Timer instance underflow signal is connected to
system
+ * reset.
+ *
+ * COPYRIGHT (c) 2012.
+ * Cobham Gaisler AB.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#include <bsp.h>
+#include <watchdog.h>
+#include <grlib.h>
+
+extern volatile struct gptimer_regs *LEON3_Timer_Regs;
+
+struct gptimer_watchdog_priv {
+ struct gptimer_regs *regs;
+ struct gptimer_timer_regs *timer;
+ int timerno;
+};
+
+struct gptimer_watchdog_priv bsp_watchdogs[1];
+int bsp_watchdog_count = 0;
+
+int bsp_watchdog_init(void)
+{
+ int timercnt;
+
+ if (!LEON3_Timer_Regs)
+ return 0;
+
+ /* Get Watchdogs in system, this is implemented for one GPTIMER
core
+ * only.
+ *
+ * First watchdog is a special case, we can get the first timer
core by
+ * looking at LEON3_Timer_Regs, the watchdog within a timer core
is
+ * always the last timer. Unfortunately we can not know it the
watchdog
+ * functionality is available or not, we assume that it is if we
+ * reached this function.
+ */
+ bsp_watchdogs[0].regs = (struct gptimer_regs *)LEON3_Timer_Regs;
+
+ /* Find Timer that has watchdog functionality */
+ timercnt = bsp_watchdogs[0].regs->cfg & 0x7;
+ if (timercnt < 2) /* First timer system clock timer */
+ return 0;
+
+ bsp_watchdogs[0].timerno = timercnt - 1;
+ bsp_watchdogs[0].timer =
&bsp_watchdogs[0].regs->timer[bsp_watchdogs[0].timerno];
+
+ bsp_watchdog_count = 1;
+ return bsp_watchdog_count;
+}
+
+void bsp_watchdog_reload(int watchdog, unsigned int reload_value)
+{
+ if (bsp_watchdog_count == 0)
+ bsp_watchdog_init();
+
+ if (bsp_watchdog_count <= watchdog)
+ return;
+
+ /* Kick watchdog, and clear interrupt pending bit */
+ bsp_watchdogs[watchdog].timer->reload = reload_value;
+ bsp_watchdogs[watchdog].timer->ctrl =
+ (LEON3_GPTIMER_LD | LEON3_GPTIMER_EN) |
+ (bsp_watchdogs[watchdog].timer->ctrl & ~(1<<4));
+}
+
+void bsp_watchdog_stop(int watchdog)
+{
+ if (bsp_watchdog_count == 0)
+ bsp_watchdog_init();
+
+ if (bsp_watchdog_count <= watchdog)
+ return;
+
+ /* Stop watchdog timer */
+ bsp_watchdogs[watchdog].timer->ctrl = 0;
+}
+
+/* Use watchdog timer to reset system */
+void bsp_watchdog_system_reset(void)
+{
+ sparc_disable_interrupts();
+ bsp_watchdog_reload(0, 1);
+}
--
1.7.0.4
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel
--joel
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel