HWA
Bare metal programming with style
hwa_interrupts.h
Go to the documentation of this file.
1 
2 /* This file is part of the HWA project.
3  * Copyright (c) 2020 Christophe Duparquet.
4  * All rights reserved. Read LICENSE.TXT for details.
5  */
6 
30 #define hw_class__irq
31 
32 
33 /* Return the mask register of an _irq.
34  * Can not use HW_CODR since it's blued.
35  */
36 #ifndef hw__irq_mask
37 #define hw__irq_mask , _hw_irqm
38 #define _hw_irqm(oo,v,o,m,f) _hw_irqm1(o,hw_##o,hw_##o##_##m)
39 #define _hw_irqm1(...) _hw_irqm2(__VA_ARGS__)
40 #define _hw_irqm2(o,c,a,rc,...) HW_OXR(rc,,__VA_ARGS__,c,o,a)
41 #endif
42 
43 #ifndef hw__irq_flag
44 #define hw__irq_flag , _hw_irqf
45 #define _hw_irqf(oo,v,o,m,f) _hw_irqf1(o,hw_##o,hw_##o##_##f)
46 #define _hw_irqf1(...) _hw_irqf2(__VA_ARGS__)
47 #define _hw_irqf2(o,c,a,rc,...) HW_OXR(rc,,__VA_ARGS__,c,o,a)
48 #endif
49 
50 #define hw__irq_ , _hw_irq_
51 #define _hw_irq_(oo,r,v,o,m,f) _hw_irq1(o,r,hw_##o##_irq_##r)
52 #define _hw_irq1(...) _hw_irq2(__VA_ARGS__)
53 #define _hw_irq2(o,r,...) HW_BW(_hw_irq2_,_irq,__VA_ARGS__)(o,r,__VA_ARGS__)
54 #define _hw_irq2_0(o,r,...) ,(o,irq,r),HW_EM_O((o,irq,r))
55 #define _hw_irq2_1(o,r,ic,iv,...) ic,(o,irq,r),(iv,__VA_ARGS__)
56 
57 
75 /* FIXME: this code has to be rewritten.
76  * AVR use '(object,irq)' as argument for HW_ISR().
77  * STM32 use 'object[,reason]' and looks for a _hw_isr_object[_reason] declaration (-> _HW_ISR20)
78  */
79 #ifndef HW_ISR
80 #define HW_ISR(...) _HW_ISR0(__VA_ARGS__,,,)
81 #define _HW_ISR0(o,...) _HW_ISR1( HW_C3(HW_X(o)), __VA_ARGS__ )
82 #define _HW_ISR1(...) _HW_ISR2(__VA_ARGS__)
83 
84 #define _HW_ISR2(c,...) HW_BW(_HW_ISR2,_irq,c)(c, __VA_ARGS__ )
85 //#define _HW_ISR20(x,o,...) _HW_ISR_E(o,__VA_ARGS__)
86 
87 //#define _HW_ISR21(c,o,v,p,m,f,x,...) HW_BW(_HW_ISR5,alias,x)(v,x,__VA_ARGS__)
88 #define _HW_ISR21(c,o,d,...) _HW_ISR22( HW_A0 d, __VA_ARGS__ )
89 #define _HW_ISR22(...) _HW_ISR23(__VA_ARGS__)
90 #define _HW_ISR23(v,x,...) HW_BW(_HW_ISR5,alias,x)(v,x,__VA_ARGS__)
91 
92 #define _HW_ISR51(v,x,o,...) _HW_ISR52(v, HW_X(o), __VA_ARGS__ )
93 #define _HW_ISR52(...) _HW_ISR53(__VA_ARGS__)
94 #define _HW_ISR53(v,x,...) HW_BW(_HW_ISR6,_irq,x)(v,x, __VA_ARGS__ )
95 #define _HW_ISR60(v,x,o,...) _HW_ISR_E(o,__VA_ARGS__)
96 #define _HW_ISR61(v1,c,o,v2,p,m,f,x,...) _HW_ISR_ALIAS(v1,v2) HW_EOL(__VA_ARGS__)
97 
98 #define _HW_ISR50(v,x,...) _HW_B(_HW_ISR7,_hw_israttr_##x)(v,x,__VA_ARGS__)
99 #define _HW_ISR70(v,...) _HW_ISR9(v,) HW_EOL(__VA_ARGS__)
100 #define _HW_ISR71(v,x,y,...) _HW_B(_HW_ISR8,_hw_israttr_##y)(v,x,y,__VA_ARGS__)
101 #define _HW_ISR80(v,x,...) _HW_ISR9(v, HW_A1(_hw_israttr_##x)) HW_EOL(__VA_ARGS__)
102 #define _HW_ISR81(v,x,y,...) _HW_ISR9(v, HW_A1(_hw_israttr_##x) HW_A1(_hw_israttr_##y)) HW_EOL(__VA_ARGS__)
103 #define _HW_ISR9(...) _HW_ISR_(__VA_ARGS__)
104 
105 #if defined __ASSEMBLER__ && !defined _HW_ISR_
106 # define _HW_ISR_(vector, ...) __vector_##vector
107 # define _HW_ISR_E(o, ...) __vector_0 HW_E(HW_EM_OT(o,irq)[_HW_ISR_E(o,__VA_ARGS__)])
108 #endif
109 
110 #if !defined __ASSEMBLER__
111 # define _HW_ISR_E(o, ...) \
112  void _hw_isr_error(void) __attribute__((weak)) HW_E(HW_EM_OT(o,irq)[_HW_ISR_E(o,__VA_ARGS__)])
113 #endif
114 
115 /* Handle _hw_isr_ declarations
116  */
117 #define _HW_ISR20(c,...) HW_B(_HW_ISRX1,c)(c,__VA_ARGS__)
118 #define _HW_ISRX11(z,o,e,...) HW_E(e) void HW_G2(hw,__COUNTER__)()
119 
120 /* Reason?
121  */
122 #define _HW_ISRX10(c,o,d,x,...) HW_B(_HW_ISRX3,_hw_isr_##o##_##x)(o,x,__VA_ARGS__)
123 #define _HW_ISRX31(o,x,...) _HW_ISRX30(o##_##x,__VA_ARGS__)
124 
125 /* Alias?
126  */
127 #define _HW_ISRX30(o1,x,...) HW_BW(_HW_ISRX5,alias,x)(o1,x,__VA_ARGS__)
128 #define _HW_ISRX51(o1,x,y,...) _HW_ISRX52(o1,HW_C3(HW_X(y)), __VA_ARGS__ )
129 #define _HW_ISRX52(o1,x,...) HW_B(_HW_ISRX52,x)(o1,x,__VA_ARGS__)
130 #define _HW_ISRX521(o1,z,o,e,...) HW_E(e) void HW_G2(hw,__COUNTER__)()
131 #define _HW_ISRX520(o1,c,o2,d,x,...) HW_B(_HW_ISRX53,x)(o1,o2,x,__VA_ARGS__)
132 #define _HW_ISRX531(o1,o2,...) _HW_ISRX_ALIAS(HW_A1(_hw_isr_##o1),HW_A1(_hw_isr_##o2)) HW_EOL(__VA_ARGS__)
133 
134 /* Reason?
135  */
136 #define _HW_ISRX530(o1,o2,x,...) HW_B(_HW_ISRX54,_hw_isr_##o2##_##x)(o1,o2,x,__VA_ARGS__)
137 #define _HW_ISRX541(o1,o2,x,...) _HW_ISRX_ALIAS(HW_A1(_hw_isr_##o1),HW_A1(_hw_isr_##o2##_##x)) HW_EOL(__VA_ARGS__)
138 #define _HW_ISRX540(o1,o2,...) _HW_ISRX_ALIAS(HW_A1(_hw_isr_##o1),HW_A1(_hw_isr_##o2)) HW_EOL(__VA_ARGS__)
139 
140 #define _HW_ISRX50(o,...) HW_B(_HW_ISRX50,_hw_isr_##o)(o,__VA_ARGS__)
141 #define _HW_ISRX500(o,...) HW_E(HW_EM_OT(o,isr))
142 #define _HW_ISRX501(...) _HW_ISRX9(__VA_ARGS__)
143 
144 #define _HW_ISRX9(o,...) _HW_ISRXX(HW_A1(_hw_isr_##o),__VA_ARGS__)
145 
146 
147 #define _HW_ISRXX(...) _HW_ISRXX1(__VA_ARGS__)
148 #define _HW_ISRXX1(v,...) \
149  HW_EXTERN_C void __vector_##v(void) HW_ISR_ATTRIBUTES \
150  HW_B(_HW_ISRXX2,__VA_ARGS__)(__VA_ARGS__); \
151  void __vector_##v(void)
152 #define _HW_ISRXX20(x,...) __attribute((x)) HW_B(_HW_ISRXX3,__VA_ARGS__)(__VA_ARGS__)
153 #define _HW_ISRXX30(x,...) __attribute((x)) HW_B(_HW_ISRXX3,__VA_ARGS__)(__VA_ARGS__)
154 #define _HW_ISRXX21(...)
155 #define _HW_ISRXX31(...)
156 #endif // ifndef HW_ISR
157 
158 
171 #define hw_enable__irq , _hw_enirq
172 #define hwa_enable__irq , _hwa_enirq
173 
174 
187 #define hw_disable__irq , _hw_dsirq
188 #define hwa_disable__irq , _hwa_dsirq
189 
190 
203 #define hw_is_enabled__irq , _hw_isenirq
204 
205 
218 #define hw_read__irq , _hw_rdirq
219 
220 
233 #define hw_clear__irq , _hw_clirq
234 #define hwa_clear__irq , _hwa_clirq
235 
236 
249 #define hw_enable_interrupts , _hw_enirqs
250 
251 
264 #define hw_disable_interrupts , _hw_dsirqs