[PATCH 002/111] LEON3: GPTIMER timer watchdog driver

Joel Sherrill joel.sherrill at oarcorp.com
Fri Feb 27 10:39:27 UTC 2015



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