aboutsummaryrefslogtreecommitdiff
path: root/tmk_core/protocol/iwrap/wd.h
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/protocol/iwrap/wd.h')
-rw-r--r--tmk_core/protocol/iwrap/wd.h161
1 files changed, 0 insertions, 161 deletions
diff --git a/tmk_core/protocol/iwrap/wd.h b/tmk_core/protocol/iwrap/wd.h
deleted file mode 100644
index 083d6d44d..000000000
--- a/tmk_core/protocol/iwrap/wd.h
+++ /dev/null
@@ -1,161 +0,0 @@
1/* This is from http://www.mtcnet.net/~henryvm/wdt/ */
2#ifndef _AVR_WD_H_
3#define _AVR_WD_H_
4
5#include <avr/io.h>
6
7/*
8Copyright (c) 2009, Curt Van Maanen
9
10Permission to use, copy, modify, and/or distribute this software for any
11purpose with or without fee is hereby granted, provided that the above
12copyright notice and this permission notice appear in all copies.
13
14THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
15WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
16MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
17ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21
22
23include usage-
24 #include "wd.h" //if in same directory as project
25 #include <avr/wd.h> //if wd.h is in avr directory
26
27set watchdog modes and prescale
28
29usage-
30 WD_SET(mode,[timeout]); //prescale always set
31
32modes-
33 WD_OFF disabled
34 WD_RST normal reset mode
35 WD_IRQ interrupt only mode (if supported)
36 WD_RST_IRQ interrupt+reset mode (if supported)
37
38timeout-
39 WDTO_15MS default if no timeout provided
40 WDTO_30MS
41 WDTO_60MS
42 WDTO_120MS
43 WDTO_250MS
44 WDTO_500MS
45 WDTO_1S
46 WDTO_2S
47 WDTO_4S (if supported)
48 WDTO_8S (if supported)
49
50examples-
51 WD_SET(WD_RST,WDTO_1S); //reset mode, 1s timeout
52 WD_SET(WD_OFF); //watchdog disabled (if not fused on)
53 WD_SET(WD_RST); //reset mode, 15ms (default timeout)
54 WD_SET(WD_IRQ,WDTO_120MS); //interrupt only mode, 120ms timeout
55 WD_SET(WD_RST_IRQ,WDTO_2S); //interrupt+reset mode, 2S timeout
56
57
58for enhanced watchdogs, if the watchdog is not being used WDRF should be
59cleared on every power up or reset, along with disabling the watchdog-
60 WD_DISABLE(); //clear WDRF, then turn off watchdog
61
62*/
63
64// reset registers to the same name (MCUCSR)
65#if !defined(MCUCSR)
66# define MCUCSR MCUSR
67#endif
68
69// watchdog registers to the same name (WDTCSR)
70#if !defined(WDTCSR)
71# define WDTCSR WDTCR
72#endif
73
74// if enhanced watchdog, define irq values, create disable macro
75#if defined(WDIF)
76# define WD_IRQ 0xC0
77# define WD_RST_IRQ 0xC8
78# define WD_DISABLE() \
79 do { \
80 MCUCSR &= ~(1 << WDRF); \
81 WD_SET(WD_OFF); \
82 } while (0)
83#endif
84
85// all watchdogs
86#define WD_RST 8
87#define WD_OFF 0
88
89// prescale values
90#define WDTO_15MS 0
91#define WDTO_30MS 1
92#define WDTO_60MS 2
93#define WDTO_120MS 3
94#define WDTO_250MS 4
95#define WDTO_500MS 5
96#define WDTO_1S 6
97#define WDTO_2S 7
98
99// prescale values for avrs with WDP3
100#if defined(WDP3)
101# define WDTO_4S 0x20
102# define WDTO_8S 0x21
103#endif
104
105// watchdog reset
106#define WDR() __asm__ __volatile__("wdr")
107
108// avr reset using watchdog
109#define WD_AVR_RESET() \
110 do { \
111 __asm__ __volatile__("cli"); \
112 WD_SET_UNSAFE(WD_RST); \
113 while (1) \
114 ; \
115 } while (0)
116
117/*set the watchdog-
1181. save SREG
1192. turn off irq's
1203. reset watchdog timer
1214. enable watchdog change
1225. write watchdog value
1236. restore SREG (restoring irq status)
124*/
125#define WD_SET(val, ...) \
126 __asm__ __volatile__("in __tmp_reg__,__SREG__" \
127 "\n\t" \
128 "cli" \
129 "\n\t" \
130 "wdr" \
131 "\n\t" \
132 "sts %[wdreg],%[wden]" \
133 "\n\t" \
134 "sts %[wdreg],%[wdval]" \
135 "\n\t" \
136 "out __SREG__,__tmp_reg__" \
137 "\n\t" \
138 : \
139 : [ wdreg ] "M"(&WDTCSR), [ wden ] "r"((uint8_t)(0x18)), [ wdval ] "r"((uint8_t)(val | (__VA_ARGS__ + 0))) \
140 : "r0")
141
142/*set the watchdog when I bit in SREG known to be clear-
1431. reset watchdog timer
1442. enable watchdog change
1455. write watchdog value
146*/
147#define WD_SET_UNSAFE(val, ...) \
148 __asm__ __volatile__("wdr" \
149 "\n\t" \
150 "sts %[wdreg],%[wden]" \
151 "\n\t" \
152 "sts %[wdreg],%[wdval]" \
153 "\n\t" \
154 : \
155 : [ wdreg ] "M"(&WDTCSR), [ wden ] "r"((uint8_t)(0x18)), [ wdval ] "r"((uint8_t)(val | (__VA_ARGS__ + 0))))
156
157// for compatibility with avr/wdt.h
158#define wdt_enable(val) WD_SET(WD_RST, val)
159#define wdt_disable() WD_SET(WD_OFF)
160
161#endif /* _AVR_WD_H_ */