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
Generated for HWA by
1.8.6