Refactor BeRTOS to be in his own directory.
[bertos.git] / bertos / drv / wdt.h
1 /**
2  * \file
3  * <!--
4  * This file is part of BeRTOS.
5  *
6  * Bertos is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  * As a special exception, you may use this file as part of a free software
21  * library without restriction.  Specifically, if other files instantiate
22  * templates or use macros or inline functions from this file, or you compile
23  * this file and link it with other files to produce an executable, this
24  * file does not by itself cause the resulting executable to be covered by
25  * the GNU General Public License.  This exception does not however
26  * invalidate any other reasons why the executable file might be covered by
27  * the GNU General Public License.
28  *
29  * Copyright 2004 Develer S.r.l. (http://www.develer.com/)
30  *
31  * -->
32  *
33  * \version $Id$
34  *
35  * \author Bernardo Innocenti <bernie@develer.com>
36  *
37  * \brief Watchdog interface
38  */
39
40 #ifndef DRV_WDT_H
41 #define DRV_WDT_H
42
43 #include <appconfig.h>
44 #include <cfg/compiler.h> // INLINE
45 #include <cfg/arch_config.h>
46
47 /* Configury sanity check */
48 #if !defined(CONFIG_WATCHDOG) || (CONFIG_WATCHDOG != 0 && CONFIG_WATCHDOG != 1)
49         #error CONFIG_WATCHDOG must be defined to either 0 or 1
50 #endif
51
52 #if CONFIG_WATCHDOG
53         #include <cpu/detect.h>
54         #include <cfg/os.h>
55
56         #if OS_QT
57                 #if _QT < 4
58                         #include <qapplication.h>
59                 #else
60                         #include <QtGui/QApplication>
61                 #endif
62         #elif OS_POSIX
63                 #include <sys/select.h>
64         #elif CPU_AVR
65                 #include <avr/io.h>
66                 #include <cfg/macros.h> // BV()
67                 #if CPU_AVR_ATMEGA1281  // Name is different in atmega1281
68                         #define WDTCR WDTCSR
69                 #endif
70         #elif defined(ARCH_FREERTOS) && (ARCH & ARCH_FREERTOS)
71                 #include <task.h> /* taskYIELD() */
72         #else
73                 #error unknown CPU
74         #endif
75 #endif /* CONFIG_WATCHDOG */
76
77 /**
78  * Reset the watchdog timer.
79  */
80 INLINE void wdt_reset(void)
81 {
82 #if CONFIG_WATCHDOG
83         #if OS_QT
84                 // Let Qt handle events
85                 ASSERT(qApp);
86                 qApp->processEvents();
87         #elif OS_POSIX
88                 static struct timeval tv = { 0, 0 };
89                 select(0, NULL, NULL, NULL, &tv);
90         #elif defined(ARCH_FREERTOS) && (ARCH & ARCH_FREERTOS)
91                 vTaskDelay(1);
92         #elif CPU_AVR
93                 __asm__ __volatile__ ("wdr");
94         #else
95                 #error unknown CPU
96         #endif
97 #endif /* CONFIG_WATCHDOG */
98 }
99
100 /**
101  * Set watchdog timer timeout.
102  *
103  * \param timeout  0: 16.3ms, 7: 2.1s
104  */
105 INLINE void wdt_init(uint8_t timeout)
106 {
107 #if CONFIG_WATCHDOG
108         #if OS_QT
109                 // Create a dummy QApplication object
110                 if (!qApp)
111                 {
112                         int argc;
113                         new QApplication(argc, (char **)NULL);
114                 }
115                 (void)timeout;
116         #elif OS_POSIX
117                 (void)timeout; // NOP
118         #elif defined(ARCH_FREERTOS) && (ARCH & ARCH_FREERTOS)
119                 /* nop */
120         #elif CPU_AVR
121                 WDTCR |= BV(WDCE) | BV(WDE);
122                 WDTCR = timeout;
123         #else
124                 #error unknown CPU
125         #endif
126 #else
127         (void)timeout;
128 #endif /* CONFIG_WATCHDOG */
129 }
130
131 INLINE void wdt_start(void)
132 {
133 #if CONFIG_WATCHDOG
134         #if OS_QT
135                 // NOP
136         #elif OS_POSIX
137                 // NOP
138         #elif defined(ARCH_FREERTOS) && (ARCH & ARCH_FREERTOS)
139                 /* nop */
140         #elif CPU_AVR
141                 WDTCR |= BV(WDE);
142         #else
143                 #error unknown CPU
144         #endif
145 #endif /* CONFIG_WATCHDOG */
146 }
147
148 INLINE void wdt_stop(void)
149 {
150 #if CONFIG_WATCHDOG
151         #if OS_QT
152                 // NOP
153         #elif OS_POSIX
154                 // NOP
155         #elif defined(ARCH_FREERTOS) && (ARCH & ARCH_FREERTOS)
156                 /* nop */
157         #elif CPU_AVR
158                 WDTCR |= BV(WDCE) | BV(WDE);
159                 WDTCR &= ~BV(WDE);
160         #else
161                 #error unknown CPU
162         #endif
163 #endif /* CONFIG_WATCHDOG */
164 }
165
166 #endif /* DRV_WDT_H */