summaryrefslogtreecommitdiff
path: root/tmk_core/common/avr/suspend_avr.h
blob: d73852ba11c2589de1bb02b6b68045f2255b0ca9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef SUSPEND_AVR_H
#define SUSPEND_AVR_H

#include <stdint.h>
#include <stdbool.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>

#define wdt_intr_enable(value)                                                                                                                                                         \
    __asm__ __volatile__("in __tmp_reg__,__SREG__"                                                                                                                                     \
                         "\n\t"                                                                                                                                                        \
                         "cli"                                                                                                                                                         \
                         "\n\t"                                                                                                                                                        \
                         "wdr"                                                                                                                                                         \
                         "\n\t"                                                                                                                                                        \
                         "sts %0,%1"                                                                                                                                                   \
                         "\n\t"                                                                                                                                                        \
                         "out __SREG__,__tmp_reg__"                                                                                                                                    \
                         "\n\t"                                                                                                                                                        \
                         "sts %0,%2"                                                                                                                                                   \
                         "\n\t"                                                                                                                                                        \
                         : /* no outputs */                                                                                                                                            \
                         : "M"(_SFR_MEM_ADDR(_WD_CONTROL_REG)), "r"(_BV(_WD_CHANGE_BIT) | _BV(WDE)), "r"((uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00) | _BV(WDIE) | (value & 0x07))) \
                         : "r0")

#endif