@@ -25,42 +25,31 @@ LOG_MODULE_REGISTER(exti_stm32, CONFIG_INTC_LOG_LEVEL);
25
25
26
26
#define IS_VALID_EXTI_LINE_NUM (line_num ) ((line_num) < STM32_EXTI_TOTAL_LINES_NUM)
27
27
28
-
29
- #define EXTI_LINE_HND (FN , line_num , line ) \
30
- if (line_num < 32U) { \
31
- FN(0_31, line); \
32
- } else { \
33
- LOG_DBG("Invalid EXTI line number: %d", line_num); \
34
- CODE_UNREACHABLE; \
35
- }
36
-
37
- #if STM32_EXTI_TOTAL_LINES_NUM_64
38
- #undef EXTI_LINE_HND
39
- #define EXTI_LINE_HND (FN , line_num , line ) \
40
- if (line_num < 32U) { \
41
- FN(0_31, line); \
42
- } else if (line_num < 64U) { \
43
- FN(32_63, line); \
44
- } else { \
45
- LOG_DBG("Invalid EXTI line number: %d", line_num); \
46
- CODE_UNREACHABLE; \
47
- }
48
- #endif /* STM32_EXTI_TOTAL_LINES_NUM_64 */
49
-
50
- #if STM32_EXTI_TOTAL_LINES_NUM_96
51
- #undef EXTI_LINE_HND
52
- #define EXTI_LINE_HND (FN , line_num , line ) \
53
- if (line_num < 32U) { \
54
- FN(0_31, line); \
55
- } else if (line_num < 64U) { \
56
- FN(32_63, line); \
57
- } else if (line_num < 96U) { \
58
- FN(64_95, line); \
59
- } else { \
60
- LOG_DBG("Invalid EXTI line number: %d", line_num); \
61
- CODE_UNREACHABLE; \
28
+ /*
29
+ * The boilerplate for COND_CODE_x is needed because the values are not 0/1
30
+ */
31
+ #if STM32_EXTI_TOTAL_LINES_NUM > 32
32
+ #define HAS_LINES_32_63 1
33
+ #if STM32_EXTI_TOTAL_LINES_NUM > 64
34
+ #define HAS_LINES_64_95 1
35
+ #endif /* STM32_EXTI_TOTAL_LINES_NUM > 64 */
36
+ #endif /* STM32_EXTI_TOTAL_LINES_NUM > 32 */
37
+
38
+ #define EXTI_FN_HANDLER (_fn , line_num , line ) \
39
+ if (line_num < 32U) { \
40
+ _fn(0_31, line); \
41
+ IF_ENABLED(HAS_LINES_32_63, ( \
42
+ } else if (line_num < 64U) { \
43
+ _fn(32_63, line); \
44
+ )) \
45
+ IF_ENABLED(HAS_LINES_64_95, ( \
46
+ } else if (line_num < 96U) { \
47
+ _fn(64_95, line); \
48
+ )) \
49
+ } else { \
50
+ LOG_ERR("Invalid line number %u", line_num); \
51
+ __ASSERT_NO_MSG(0); \
62
52
}
63
- #endif /* STM32_EXTI_TOTAL_LINES_NUM_96 */
64
53
65
54
66
55
bool stm32_exti_is_pending (uint32_t line_num )
@@ -69,25 +58,29 @@ bool stm32_exti_is_pending(uint32_t line_num)
69
58
const uint32_t line = exti_linenum_to_ll_exti_line (line_num );
70
59
71
60
if (!IS_VALID_EXTI_LINE_NUM (line_num )) {
72
- LOG_DBG ( "No line number %d " , line_num );
61
+ LOG_ERR ( "Invalid line number %u " , line_num );
73
62
return false;
74
63
}
75
64
76
65
z_stm32_hsem_lock (CFG_HW_EXTI_SEMID , HSEM_LOCK_DEFAULT_RETRY );
77
66
67
+ /**
68
+ * Note: we can't use EXTI_LINE_HND here because we care
69
+ * about the return value of EXTI_IS_ACTIVE_FLAG.
70
+ */
78
71
if (line_num < 32U ) {
79
72
ret = EXTI_IS_ACTIVE_FLAG (0 _31 , line );
80
- #if STM32_EXTI_TOTAL_LINES_NUM_64
73
+ #if STM32_EXTI_TOTAL_LINES_NUM > 32
81
74
} else if (line_num < 64U ) {
82
75
ret = EXTI_IS_ACTIVE_FLAG (32 _63 , line );
83
- #endif /* STM32_EXTI_TOTAL_LINES_NUM_64 */
84
- #if STM32_EXTI_TOTAL_LINES_NUM_96
76
+ #endif /* STM32_EXTI_TOTAL_LINES_NUM > 32 */
77
+ #if STM32_EXTI_TOTAL_LINES_NUM > 64
85
78
} else if (line_num < 96U ) {
86
79
ret = EXTI_IS_ACTIVE_FLAG (64 _95 , line );
87
- #endif /* STM32_EXTI_TOTAL_LINES_NUM_96 */
80
+ #endif /* STM32_EXTI_TOTAL_LINES_NUM > 64 */
88
81
} else {
89
- LOG_DBG ("Invalid EXTI line number: %d " , line_num );
90
- CODE_UNREACHABLE ;
82
+ LOG_DBG ("Invalid line number: %u " , line_num );
83
+ __ASSERT_NO_MSG ( 0 ) ;
91
84
}
92
85
93
86
z_stm32_hsem_unlock (CFG_HW_EXTI_SEMID );
@@ -100,13 +93,13 @@ int stm32_exti_clear_pending(uint32_t line_num)
100
93
const uint32_t line = exti_linenum_to_ll_exti_line (line_num );
101
94
102
95
if (!IS_VALID_EXTI_LINE_NUM (line_num )) {
103
- LOG_DBG ("No line number %d " , line_num );
96
+ LOG_DBG ("Invalid line number %u " , line_num );
104
97
return - EINVAL ;
105
98
}
106
99
107
100
z_stm32_hsem_lock (CFG_HW_EXTI_SEMID , HSEM_LOCK_DEFAULT_RETRY );
108
101
109
- EXTI_LINE_HND (EXTI_CLEAR_FLAG , line_num , line );
102
+ EXTI_FN_HANDLER (EXTI_CLEAR_FLAG , line_num , line );
110
103
111
104
z_stm32_hsem_unlock (CFG_HW_EXTI_SEMID );
112
105
@@ -118,13 +111,13 @@ int stm32_exti_sw_interrupt(uint32_t line_num)
118
111
const uint32_t line = exti_linenum_to_ll_exti_line (line_num );
119
112
120
113
if (!IS_VALID_EXTI_LINE_NUM (line_num )) {
121
- LOG_DBG ("No line number %d " , line_num );
114
+ LOG_DBG ("Invalid line number %u " , line_num );
122
115
return - EINVAL ;
123
116
}
124
117
125
118
z_stm32_hsem_lock (CFG_HW_EXTI_SEMID , HSEM_LOCK_DEFAULT_RETRY );
126
119
127
- EXTI_LINE_HND (EXTI_GENERATE_SWI , line_num , line );
120
+ EXTI_FN_HANDLER (EXTI_GENERATE_SWI , line_num , line );
128
121
129
122
z_stm32_hsem_unlock (CFG_HW_EXTI_SEMID );
130
123
@@ -186,9 +179,9 @@ static int stm32_exti_init(const struct device *dev)
186
179
* @param line_num EXTI line number
187
180
* @param line LL EXTI line
188
181
*/
189
- static void stm32_exti_enable_isr (uint32_t line_num , uint32_t line )
182
+ static void stm32_exti_enable_it (uint32_t line_num , uint32_t line )
190
183
{
191
- EXTI_LINE_HND (EXTI_ENABLE_IT , line_num , line );
184
+ EXTI_FN_HANDLER (EXTI_ENABLE_IT , line_num , line );
192
185
}
193
186
194
187
/**
@@ -197,9 +190,9 @@ static void stm32_exti_enable_isr(uint32_t line_num, uint32_t line)
197
190
* @param line_num EXTI line number
198
191
* @param line LL EXTI line
199
192
*/
200
- static void stm32_exti_disable_isr (uint32_t line_num , uint32_t line )
193
+ static void stm32_exti_disable_it (uint32_t line_num , uint32_t line )
201
194
{
202
- EXTI_LINE_HND (EXTI_DISABLE_IT , line_num , line );
195
+ EXTI_FN_HANDLER (EXTI_DISABLE_IT , line_num , line );
203
196
}
204
197
205
198
/**
@@ -210,7 +203,7 @@ static void stm32_exti_disable_isr(uint32_t line_num, uint32_t line)
210
203
*/
211
204
static void stm32_exti_enable_rising_trig (uint32_t line_num , uint32_t line )
212
205
{
213
- EXTI_LINE_HND (EXTI_ENABLE_RISING_TRIG , line_num , line );
206
+ EXTI_FN_HANDLER (EXTI_ENABLE_RISING_TRIG , line_num , line );
214
207
}
215
208
216
209
/**
@@ -221,7 +214,7 @@ static void stm32_exti_enable_rising_trig(uint32_t line_num, uint32_t line)
221
214
*/
222
215
static void stm32_exti_disable_rising_trig (uint32_t line_num , uint32_t line )
223
216
{
224
- EXTI_LINE_HND (EXTI_DISABLE_RISING_TRIG , line_num , line );
217
+ EXTI_FN_HANDLER (EXTI_DISABLE_RISING_TRIG , line_num , line );
225
218
}
226
219
227
220
/**
@@ -232,7 +225,7 @@ static void stm32_exti_disable_rising_trig(uint32_t line_num, uint32_t line)
232
225
*/
233
226
static void stm32_exti_enable_falling_trig (uint32_t line_num , uint32_t line )
234
227
{
235
- EXTI_LINE_HND (EXTI_ENABLE_FALLING_TRIG , line_num , line );
228
+ EXTI_FN_HANDLER (EXTI_ENABLE_FALLING_TRIG , line_num , line );
236
229
}
237
230
238
231
/**
@@ -243,7 +236,7 @@ static void stm32_exti_enable_falling_trig(uint32_t line_num, uint32_t line)
243
236
*/
244
237
static void stm32_exti_disable_falling_trig (uint32_t line_num , uint32_t line )
245
238
{
246
- EXTI_LINE_HND (EXTI_DISABLE_FALLING_TRIG , line_num , line );
239
+ EXTI_FN_HANDLER (EXTI_DISABLE_FALLING_TRIG , line_num , line );
247
240
}
248
241
249
242
/**
@@ -253,7 +246,7 @@ static void stm32_exti_disable_falling_trig(uint32_t line_num, uint32_t line)
253
246
* @param line LL EXTI line
254
247
* @param mode EXTI mode
255
248
*/
256
- static inline void stm32_exti_select_line_trigger (uint32_t line_num , uint32_t line ,
249
+ static void stm32_exti_select_line_trigger (uint32_t line_num , uint32_t line ,
257
250
uint32_t trg )
258
251
{
259
252
switch (trg ) {
@@ -274,7 +267,7 @@ static inline void stm32_exti_select_line_trigger(uint32_t line_num, uint32_t li
274
267
stm32_exti_enable_falling_trig (line_num , line );
275
268
break ;
276
269
default :
277
- LOG_ERR ("Unsupported EXTI trigger %d " , trg );
270
+ LOG_ERR ("Unsupported EXTI trigger 0x%X " , trg );
278
271
break ;
279
272
}
280
273
}
@@ -287,7 +280,7 @@ static inline void stm32_exti_select_line_trigger(uint32_t line_num, uint32_t li
287
280
*/
288
281
static void stm32_exti_enable_event (uint32_t line_num , uint32_t line )
289
282
{
290
- EXTI_LINE_HND (EXTI_ENABLE_EVENT , line_num , line );
283
+ EXTI_FN_HANDLER (EXTI_ENABLE_EVENT , line_num , line );
291
284
}
292
285
293
286
/**
@@ -298,7 +291,7 @@ static void stm32_exti_enable_event(uint32_t line_num, uint32_t line)
298
291
*/
299
292
static void stm32_exti_disable_event (uint32_t line_num , uint32_t line )
300
293
{
301
- EXTI_LINE_HND (EXTI_DISABLE_EVENT , line_num , line );
294
+ EXTI_FN_HANDLER (EXTI_DISABLE_EVENT , line_num , line );
302
295
}
303
296
304
297
/**
@@ -314,22 +307,22 @@ static void stm32_exti_set_mode(uint32_t line_num, uint32_t line,
314
307
switch (mode ) {
315
308
case STM32_EXTI_MODE_NONE :
316
309
stm32_exti_disable_event (line_num , line );
317
- stm32_exti_disable_isr (line_num , line );
310
+ stm32_exti_disable_it (line_num , line );
318
311
break ;
319
312
case STM32_EXTI_MODE_IT :
320
313
stm32_exti_disable_event (line_num , line );
321
- stm32_exti_enable_isr (line_num , line );
314
+ stm32_exti_enable_it (line_num , line );
322
315
break ;
323
316
case STM32_EXTI_MODE_EVENT :
324
- stm32_exti_disable_isr (line_num , line );
317
+ stm32_exti_disable_it (line_num , line );
325
318
stm32_exti_enable_event (line_num , line );
326
319
break ;
327
320
case STM32_EXTI_MODE_BOTH :
328
- stm32_exti_enable_isr (line_num , line );
321
+ stm32_exti_enable_it (line_num , line );
329
322
stm32_exti_enable_event (line_num , line );
330
323
break ;
331
324
default :
332
- LOG_ERR ("Unsupported EXTI mode %d " , mode );
325
+ LOG_ERR ("Unsupported EXTI mode %u " , mode );
333
326
break ;
334
327
}
335
328
}
@@ -340,7 +333,7 @@ int stm32_exti_enable(uint32_t line_num, stm32_exti_trigger_type trigger,
340
333
const uint32_t line = exti_linenum_to_ll_exti_line (line_num );
341
334
342
335
if (!IS_VALID_EXTI_LINE_NUM (line_num )) {
343
- LOG_ERR ("No line number %d " , line_num );
336
+ LOG_ERR ("Invalid line number %u " , line_num );
344
337
return - EINVAL ;
345
338
}
346
339
@@ -359,7 +352,7 @@ int stm32_exti_disable(uint32_t line_num)
359
352
const uint32_t line = exti_linenum_to_ll_exti_line (line_num );
360
353
361
354
if (!IS_VALID_EXTI_LINE_NUM (line_num )) {
362
- LOG_ERR ("No line number %d " , line_num );
355
+ LOG_ERR ("Invalid line number %u " , line_num );
363
356
return - EINVAL ;
364
357
}
365
358
0 commit comments