[PATCH 002/111] LEON3: GPTIMER timer watchdog driver
Gedare Bloom
gedare at rtems.org
Fri Feb 27 14:06:25 UTC 2015
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.sherrill at oarcorp.com> wrote:
>
>
> On February 27, 2015 3:55:22 AM EST, Daniel Hellstrom <daniel at 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
>><daniel at 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 at rtems.org
>>>> http://lists.rtems.org/mailman/listinfo/devel
>>
>>_______________________________________________
>>devel mailing list
>>devel at rtems.org
>>http://lists.rtems.org/mailman/listinfo/devel
>
> --joel
More information about the devel
mailing list