93#define wdt_reset() __asm__ __volatile__ ("wdr")
97#include <bits/attribs.h>
100# define _WD_PS3_MASK _BV(WDP3)
102# define _WD_PS3_MASK 0x00
106# define _WD_CONTROL_REG WDTCSR
108# define _WD_CONTROL_REG WDTCR
110# define _WD_CONTROL_REG WDT
114#define _WD_CHANGE_BIT WDTOE
116#define _WD_CHANGE_BIT WDCE
131#define wdt_enable(timeout)
135#if defined(__AVR_XMEGA__)
137#if defined (WDT_CTRLA) && !defined(RAMPD)
139#define wdt_enable(timeout) \
142 __asm__ __volatile__ ( \
144 "out %i[ccp_reg], %[ioreg_cen_mask]" "\n\t" \
145 "lds %[tmp], %[wdt_reg]" "\n\t" \
146 "sbr %[tmp], %[wdt_enable_timeout]" "\n\t" \
147 "sts %[wdt_reg], %[tmp]" "\n\t" \
148 "1:lds %[tmp], %[wdt_status_reg]" "\n\t" \
149 "sbrc %[tmp], %[wdt_syncbusy_bit]" "\n\t" \
151 : [tmp] "=d" (__temp) \
152 : [ccp_reg] "n" (& CCP), \
153 [ioreg_cen_mask] "r" ((uint8_t)CCP_IOREG_gc), \
154 [wdt_reg] "n" (& WDT_CTRLA), \
155 [wdt_enable_timeout] "M" (timeout), \
156 [wdt_status_reg] "n" (& WDT_STATUS), \
157 [wdt_syncbusy_bit] "I" (WDT_SYNCBUSY_bm) \
161static __ATTR_ALWAYS_INLINE__
165 __asm__ __volatile__ (
167 "out %i[ccp_reg], %[ioreg_cen_mask]" "\n\t"
168 "lds %[tmp], %[wdt_reg]" "\n\t"
169 "cbr %[tmp], %[timeout_mask]" "\n\t"
170 "sts %[wdt_reg], %[tmp]"
171 : [tmp]
"=d" (__temp)
172 : [ccp_reg]
"n" (& CCP),
173 [ioreg_cen_mask]
"r" ((
uint8_t)CCP_IOREG_gc),
174 [wdt_reg]
"n" (& WDT_CTRLA),
175 [timeout_mask]
"I" (WDT_PERIOD_gm)
192#define wdt_enable(timeout) \
195 __asm__ __volatile__ ( \
196 "in __tmp_reg__, %i[rampd]" "\n\t" \
197 "out %i[rampd], __zero_reg__" "\n\t" \
198 "out %i[ccp_reg], %[ioreg_cen_mask]" "\n\t" \
199 "sts %[wdt_reg], %[wdt_enable_timeout]" "\n\t" \
200 "1:lds %[tmp], %[wdt_status_reg]" "\n\t" \
201 "sbrc %[tmp], %[wdt_syncbusy_bit]" "\n\t" \
203 "out %i[rampd], __tmp_reg__" \
204 : [tmp] "=r" (__temp) \
205 : [rampd] "n" (& RAMPD), \
206 [ccp_reg] "n" (& CCP), \
207 [ioreg_cen_mask] "r" ((uint8_t)CCP_IOREG_gc), \
208 [wdt_reg] "n" (& WDT_CTRL), \
209 [wdt_enable_timeout] "r" ((uint8_t)(WDT_CEN_bm \
211 | ((timeout + 1) << 2))), \
212 [wdt_status_reg] "n" (& WDT_STATUS), \
213 [wdt_syncbusy_bit] "I" (WDT_SYNCBUSY_bm) \
217static __ATTR_ALWAYS_INLINE__
220 __asm__ __volatile__ (
221 "in __tmp_reg__, %i[rampd]" "\n\t"
222 "out %i[rampd], __zero_reg__" "\n\t"
223 "out %i[ccp_reg], %[ioreg_cen_mask]" "\n\t"
224 "sts %[wdt_reg], %[disable_mask]" "\n\t"
225 "out %i[rampd], __tmp_reg__"
227 : [rampd]
"n" (& RAMPD),
228 [ccp_reg]
"n" (& CCP),
229 [ioreg_cen_mask]
"r" ((
uint8_t)CCP_IOREG_gc),
230 [wdt_reg]
"n" (& WDT_CTRL),
231 [disable_mask]
"r" ((
uint8_t)((~WDT_ENABLE_bm) | WDT_CEN_bm))
237#elif defined(__AVR_TINY__)
239#define wdt_enable(value) \
240 __asm__ __volatile__ ( \
241 "in __tmp_reg__,__SREG__" "\n\t" \
244 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t" \
245 "out %i[WDTREG],%[WDVALUE]" "\n\t" \
246 "out __SREG__,__tmp_reg__" \
248 : [CCPADDRESS] "n" (& CCP), \
249 [SIGNATURE] "r" ((uint8_t)0xD8), \
250 [WDTREG] "n" (& _WD_CONTROL_REG), \
251 [WDVALUE] "r" ((uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00) \
252 | _BV(WDE) | (value & 0x07) )) \
255static __ATTR_ALWAYS_INLINE__
259 __asm__ __volatile__ (
260 "in __tmp_reg__,__SREG__" "\n\t"
263 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t"
264 "in %[TEMP_WD],%i[WDTREG]" "\n\t"
265 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
266 "out %i[WDTREG],%[TEMP_WD]" "\n\t"
267 "out __SREG__,__tmp_reg__"
268 : [TEMP_WD]
"=d" (__temp_wd)
269 : [CCPADDRESS]
"n" (& CCP),
270 [SIGNATURE]
"r" ((
uint8_t)0xD8),
271 [WDTREG]
"n" (& _WD_CONTROL_REG),
272 [WDVALUE]
"n" (1 << WDE)
278static __ATTR_ALWAYS_INLINE__
281 if (!_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P (_WD_CONTROL_REG))
283 __asm__ __volatile__ (
284 "in __tmp_reg__,__SREG__" "\n\t"
287 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
288 "sts %[WDTREG],%[WDVALUE]" "\n\t"
289 "out __SREG__,__tmp_reg__"
291 : [CCPADDRESS]
"n" (& CCP),
292 [SIGNATURE]
"r" ((
uint8_t)0xD8),
293 [WDTREG]
"n" (& _WD_CONTROL_REG),
294 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
295 |
_BV(WDE) | (value & 0x07) ))
298 else if (!_SFR_IO_REG_P (CCP) && _SFR_IO_REG_P (_WD_CONTROL_REG))
300 __asm__ __volatile__ (
301 "in __tmp_reg__,__SREG__" "\n\t"
304 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
305 "out %i[WDTREG],%[WDVALUE]" "\n\t"
306 "out __SREG__,__tmp_reg__"
308 : [CCPADDRESS]
"n" (& CCP),
309 [SIGNATURE]
"r" ((
uint8_t)0xD8),
310 [WDTREG]
"n" (& _WD_CONTROL_REG),
311 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
312 |
_BV(WDE) | (value & 0x07) ))
315 else if (_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P (_WD_CONTROL_REG))
317 __asm__ __volatile__ (
318 "in __tmp_reg__,__SREG__" "\n\t"
321 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t"
322 "sts %[WDTREG],%[WDVALUE]" "\n\t"
323 "out __SREG__,__tmp_reg__"
325 : [CCPADDRESS]
"n" (& CCP),
326 [SIGNATURE]
"r" ((
uint8_t)0xD8),
327 [WDTREG]
"n" (& _WD_CONTROL_REG),
328 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
329 |
_BV(WDE) | (value & 0x07) ))
334 __asm__ __volatile__ (
335 "in __tmp_reg__,__SREG__" "\n\t"
338 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t"
339 "out %i[WDTREG],%[WDVALUE]" "\n\t"
340 "out __SREG__,__tmp_reg__"
342 : [CCPADDRESS]
"n" (& CCP),
343 [SIGNATURE]
"r" ((
uint8_t)0xD8),
344 [WDTREG]
"n" (& _WD_CONTROL_REG),
345 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
346 |
_BV(WDE) | (value & 0x07) ))
351static __ATTR_ALWAYS_INLINE__
354 if (!_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P(_WD_CONTROL_REG))
357 __asm__ __volatile__ (
358 "in __tmp_reg__,__SREG__" "\n\t"
361 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
362 "lds %[TEMP_WD],%[WDTREG]" "\n\t"
363 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
364 "sts %[WDTREG],%[TEMP_WD]" "\n\t"
365 "out __SREG__,__tmp_reg__"
366 : [TEMP_WD]
"=d" (__temp_wd)
367 : [CCPADDRESS]
"n" (& CCP),
368 [SIGNATURE]
"r" ((
uint8_t)0xD8),
369 [WDTREG]
"n" (& _WD_CONTROL_REG),
370 [WDVALUE]
"n" (1 << WDE)
373 else if (!_SFR_IO_REG_P (CCP) && _SFR_IO_REG_P(_WD_CONTROL_REG))
376 __asm__ __volatile__ (
377 "in __tmp_reg__,__SREG__" "\n\t"
380 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
381 "in %[TEMP_WD],%i[WDTREG]" "\n\t"
382 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
383 "out %i[WDTREG],%[TEMP_WD]" "\n\t"
384 "out __SREG__,__tmp_reg__"
385 : [TEMP_WD]
"=d" (__temp_wd)
386 : [CCPADDRESS]
"n" (& CCP),
387 [SIGNATURE]
"r" ((
uint8_t)0xD8),
388 [WDTREG]
"n" (& _WD_CONTROL_REG),
389 [WDVALUE]
"n" (1 << WDE)
392 else if (_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P(_WD_CONTROL_REG))
395 __asm__ __volatile__ (
396 "in __tmp_reg__,__SREG__" "\n\t"
399 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t"
400 "lds %[TEMP_WD],%[WDTREG]" "\n\t"
401 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
402 "sts %[WDTREG],%[TEMP_WD]" "\n\t"
403 "out __SREG__,__tmp_reg__"
404 : [TEMP_WD]
"=d" (__temp_wd)
405 : [CCPADDRESS]
"n" (& CCP),
406 [SIGNATURE]
"r" ((
uint8_t)0xD8),
407 [WDTREG]
"n" (& _WD_CONTROL_REG),
408 [WDVALUE]
"n" (1 << WDE)
414 __asm__ __volatile__ (
415 "in __tmp_reg__,__SREG__" "\n\t"
418 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t"
419 "in %[TEMP_WD],%i[WDTREG]" "\n\t"
420 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
421 "out %i[WDTREG],%[TEMP_WD]" "\n\t"
422 "out __SREG__,__tmp_reg__"
423 : [TEMP_WD]
"=d" (__temp_wd)
424 : [CCPADDRESS]
"n" (& CCP),
425 [SIGNATURE]
"r" ((
uint8_t)0xD8),
426 [WDTREG]
"n" (& _WD_CONTROL_REG),
427 [WDVALUE]
"n" (1 << WDE)
442static __ATTR_ALWAYS_INLINE__
445 if (_SFR_IO_REG_P (_WD_CONTROL_REG))
447 __asm__ __volatile__ (
448 "in __tmp_reg__,__SREG__" "\n\t"
452 "out __SREG__,__tmp_reg__" "\n\t"
455 :
"n" (& _WD_CONTROL_REG),
457 "r" ((
uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00)
458 |
_BV(WDE) | (value & 0x07)) )
463 __asm__ __volatile__ (
464 "in __tmp_reg__,__SREG__" "\n\t"
468 "out __SREG__,__tmp_reg__" "\n\t"
471 :
"n" (& _WD_CONTROL_REG),
473 "r" ((
uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00)
474 |
_BV(WDE) | (value & 0x07)) )
482static __ATTR_ALWAYS_INLINE__
485 if (_SFR_IO_REG_P (_WD_CONTROL_REG))
488 __asm__ __volatile__ (
489 "in __tmp_reg__,__SREG__" "\n\t"
492 "in %[TEMPREG],%i[WDTREG]" "\n\t"
493 "ori %[TEMPREG],%[WDCE_WDE]" "\n\t"
494 "out %i[WDTREG],%[TEMPREG]" "\n\t"
495 "out %i[WDTREG],__zero_reg__" "\n\t"
496 "out __SREG__,__tmp_reg__"
497 : [TEMPREG]
"=d" (__temp_reg)
498 : [WDTREG]
"n" (& _WD_CONTROL_REG),
505 __asm__ __volatile__ (
506 "in __tmp_reg__,__SREG__" "\n\t"
509 "lds %[TEMPREG],%[WDTREG]" "\n\t"
510 "ori %[TEMPREG],%[WDCE_WDE]" "\n\t"
511 "sts %[WDTREG],%[TEMPREG]" "\n\t"
512 "sts %[WDTREG],__zero_reg__" "\n\t"
513 "out __SREG__,__tmp_reg__"
514 : [TEMPREG]
"=d" (__temp_reg)
515 : [WDTREG]
"n" (& _WD_CONTROL_REG),
545#if defined(__DOXYGEN__) || defined(__AVR_XMEGA__)
582#if defined(__DOXYGEN__) || defined(WDP3) || defined(__AVR_XMEGA__)
#define _BV(bit)
Definition: sfr_defs.h:206
unsigned char uint8_t
Definition: stdint.h:88
static void wdt_disable(void)
Definition: wdt.h:483
#define wdt_enable(timeout)
Definition: wdt.h:131