HWA
Bare metal programming with style
coreb_2.h
Go to the documentation of this file.
1 
2 /* This file is part of the HWA project.
3  * Copyright (c) 2012,2015 Christophe Duparquet.
4  * All rights reserved. Read LICENSE.TXT for details.
5  */
6 
39 #define hwa_configure__coreb , _hwa_cfcoreb
40 
41 /* TODO use a list of wake-up sources instead (or in addition)?
42  */
43 /* #define _hw_is_awaker_awaker , 1 */
44 /* #define hw_awaker_io , 0 */
45 /* #define hw_awaker_int0_edge , 0 */
46 /* #define hw_awaker_adc , 1 */
47 /* #define hw_awaker_flash , 1 */
48 /* #define hw_awaker_eeprom , 1 */
49 /* #define hw_awaker_int0_level , 2 */
50 /* #define hw_awaker_pinchange , 2 */
51 /* #define hw_awaker_usi_start_condition , 2 */
52 /* #define hw_awaker_watchdog , 2 */
53 
54 /* Optionnal parameter `sleep`
55  */
56 #define _hwa_cfcoreb(o,a,k,...) \
57  do { \
58  HW_B(_hwa_cfcoreb_ksleep_,_hw_is_sleep_##k)(o,k,__VA_ARGS__,,); \
59  } while(0)
60 
61 #define _hwa_cfcoreb_ksleep_1(o,k,v,...) \
62  HW_B(_hwa_cfcoreb_vsleep_,_hw_state_##v)(o,v,__VA_ARGS__)
63 
64 #define _hwa_cfcoreb_vsleep_0(o,v,...) HW_E(HW_EM_VOAST(v,sleep))
65 #define _hwa_cfcoreb_vsleep_1(o,v,k,...) \
66  _hwa_write( o, se, HW_A1(_hw_state_##v) ); \
67  HW_G2(_hwa_cfcoreb_ksleepmode,HW_IS(sleep_mode,k))(o,k,__VA_ARGS__)
68 
69 #define _hwa_cfcoreb_ksleep_0(o,k,...) \
70  HW_G2(_hwa_cfcoreb_ksleepmode,HW_IS(sleep_mode,k))(o,k,__VA_ARGS__)
71 
72 /* Optionnal parameter `sleep_mode`
73  */
74 #define _hwa_cfcoreb_ksleepmode_0(o,...) HW_EOL(__VA_ARGS__)
75 
76 #define _hwa_cfcoreb_ksleepmode_1(o,k,v,...) \
77  HW_B(_hwa_cfcoreb_vsleepmode_,_hw_sleepmode_##v)(o,v,__VA_ARGS__)
78 
79 #define _hw_sleepmode_idle , 0
80 #define _hw_sleepmode_adc_noise_reduction , 1
81 #define _hw_sleepmode_power_down , 2
82 #define _hw_sleepmode_power_save , 3
83 #define _hw_sleepmode_standby , 6
84 #define _hw_sleepmode_extended_standby , 7
85 
86 #define _hwa_cfcoreb_vsleepmode_0(o,v,...) \
87  HW_E(HW_EM_VOAL(v,sleep_mode,(idle,adc_noise_reduction,power_down,power_save,standby,extended_standby)))
88 
89 #define _hwa_cfcoreb_vsleepmode_1(o,v,...) \
90  _hwa_write( o, sm, HW_A1(_hw_sleepmode_##v)) HW_EOL(__VA_ARGS__)
91 
92 
126 #define hw_stat__coreb , _hw_stat_coreb
127 
128 typedef union {
129  uint8_t byte ;
130  struct {
131  unsigned int porf: 1 ;
132  unsigned int extrf: 1 ;
133  unsigned int borf: 1 ;
134  unsigned int wdrf: 1 ;
135  unsigned int __4to7: 4 ;
136  };
137  struct {
138  unsigned int reset_by_power_on: 1 ;
139  unsigned int reset_by_reset_pin: 1 ;
140  unsigned int reset_by_brown_out: 1 ;
141  unsigned int reset_by_watchdog: 1 ;
142  unsigned int __4to7_2: 4 ;
143  };
144 } _hw_coreb_stat_t ;
145 
146 
147 #define hw_stat_t__coreb , _hw_coreb_stat_t
148 #define _hw_stat_coreb(o,a,...) _hw_coreb_stat(_hw_read(o, mcusr)) HW_EOL(__VA_ARGS__)
149 
150 
151 HW_INLINE _hw_coreb_stat_t _hw_coreb_stat( uint8_t byte )
152 {
153  _hw_coreb_stat_t st ;
154  st.byte = byte ;
155  return st ;
156 }
157 
158 
169 #define hwa_clear__coreb , _hwa_clear__coreb
170 
171 #define _hwa_clear__coreb(o,a,...) _hwa_write(o,allrf,0)
172 
173 
174 /*******************************************************************************
175  * *
176  * Context management *
177  * *
178  *******************************************************************************/
179 
180 #define _hwa_setup__coreb(o,a) \
181  _hwa_setup_r( o, mcucr ); \
182  _hwa_setup_r( o, mcusr ); \
183  _hwa_setup_r( o, smcr ); \
184  _hwa_setup_r( o, osccal )
185 
186 /* mcusr is not initialized as its status is not known after RESET
187  */
188 #define _hwa_init__coreb(o,a) \
189  _hwa_init_r( o, mcucr, 0x00 ); \
190  _hwa_init_r( o, smcr, 0x00 ); \
191  _hwa_init_r( o, osccal, 0x00 )
192 
193 
194 #define _hwa_commit__coreb(o,a) \
195  _hwa_commit_r( o, mcucr ); \
196  _hwa_commit_r( o, mcusr ); \
197  _hwa_commit_r( o, smcr ); \
198  _hwa_commit_r( o, osccal )