HWA
Bare metal programming with style
ioa_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 
47 #define hw_configure__ioa , _hw_cfioa
48 #define _hw_cfioa(...) do{ _hw_cfioa1(_hw,__VA_ARGS__,,) }while(0)
49 
50 #define hwa_configure__ioa , _hwa_cfioa
51 #define _hwa_cfioa(...) do{ _hw_cfioa1(_hwa,__VA_ARGS__,,) }while(0)
52 
53 /* Handle not-connected pins
54  */
55 #define _hw_cfioa1(h,o,p,bn,bp,...) HW_BV(_hw_cfioa1,p,_ncmsk,bn,bp) (h,o,p,bn,bp,__VA_ARGS__) // PUSH
56 #define _hw_cfioa10(...) _hw_cfioafn // POP
57 #define _hw_cfioa11(v,bn,bp) if ( (v) & (((1<<bn)-1)<<bp) ) HWA_E(HW_EM_IONC); _hw_cfioafn // POP
58 
59 /* Optionnal key 'function'
60  */
61 #define _hw_cfioafn(h,o,p,bn,bp,k,...) HW_BW(_hw_cfioafn,function,k)(h,o,p,bn,bp,k,__VA_ARGS__)
62 #define _hw_cfioafn0 _hw_cfioamd
63 #define _hw_cfioafn1(h,o,p,bn,bp,k,v,...) HW_BV(_hw_cfioafn1,_hw_ioafn_,v,)(h,o,p,bn,bp,__VA_ARGS__) // PUSH
64 #define _hw_cfioafn10(...) HW_E(HW_EM_VAL(v,function,(gpio)) HW_EAT // POP
65 #define _hw_cfioafn11(...) _hw_cfioamd
66 
67 #define _hw_ioafn_gpio , 1
68 
69 /* Key 'mode'
70  */
71 #define _hw_cfioamd(h,o,p,bn,bp,k,...) HW_BW(_hw_cfioamd,mode,k)(h,o,p,bn,bp,k,__VA_ARGS__)
72 #define _hw_cfioamd0(h,o,p,bn,bp,k,...) HW_E(HW_EM_AN(k,mode))
73 #define _hw_cfioamd1(h,o,p,bn,bp,k,v,...) HW_BV(_hw_cfioamd1,ioamd_,v,)(h,o,p,bn,bp,__VA_ARGS__) // PUSH
74 #define _hw_cfioamd10(v,...) HW_E(HW_EM_VAL(v,mode,(digital_input, digital_input_floating, \
75  digital_input_pullup, digital_output, \
76  digital_output_pushpull, analog_input, \
77  analog_input_floating, analog_input_pullup ))) \
78  HW_EAT // POP
79 #define _hw_cfioamd11(v,...) v // POP
80 
81 #define _hw_ioamd_digital_input , _hw_cfioamd_di
82 #define _hw_ioamd_digital_input_floating , _hw_cfioamd_dif
83 #define _hw_ioamd_digital_input_pullup , _hw_cfioamd_dipu
84 #define _hw_ioamd_digital_output , _hw_cfioamd_do
85 #define _hw_ioamd_digital_output_pushpull , _hw_cfioamd_do
86 #define _hw_ioamd_analog_input , _hw_cfioamd_ai
87 #define _hw_ioamd_analog_input_floating , _hw_cfioamd_aif
88 #define _hw_ioamd_analog_input_pullup , _hw_cfioamd_aipu
89 
90 #define _hw_cfioamd_di(h,o,p,bn,bp,...) h##_write_m(p,ddr,((1U<<bn)-1)<<bp, 0); HW_EOL(__VA_ARGS__)
91 #define _hw_cfioamd_dif(h,o,p,bn,bp,...) \
92  h##_write_m(p,ddr,((1U<<bn)-1)<<bp, 0); \
93  h##_write_m(p,port,((1U<<bn)-1)<<bp, 0 ); HW_EOL(__VA_ARGS__)
94 
95 #define _hw_cfioamd_dipu(h,o,p,bn,bp,...) \
96  h##_write_m(p,ddr,((1U<<bn)-1)<<bp, 0); \
97  h##_write_m(p,port,((1U<<bn)-1)<<bp, ((1U<<bn)-1)<<bp ); HW_EOL(__VA_ARGS__)
98 
99 #define _hw_cfioamd_do(h,o,p,bn,bp,...) \
100  h##_write_m(p,ddr,((1U<<bn)-1)<<bp, ((1U<<bn)-1)<<bp ); HW_EOL(__VA_ARGS__)
101 
102 #define _hw_cfioamd_ai(h,o,p,bn,bp,...) _hw_cfioamd_ai1(h,o,HW_X(o,did))
103 #define _hw_cfioamd_ai1(...) _hw_cfioamd_ai2(__VA_ARGS__)
104 #define _hw_cfioamd_ai2(h,o,x,...) HW_BW(_hw_cfioamd_ai2_,_m11,x)(h,o,x,__VA_ARGS__)
105 #define _hw_cfioamd_ai2_0(h,o,...) HW_E(HW_EM_OAVI(o,mode,analog_input))
106 #define _hw_cfioamd_ai2_1(h,o,c,...) h##_write__m11( __VA_ARGS__, 1, );
107 
108 #define _hw_cfioamd_aipu(h,o,p,bn,bp,...) _hw_cfioamd_aipu1(h,o,p,bn,bp,HW_X(o,did))
109 #define _hw_cfioamd_aipu1(...) _hw_cfioamd_aipu2(__VA_ARGS__)
110 #define _hw_cfioamd_aipu2(h,o,p,bn,bp,x,...) HW_BW(_hw_cfioamd_aipu2_,_m11,x)(h,o,p,bn,bp,x,__VA_ARGS__)
111 #define _hw_cfioamd_aipu2_0(h,o,...) HW_E(HW_EM_OAVI(o,mode,analog_input_pullup))
112 #define _hw_cfioamd_aipu2_1(h,o,p,bn,bp,c,...) \
113  h##_write__m11( __VA_ARGS__, 1, ); \
114  h##_write_m( p, port, ((1U<<bn)-1)<<bp, ((1U<<bn)-1)<<bp );
115 
116 
126 #define hw_read__ioa , _hw_rdioa
127 
128 /* Handle not-connected pins
129  * Must use a fonction so that hw(read,...) can appear in if(...).
130  */
131 #define _hw_rdioa(o,p,bn,bp,...) HW_EOL(__VA_ARGS__) HW_BV(_hw_rdioa,p,_ncmsk,p,bn,bp) (o,p,bn,bp) // PUSH
132 #define _hw_rdioa0(...) _hw_rdioa2 // POP
133 #define _hw_rdioa1(v,p,bn,bp) _hw_rdioa_(HW_ADDRESS((p,pin)),bn,bp,v) HW_EAT // POP
134 #define _hw_rdioa2(o,p,bn,bp) _hw(readnp,(p,pin),bn,bp)
135 
136 HW_INLINE uint8_t _hw_rdioa_ ( uintptr_t r, uint8_t bn, uint8_t bp, uint8_t nc )
137 {
138  uint8_t msk = (1U<<bn)-1;
139  if ( r <= 0 )
140  HWA_E(internal error [__FILE__:__LINE__]);
141  if ( msk<<bp & nc )
142  HWA_E(HW_EM_IONC);
143  return (*(volatile uint8_t *)(r))>>bp ;
144 }
145 
146 
157 #define hw_write__ioa , _hw_wrioa
158 #define _hw_wrioa(o,p,bn,bp,...) HW_BV(_hw_wrioa,p,_ncmsk,bn,bp) (_hw,o,p,bn,bp,__VA_ARGS__) // PUSH
159 
160 #define hwa_write__ioa , _hwa_wrioa
161 #define _hwa_wrioa(o,p,bn,bp,...) HW_BV(_hw_wrioa,p,_ncmsk,bn,bp) (_hwa,o,p,bn,bp,__VA_ARGS__) // PUSH
162 
163 #define _hw_wrioa0(...) _hw_wrioa2 // POP
164 #define _hw_wrioa1(m,bn,bp) if ( (m) & (((1UL<<bn)-1)<<bp) ) HWA_E(HW_EM_IONC); _hw_wrioa2 // POP
165 #define _hw_wrioa2(h,o,p,bn,bp,v,...) h(writenp,(p,port),bn,bp,v) HW_EOL(__VA_ARGS__)
166 
167 
178 /* #define hw_set__ioa , _hw_set_ioa */
179 /* #define _hw_set_ioa(o,p,bn,bp,...) _hw_write_m(p, port, ((1UL<<bn)-1)<<bp, ((1UL<<bn)-1)<<bp) HW_EOL(__VA_ARGS__) */
180 
181 /* #define hwa_set__ioa , _hwa_set_ioa */
182 /* #define _hwa_set_ioa(o,p,bn,bp,...) _hwa_write__r8(&hwa->p.port,0xFF,0x00,bn,bp,((1UL<<bn)-1)) HW_EOL(__VA_ARGS__) */
183 
184 #define hw_set__ioa , _hw_set_ioa
185 #define _hw_set_ioa(o,p,bn,bp,...) HW_BV(_hw_wrioa,p,_ncmsk,bn,bp) (_hw,o,p,bn,bp,(1UL<<bn)-1,__VA_ARGS__)
186 
187 #define hwa_set__ioa , _hwa_set_ioa
188 #define _hwa_set_ioa(o,p,bn,bp,...) HW_BV(_hw_wrioa,p,_ncmsk,bn,bp) (_hwa,o,p,bn,bp,(1UL<<bn)-1,__VA_ARGS__)
189 
190 
201 /* #define hw_clear__ioa , _hw_clear_ioa */
202 /* #define _hw_clear_ioa(o,p,bn,bp,...) _hw_write_m(p, port, ((1UL<<bn)-1)<<bp, 0) HW_EOL(__VA_ARGS__) */
203 
204 /* #define hwa_clear__ioa , _hwa_clear_ioa */
205 /* #define _hwa_clear_ioa(o,p,bn,bp,...) _hwa_write__r8(&hwa->p.port,0xFF,0x00,bn,bp,0) HW_EOL(__VA_ARGS__) */
206 
207 #define hw_clear__ioa , _hw_clrioa
208 #define _hw_clrioa(o,p,bn,bp,...) HW_BV(_hw_wrioa,p,_ncmsk,bn,bp) (_hw,o,p,bn,bp,0,__VA_ARGS__)
209 
210 #define hwa_clear__ioa , _hwa_clrioa
211 #define _hwa_clrioa(o,p,bn,bp,...) HW_BV(_hw_wrioa,p,_ncmsk,bn,bp) (_hwa,o,p,bn,bp,0,__VA_ARGS__)
212 
213 
229 /* #define hw_toggle__ioa , _hw_toggle_ioa */
230 /* #define _hw_toggle_ioa(o,p,bn,bp,...) _hw_tgioa01(HW_X(p,pin),bn,bp) */
231 /* #define _hw_tgioa01(...) _hw_tgioa02(__VA_ARGS__) */
232 /* #define _hw_tgioa02(t,...) _hw_tgioa_##t(__VA_ARGS__) */
233 /* #define _hw_tgioa__m11(n,o,r,c,a,rwm,rfm,rbn,rbp,bn,bp) _hw_tgioa(a,bn,bp) */
234 
235 #define hw_toggle__ioa , _hw_tgioa
236 #define _hw_tgioa(o,p,bn,bp,...) HW_BV(_hw_tgioa,p,_ncmsk,bn,bp) (_hw,o,p,bn,bp,__VA_ARGS__) // PUSH
237 
238 #define hwa_toggle__ioa , _hwa_tgioa
239 #define _hwa_tgioa(o,p,bn,bp,...) HW_BV(_hw_tgioa,p,_ncmsk,bn,bp) (_hwa,o,p,bn,bp,__VA_ARGS__) // PUSH
240 
241 #define _hw_tgioa0(...) _hw_tgioa2 // POP
242 #define _hw_tgioa1(m,bn,bp) if ( (m) & (((1UL<<bn)-1)<<bp) ) HWA_E(HW_EM_IONC); _hw_tgioa2 // POP
243 #define _hw_tgioa2(h,o,p,bn,bp,v,...) h(writenp,(p,pin),bn,bp,(1UL<<bn)-1) HW_EOL(__VA_ARGS__)
244 
245 
246 
247 /* HW_INLINE void _hw_tgioa ( intptr_t a, uint8_t bn, uint8_t bp ) */
248 /* { */
249 /* volatile uint8_t *pin = (volatile uint8_t*)a ; */
250 
251 /* if ( bn == 1 && a < 0x40 ) */
252 /* *pin |= 1<<bp ; // Use sbi */
253 /* else */
254 /* *pin = ((1UL<<bn)-1)<<bp ; */
255 /* } */
256 
257 /* #define _hwa_tgioa(o,p,bn,bp,g,...) HW_B(_hwa_tgioa_,g)(p,bn,bp,g) */
258 /* #define _hwa_tgioa_0(p,bn,bp,g) HW_E(HW_EM_G(g)) */
259 /* #define _hwa_tgioa_1(p,bn,bp,g) hwa->p.toggles |= (((1UL<<bn)-1) << bp) */
HWA_E
#define HWA_E(...)
Trigger an error after code optimization.
Definition: hwa_2.h:17