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