44 #define hwa_configure__ctb , _hwa_cfctb
51 #define _hwa_cfctb(o,a,k,...) \
52 do { HW_B(_hwa_cfctb_kclock_,_hw_is_clock_##k)(o,k,__VA_ARGS__,,) } while(0)
54 #define _hwa_cfctb_kclock_0(o,k,...) HW_E(HW_EM_AN(k,clock))
55 #define _hwa_cfctb_kclock_1(o,k,v,...) HW_B(_hwa_cfctb_vclock_,_hw_ctb_clock_##v)(o,v,__VA_ARGS__)
57 #define _hwa_cfctb_vclock_0(o,v,...) \
58 HW_E(HW_EM_VAL(v,clock,(none,ioclk [/ 2**n] with n in {0..14})))
60 #define _hwa_cfctb_vclock_1(o,v,k,...) \
61 _hwa_write(o, cs, HW_VF(_hw_ctb_clock_##v)); \
62 HW_B(_hwa_cfctb_kdirection_,_hw_is_direction_##k)(o,k,__VA_ARGS__)
64 #define _hw_ctb_clock_none , _hw_ctbck_none, 0
65 #define _hw_ctb_clock_ioclk , _hw_ctbck_ioclk, 16384.0
67 HW_INLINE uint8_t _hw_ctbck_none(
float v )
70 HWA_E(HW_EM_VL(clock,(none, ioclk/2**(0..14), external_falling, external_rising)));
75 HW_INLINE uint8_t _hw_ctbck_ioclk(
float v )
77 if ( v == 16384 )
return 1 ;
78 if ( v == 8192 )
return 2 ;
79 if ( v == 4096 )
return 3 ;
80 if ( v == 2048 )
return 4 ;
81 if ( v == 1024 )
return 5 ;
82 if ( v == 512 )
return 6 ;
83 if ( v == 256 )
return 7 ;
84 if ( v == 128 )
return 8 ;
85 if ( v == 64 )
return 9 ;
86 if ( v == 32 )
return 10 ;
87 if ( v == 16 )
return 11 ;
88 if ( v == 8 )
return 12 ;
89 if ( v == 4 )
return 13 ;
90 if ( v == 2 )
return 14 ;
91 if ( v == 1 )
return 15 ;
93 HWA_E(HW_EM_VL(clock,(none, ioclk/2**(0..14), external_falling, external_rising)));
100 #define _hwa_cfctb_kdirection_1(o,k,v,...) \
101 HW_G2(_hwa_cfctb_vdirection,HW_IS(up_loop,v))(o,v,__VA_ARGS__)
103 #define _hwa_cfctb_vdirection_0(o,v,...) \
104 HW_E(HW_EM_VAL(v,direction,(up_loop)))
106 #define _hwa_cfctb_vdirection_1(o,v,...) \
107 _hwa_cfctb_kdirection_0(o,__VA_ARGS__)
109 #define _hwa_cfctb_kdirection_0(o,k,...) \
110 HW_B(_hwa_cfctb_kbottom_,_hw_is_bottom_##k)(o,k,__VA_ARGS__)
114 #define _hwa_cfctb_kbottom_1(o,k,v,...) \
115 HW_G2(_hwa_cfctb_vbottom,HW_IS(0,v))(o,v,__VA_ARGS__)
117 #define _hwa_cfctb_vbottom_0(o,v,...) \
118 HW_E(HW_EM_VAL(v,bottom,(0)))
120 #define _hwa_cfctb_vbottom_1(o,v,...) \
121 _hwa_cfctb_kbottom_0(o,__VA_ARGS__)
123 #define _hwa_cfctb_kbottom_0(o,k,...) \
124 HW_B(_hwa_cfctb_ktop_,_hw_is_top_##k)(o,k,__VA_ARGS__)
129 #define _hw_ctb_top_0xFF , 0
130 #define _hw_ctb_top_0x00FF , 0
131 #define _hw_ctb_top_255 , 0
132 #define _hw_ctb_top_max , 0
133 #define _hw_ctb_top_compare2 , 1
135 #define _hwa_cfctb_ktop_1(o,k,v,...) \
136 HW_B(_hwa_cfctb_vtop_,_hw_ctb_top_##v)(o,v,__VA_ARGS__)
138 #define _hwa_cfctb_vtop_0(o,v,...) \
139 HW_E(HW_EM_VAL(v,top,(0xFF,0x00FF,255,max,compare2)))
141 #define _hwa_cfctb_vtop_1(o,v,...) \
142 _hwa_write(o, ctc, HW_A1(_hw_ctb_top_##v)); \
143 _hwa_cfctb_ktop_0(v,__VA_ARGS__)
145 #define _hwa_cfctb_ktop_0(o,k,...) \
146 HW_B(_hwa_cfctb_koverflow_,_hw_is_overflow_##k)(o,k,__VA_ARGS__)
151 #define _hwa_cfctb_koverflow_1(o,k,v,...) \
152 HW_G2(_hwa_cfctb_voverflow,HW_IS(after_bottom,v))(o,v,__VA_ARGS__)
154 #define _hwa_cfctb_voverflow_0(o,v,...) \
155 HW_E(HW_EM_VAL(v,overflow,(after_bottom)))
157 #define _hwa_cfctb_voverflow_1(o,v,...) \
158 _hwa_cfctb_koverflow_0(o,__VA_ARGS__)
160 #define _hwa_cfctb_koverflow_0(o,...) HW_EOL(__VA_ARGS__)
182 #define hw_read__ctb , _hw_ctbrd
183 #define _hw_ctbrd(o,a,...) _hw_read(o,count) HW_EOL(__VA_ARGS__)
185 #define hw_write__ctb , _hw_ctbwr
186 #define _hw_ctbwr(o,a,v,...) _hw_write(o,count,v) HW_EOL(__VA_ARGS__)
188 #define hwa_write__ctb , _hwa_ctbwr
189 #define _hwa_ctbwr(o,a,v,...) _hwa_write(o,count,v) HW_EOL(__VA_ARGS__)
212 #define _hwa_solve__ctb(o,a) \
213 _hwa_solve_ocb(o,0); \
214 _hwa_solve_ocb(o,1); \
215 if ( _hwa_mmask(o,pwm0) && _hwa_mmask(o,pwm1) \
216 && _hwa_mvalue(o,pwm0) != _hwa_mvalue(o,pwm1) ) \
218 HWA_E(HW_EM_CMOO((o,compare0),(o,compare1))); \
219 else if ( _hwa_mmask(o,ctc) && _hwa_mvalue(o,ctc)==0 \
220 && ( (_hwa_mmask(o,pwm0) && _hwa_mvalue(o,pwm1)) \
221 || (_hwa_mmask(o,pwm1) && _hwa_mvalue(o,pwm1))) ) \
223 HWA_E(HW_EM_AOVM(top,o,compare2)); \
224 if ( _hwa_mvalue(o,ie)==1 \
225 && _hwa_mvalue(o,ctc)==1 \
226 && _hwa_mvalue(o,pwm0) == 0 \
227 && _hwa_mvalue(o,pwm1) == 0 ) { \
228 if ( _hwa_mmask(o,pwm0)==1 || _hwa_mmask(o,pwm1)== 1 ) \
232 if ( _hwa_mmask(o,pwm0)==0 ) \
233 _hwa_write(o,pwm0,1); \
235 _hwa_write(o,pwm0,1); \
239 #define _hwa_setup__ctb(o,a) \
240 _hwa_setup_r( o, ccr ); \
241 _hwa_setup_r( o, count ); \
242 _hwa_setup_r( o, ocr0 ); \
243 _hwa_setup_r( o, ocr1 ); \
244 _hwa_setup_r( o, ocr2 ); \
245 _hwa_setup_r( o, dtps ); \
246 _hwa_setup_r( o, dta ); \
247 _hwa_setup_r( o, dtb ); \
248 hwa->o.compare0.config.outputh = 0xFF ; \
249 hwa->o.compare0.config.outputl = 0xFF ; \
250 hwa->o.compare1.config.outputh = 0xFF ; \
251 hwa->o.compare1.config.outputl = 0xFF ; \
253 #define _hwa_init__ctb(o,a) \
254 _hwa_init_r( o, ccr, 0 ); \
255 _hwa_init_r( o, count, 0 ); \
256 _hwa_init_r( o, ocr0, 0 ); \
257 _hwa_init_r( o, ocr1, 0 ); \
258 _hwa_init_r( o, ocr2, 0 ); \
259 _hwa_init_r( o, dtps, 0 ); \
260 _hwa_init_r( o, dta, 0 ); \
261 _hwa_init_r( o, dtb, 0 )
263 #define _hwa_commit__ctb(o,a) \
264 _hwa_commit_r( o, ccr ); \
265 _hwa_commit_r( o, count ); \
266 _hwa_commit_r( o, ocr0 ); \
267 _hwa_commit_r( o, ocr1 ); \
268 _hwa_commit_r( o, ocr2 ); \
269 _hwa_commit_r( o, dtps ); \
270 _hwa_commit_r( o, dta ); \
271 _hwa_commit_r( o, dtb )