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

Daniel Hellstrom daniel at gaisler.com
Fri Feb 27 14:18:42 UTC 2015


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.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