34#define _AVR_SLEEP_H_ 1
137#if defined(SLEEP_CTRL)
140 #define _SLEEP_CONTROL_REG SLEEP_CTRL
141 #define _SLEEP_ENABLE_MASK SLEEP_SEN_bm
142 #define _SLEEP_SMODE_GROUP_MASK SLEEP_SMODE_gm
144#elif defined(SLPCTRL)
147 #define _SLEEP_CONTROL_REG SLPCTRL_CTRLA
148 #define _SLEEP_ENABLE_MASK SLPCTRL_SEN_bm
149 #define _SLEEP_SMODE_GROUP_MASK SLPCTRL_SMODE_gm
153 #define _SLEEP_CONTROL_REG SMCR
154 #define _SLEEP_ENABLE_MASK _BV(SE)
156#elif defined(__AVR_AT94K__)
158 #define _SLEEP_CONTROL_REG MCUR
159 #define _SLEEP_ENABLE_MASK _BV(SE)
161#elif !defined(__DOXYGEN__)
163 #define _SLEEP_CONTROL_REG MCUCR
164 #define _SLEEP_ENABLE_MASK _BV(SE)
171#if defined(__AVR_ATmega161__)
173 #define set_sleep_mode(mode) \
175 MCUCR = ((MCUCR & ~_BV(SM1)) | ((mode) == SLEEP_MODE_PWR_DOWN || (mode) == SLEEP_MODE_PWR_SAVE ? _BV(SM1) : 0)); \
176 EMCUCR = ((EMCUCR & ~_BV(SM0)) | ((mode) == SLEEP_MODE_PWR_SAVE ? _BV(SM0) : 0)); \
180#elif defined(__AVR_ATmega162__) \
181|| defined(__AVR_ATmega8515__)
183 #define set_sleep_mode(mode) \
185 MCUCR = ((MCUCR & ~_BV(SM1)) | ((mode) == SLEEP_MODE_IDLE ? 0 : _BV(SM1))); \
186 MCUCSR = ((MCUCSR & ~_BV(SM2)) | ((mode) == SLEEP_MODE_STANDBY || (mode) == SLEEP_MODE_EXT_STANDBY ? _BV(SM2) : 0)); \
187 EMCUCR = ((EMCUCR & ~_BV(SM0)) | ((mode) == SLEEP_MODE_PWR_SAVE || (mode) == SLEEP_MODE_EXT_STANDBY ? _BV(SM0) : 0)); \
191#elif defined(__AVR_XMEGA__)
193#define set_sleep_mode(mode) \
195 _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_SLEEP_SMODE_GROUP_MASK)) | (mode)); \
202 #define set_sleep_mode(mode) \
204 _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
209 #define set_sleep_mode(mode) \
211 _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \
216 #define set_sleep_mode(mode) \
218 _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~_BV(SM)) | (mode)); \
223 #error "No SLEEP mode defined for this device."
237#if defined(__DOXYGEN__)
247#define sleep_enable() \
249 _SLEEP_CONTROL_REG |= (uint8_t)_SLEEP_ENABLE_MASK; \
255#if defined(__DOXYGEN__)
265#define sleep_disable() \
267 _SLEEP_CONTROL_REG &= (uint8_t)(~_SLEEP_ENABLE_MASK); \
278#if defined(__DOXYGEN__)
286 __asm__ __volatile__ ( "sleep" "\n\t" :: ); \
292#if defined(__DOXYGEN__)
302#define sleep_mode() \
312#if defined(__DOXYGEN__)
323#if defined(BODS) && defined(BODSE)
327#define BOD_CONTROL_REG BODCR
331#define BOD_CONTROL_REG MCUCR
335#define sleep_bod_disable() \
338 __asm__ __volatile__("in %[tempreg], %[mcucr]" "\n\t" \
339 "ori %[tempreg], %[bods_bodse]" "\n\t" \
340 "out %[mcucr], %[tempreg]" "\n\t" \
341 "andi %[tempreg], %[not_bodse]" "\n\t" \
342 "out %[mcucr], %[tempreg]" \
343 : [tempreg] "=&d" (tempreg) \
344 : [mcucr] "I" _SFR_IO_ADDR(BOD_CONTROL_REG), \
345 [bods_bodse] "i" (_BV(BODS) | _BV(BODSE)), \
346 [not_bodse] "i" (~_BV(BODSE))); \
void sleep_bod_disable(void)