-
Notifications
You must be signed in to change notification settings - Fork 0
/
iotool_attiny85digispark_sleep.h
167 lines (108 loc) · 3.41 KB
/
iotool_attiny85digispark_sleep.h
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
// iotool_attiny85digispark_sleep.h (fix Arduino 1.6.8 IDE)
//
// Add sleep interface for digispark at Arduini 1.6.8
#ifndef _AVR_SLEEP_H_
#define _AVR_SLEEP_H_ 1
#include <avr/io.h>
#include <stdint.h>
/* Define an internal sleep control register and an internal sleep enable bit mask. */
#if defined(SLEEP_CTRL)
/* XMEGA devices */
#define _SLEEP_CONTROL_REG SLEEP_CTRL
#define _SLEEP_ENABLE_MASK SLEEP_SEN_bm
#elif defined(SMCR)
#define _SLEEP_CONTROL_REG SMCR
#define _SLEEP_ENABLE_MASK _BV(SE)
#elif defined(__AVR_AT94K__)
#define _SLEEP_CONTROL_REG MCUR
#define _SLEEP_ENABLE_MASK _BV(SE)
#else
#define _SLEEP_CONTROL_REG MCUCR
#define _SLEEP_ENABLE_MASK _BV(SE)
#endif
/* Define set_sleep_mode() and sleep mode values per device. */
#if defined(__AVR_ATtiny85__)
#define SLEEP_MODE_IDLE 0
#define SLEEP_MODE_ADC _BV(SM0)
#define SLEEP_MODE_PWR_DOWN _BV(SM1)
#define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1))
#define set_sleep_mode(mode) \
do { \
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \
} while(0)
#else
#error "No SLEEP mode defined for this device."
#endif
/** \ingroup avr_sleep
Put the device in sleep mode. How the device is brought out of sleep mode
depends on the specific mode selected with the set_sleep_mode() function.
See the data sheet for your device for more details. */
#if defined(__DOXYGEN__)
/** \ingroup avr_sleep
Set the SE (sleep enable) bit.
*/
extern void sleep_enable (void);
#else
#define sleep_enable() \
do { \
_SLEEP_CONTROL_REG |= (uint8_t)_SLEEP_ENABLE_MASK; \
} while(0)
#endif
#if defined(__DOXYGEN__)
/** \ingroup avr_sleep
Clear the SE (sleep enable) bit.
*/
extern void sleep_disable (void);
#else
#define sleep_disable() \
do { \
_SLEEP_CONTROL_REG &= (uint8_t)(~_SLEEP_ENABLE_MASK); \
} while(0)
#endif
/** \ingroup avr_sleep
Put the device into sleep mode. The SE bit must be set
beforehand, and it is recommended to clear it afterwards.
*/
#if defined(__DOXYGEN__)
extern void sleep_cpu (void);
#else
#define sleep_cpu() \
do { \
__asm__ __volatile__ ( "sleep" "\n\t" :: ); \
} while(0)
#endif
#if defined(__DOXYGEN__)
extern void sleep_mode (void);
#else
#define sleep_mode() \
do { \
sleep_enable(); \
sleep_cpu(); \
sleep_disable(); \
} while (0)
#endif
#if defined(__DOXYGEN__)
extern void sleep_bod_disable (void);
#else
#if defined(BODS) && defined(BODSE)
#ifdef BODCR
#define BOD_CONTROL_REG BODCR
#else
#define BOD_CONTROL_REG MCUCR
#endif
#define sleep_bod_disable() \
do { \
uint8_t tempreg; \
__asm__ __volatile__("in %[tempreg], %[mcucr]" "\n\t" \
"ori %[tempreg], %[bods_bodse]" "\n\t" \
"out %[mcucr], %[tempreg]" "\n\t" \
"andi %[tempreg], %[not_bodse]" "\n\t" \
"out %[mcucr], %[tempreg]" \
: [tempreg] "=&d" (tempreg) \
: [mcucr] "I" _SFR_IO_ADDR(BOD_CONTROL_REG), \
[bods_bodse] "i" (_BV(BODS) | _BV(BODSE)), \
[not_bodse] "i" (~_BV(BODSE))); \
} while (0)
#endif
#endif
#endif /* _AVR_SLEEP_H_ */