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