Skip to content

Commit c1930dc

Browse files
drivers: intc_exti_stm32: review
apply requested changes by reviewer Signed-off-by: Alexander Kozhinov <[email protected]>
1 parent 340e44c commit c1930dc

File tree

4 files changed

+103
-104
lines changed

4 files changed

+103
-104
lines changed

drivers/interrupt_controller/intc_exti_stm32.c

+58-65
Original file line numberDiff line numberDiff line change
@@ -25,42 +25,31 @@ LOG_MODULE_REGISTER(exti_stm32, CONFIG_INTC_LOG_LEVEL);
2525

2626
#define IS_VALID_EXTI_LINE_NUM(line_num) ((line_num) < STM32_EXTI_TOTAL_LINES_NUM)
2727

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); \
6252
}
63-
#endif /* STM32_EXTI_TOTAL_LINES_NUM_96 */
6453

6554

6655
bool stm32_exti_is_pending(uint32_t line_num)
@@ -69,25 +58,29 @@ bool stm32_exti_is_pending(uint32_t line_num)
6958
const uint32_t line = exti_linenum_to_ll_exti_line(line_num);
7059

7160
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);
7362
return false;
7463
}
7564

7665
z_stm32_hsem_lock(CFG_HW_EXTI_SEMID, HSEM_LOCK_DEFAULT_RETRY);
7766

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+
*/
7871
if (line_num < 32U) {
7972
ret = EXTI_IS_ACTIVE_FLAG(0_31, line);
80-
#if STM32_EXTI_TOTAL_LINES_NUM_64
73+
#if STM32_EXTI_TOTAL_LINES_NUM > 32
8174
} else if (line_num < 64U) {
8275
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
8578
} else if (line_num < 96U) {
8679
ret = EXTI_IS_ACTIVE_FLAG(64_95, line);
87-
#endif /* STM32_EXTI_TOTAL_LINES_NUM_96 */
80+
#endif /* STM32_EXTI_TOTAL_LINES_NUM > 64 */
8881
} 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);
9184
}
9285

9386
z_stm32_hsem_unlock(CFG_HW_EXTI_SEMID);
@@ -100,13 +93,13 @@ int stm32_exti_clear_pending(uint32_t line_num)
10093
const uint32_t line = exti_linenum_to_ll_exti_line(line_num);
10194

10295
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);
10497
return -EINVAL;
10598
}
10699

107100
z_stm32_hsem_lock(CFG_HW_EXTI_SEMID, HSEM_LOCK_DEFAULT_RETRY);
108101

109-
EXTI_LINE_HND(EXTI_CLEAR_FLAG, line_num, line);
102+
EXTI_FN_HANDLER(EXTI_CLEAR_FLAG, line_num, line);
110103

111104
z_stm32_hsem_unlock(CFG_HW_EXTI_SEMID);
112105

@@ -118,13 +111,13 @@ int stm32_exti_sw_interrupt(uint32_t line_num)
118111
const uint32_t line = exti_linenum_to_ll_exti_line(line_num);
119112

120113
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);
122115
return -EINVAL;
123116
}
124117

125118
z_stm32_hsem_lock(CFG_HW_EXTI_SEMID, HSEM_LOCK_DEFAULT_RETRY);
126119

127-
EXTI_LINE_HND(EXTI_GENERATE_SWI, line_num, line);
120+
EXTI_FN_HANDLER(EXTI_GENERATE_SWI, line_num, line);
128121

129122
z_stm32_hsem_unlock(CFG_HW_EXTI_SEMID);
130123

@@ -186,9 +179,9 @@ static int stm32_exti_init(const struct device *dev)
186179
* @param line_num EXTI line number
187180
* @param line LL EXTI line
188181
*/
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)
190183
{
191-
EXTI_LINE_HND(EXTI_ENABLE_IT, line_num, line);
184+
EXTI_FN_HANDLER(EXTI_ENABLE_IT, line_num, line);
192185
}
193186

194187
/**
@@ -197,9 +190,9 @@ static void stm32_exti_enable_isr(uint32_t line_num, uint32_t line)
197190
* @param line_num EXTI line number
198191
* @param line LL EXTI line
199192
*/
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)
201194
{
202-
EXTI_LINE_HND(EXTI_DISABLE_IT, line_num, line);
195+
EXTI_FN_HANDLER(EXTI_DISABLE_IT, line_num, line);
203196
}
204197

205198
/**
@@ -210,7 +203,7 @@ static void stm32_exti_disable_isr(uint32_t line_num, uint32_t line)
210203
*/
211204
static void stm32_exti_enable_rising_trig(uint32_t line_num, uint32_t line)
212205
{
213-
EXTI_LINE_HND(EXTI_ENABLE_RISING_TRIG, line_num, line);
206+
EXTI_FN_HANDLER(EXTI_ENABLE_RISING_TRIG, line_num, line);
214207
}
215208

216209
/**
@@ -221,7 +214,7 @@ static void stm32_exti_enable_rising_trig(uint32_t line_num, uint32_t line)
221214
*/
222215
static void stm32_exti_disable_rising_trig(uint32_t line_num, uint32_t line)
223216
{
224-
EXTI_LINE_HND(EXTI_DISABLE_RISING_TRIG, line_num, line);
217+
EXTI_FN_HANDLER(EXTI_DISABLE_RISING_TRIG, line_num, line);
225218
}
226219

227220
/**
@@ -232,7 +225,7 @@ static void stm32_exti_disable_rising_trig(uint32_t line_num, uint32_t line)
232225
*/
233226
static void stm32_exti_enable_falling_trig(uint32_t line_num, uint32_t line)
234227
{
235-
EXTI_LINE_HND(EXTI_ENABLE_FALLING_TRIG, line_num, line);
228+
EXTI_FN_HANDLER(EXTI_ENABLE_FALLING_TRIG, line_num, line);
236229
}
237230

238231
/**
@@ -243,7 +236,7 @@ static void stm32_exti_enable_falling_trig(uint32_t line_num, uint32_t line)
243236
*/
244237
static void stm32_exti_disable_falling_trig(uint32_t line_num, uint32_t line)
245238
{
246-
EXTI_LINE_HND(EXTI_DISABLE_FALLING_TRIG, line_num, line);
239+
EXTI_FN_HANDLER(EXTI_DISABLE_FALLING_TRIG, line_num, line);
247240
}
248241

249242
/**
@@ -253,7 +246,7 @@ static void stm32_exti_disable_falling_trig(uint32_t line_num, uint32_t line)
253246
* @param line LL EXTI line
254247
* @param mode EXTI mode
255248
*/
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,
257250
uint32_t trg)
258251
{
259252
switch (trg) {
@@ -274,7 +267,7 @@ static inline void stm32_exti_select_line_trigger(uint32_t line_num, uint32_t li
274267
stm32_exti_enable_falling_trig(line_num, line);
275268
break;
276269
default:
277-
LOG_ERR("Unsupported EXTI trigger %d", trg);
270+
LOG_ERR("Unsupported EXTI trigger 0x%X", trg);
278271
break;
279272
}
280273
}
@@ -287,7 +280,7 @@ static inline void stm32_exti_select_line_trigger(uint32_t line_num, uint32_t li
287280
*/
288281
static void stm32_exti_enable_event(uint32_t line_num, uint32_t line)
289282
{
290-
EXTI_LINE_HND(EXTI_ENABLE_EVENT, line_num, line);
283+
EXTI_FN_HANDLER(EXTI_ENABLE_EVENT, line_num, line);
291284
}
292285

293286
/**
@@ -298,7 +291,7 @@ static void stm32_exti_enable_event(uint32_t line_num, uint32_t line)
298291
*/
299292
static void stm32_exti_disable_event(uint32_t line_num, uint32_t line)
300293
{
301-
EXTI_LINE_HND(EXTI_DISABLE_EVENT, line_num, line);
294+
EXTI_FN_HANDLER(EXTI_DISABLE_EVENT, line_num, line);
302295
}
303296

304297
/**
@@ -314,22 +307,22 @@ static void stm32_exti_set_mode(uint32_t line_num, uint32_t line,
314307
switch (mode) {
315308
case STM32_EXTI_MODE_NONE:
316309
stm32_exti_disable_event(line_num, line);
317-
stm32_exti_disable_isr(line_num, line);
310+
stm32_exti_disable_it(line_num, line);
318311
break;
319312
case STM32_EXTI_MODE_IT:
320313
stm32_exti_disable_event(line_num, line);
321-
stm32_exti_enable_isr(line_num, line);
314+
stm32_exti_enable_it(line_num, line);
322315
break;
323316
case STM32_EXTI_MODE_EVENT:
324-
stm32_exti_disable_isr(line_num, line);
317+
stm32_exti_disable_it(line_num, line);
325318
stm32_exti_enable_event(line_num, line);
326319
break;
327320
case STM32_EXTI_MODE_BOTH:
328-
stm32_exti_enable_isr(line_num, line);
321+
stm32_exti_enable_it(line_num, line);
329322
stm32_exti_enable_event(line_num, line);
330323
break;
331324
default:
332-
LOG_ERR("Unsupported EXTI mode %d", mode);
325+
LOG_ERR("Unsupported EXTI mode %u", mode);
333326
break;
334327
}
335328
}
@@ -340,7 +333,7 @@ int stm32_exti_enable(uint32_t line_num, stm32_exti_trigger_type trigger,
340333
const uint32_t line = exti_linenum_to_ll_exti_line(line_num);
341334

342335
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);
344337
return -EINVAL;
345338
}
346339

@@ -359,7 +352,7 @@ int stm32_exti_disable(uint32_t line_num)
359352
const uint32_t line = exti_linenum_to_ll_exti_line(line_num);
360353

361354
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);
363356
return -EINVAL;
364357
}
365358

drivers/interrupt_controller/intc_exti_stm32_priv.h

+38-29
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,8 @@ extern "C" {
2222

2323
#define EXTI_NODE DT_INST(0, st_stm32_exti)
2424

25-
/* TODO: replace num_lines by toal_num_lines as soon as decision is made in PR */
2625
#define STM32_EXTI_TOTAL_LINES_NUM DT_PROP(EXTI_NODE, num_lines)
2726

28-
#define STM32_EXTI_TOTAL_LINES_NUM_64 (STM32_EXTI_TOTAL_LINES_NUM > 32) && \
29-
(STM32_EXTI_TOTAL_LINES_NUM <= 64)
30-
#define STM32_EXTI_TOTAL_LINES_NUM_96 (STM32_EXTI_TOTAL_LINES_NUM > 64) && \
31-
(STM32_EXTI_TOTAL_LINES_NUM <= 96)
32-
3327
#if defined(CONFIG_SOC_SERIES_STM32H7X) && defined(CONFIG_CPU_CORTEX_M4)
3428
#define CPU_NR _C2
3529
#else /* CONFIG_SOC_SERIES_STM32H7X && CONFIG_CPU_CORTEX_M4 */
@@ -39,43 +33,58 @@ extern "C" {
3933
#if DT_HAS_COMPAT_STATUS_OKAY(st_stm32g0_exti)
4034

4135
/* Defeine general macros line-range independent */
42-
#define EXTI_IS_ACTIVE_RISING_FLAG(line_num, line) CONCAT(LL, CPU_NR, _EXTI_IsActiveRisingFlag_##line_num)(line)
43-
#define EXTI_IS_ACTIVE_FALLING_FLAG(line_num, line) CONCAT(LL, CPU_NR, _EXTI_IsActiveFallingFlag_##line_num)(line)
44-
#define LL_EXTI_IsActiveFlag(line_num, line) \
45-
(EXTI_IS_ACTIVE_RISING_FLAG(line_num, line) || EXTI_IS_ACTIVE_FALLING_FLAG(line_num, line))
46-
47-
#define EXTI_CLEAR_RISING_FLAG(line_num, line) CONCAT(LL, CPU_NR, _EXTI_ClearRisingFlag_##line_num)(line)
48-
#define EXTI_CLEAR_FALLING_FLAG(line_num, line) CONCAT(LL, CPU_NR, _EXTI_ClearFallingFlag_##line_num)(line)
49-
#define LL_EXTI_ClearFlag(line_num, line) \
36+
#define EXTI_IS_ACTIVE_RISING_FLAG(line_range, line) \
37+
CONCAT(LL, CPU_NR, _EXTI_IsActiveRisingFlag_##line_range)(line)
38+
#define EXTI_IS_ACTIVE_FALLING_FLAG(line_range, line) \
39+
CONCAT(LL, CPU_NR, _EXTI_IsActiveFallingFlag_##line_range)(line)
40+
#define LL_EXTI_IsActiveFlag(line_range, line) \
41+
(EXTI_IS_ACTIVE_RISING_FLAG(line_range, line) || EXTI_IS_ACTIVE_FALLING_FLAG(line_range, line))
42+
43+
#define EXTI_CLEAR_RISING_FLAG(line_range, line) \
44+
CONCAT(LL, CPU_NR, _EXTI_ClearRisingFlag_##line_range)(line)
45+
#define EXTI_CLEAR_FALLING_FLAG(line_range, line) \
46+
CONCAT(LL, CPU_NR, _EXTI_ClearFallingFlag_##line_range)(line)
47+
#define LL_EXTI_ClearFlag(line_range, line) \
5048
{ \
51-
EXTI_CLEAR_RISING_FLAG(line_num, line); \
52-
EXTI_CLEAR_FALLING_FLAG(line_num, line); \
49+
EXTI_CLEAR_RISING_FLAG(line_range, line); \
50+
EXTI_CLEAR_FALLING_FLAG(line_range, line); \
5351
}
5452

5553
#define LL_EXTI_IsActiveFlag_0_31(line) LL_EXTI_IsActiveFlag(0_31, line)
5654
#define LL_EXTI_ClearFlag_0_31(line) LL_EXTI_ClearFlag(0_31, line)
5755

58-
#if STM32_EXTI_TOTAL_LINES_NUM_64
56+
#if STM32_EXTI_TOTAL_LINES_NUM > 32
5957

6058
#define LL_EXTI_IsActiveFlag_32_63(line) LL_EXTI_IsActiveFlag(32_63, line)
6159
#define LL_EXTI_ClearFlag_32_63(line) LL_EXTI_ClearFlag(32_63, line)
6260

63-
#endif /* STM32_EXTI_TOTAL_LINES_NUM < 64 */
61+
#endif /* STM32_EXTI_TOTAL_LINES_NUM > 32 */
6462

6563
#endif /* DT_HAS_COMPAT_STATUS_OKAY(st_stm32g0_exti) */
6664

6765
/* Defeine general macros line-range independent */
68-
#define EXTI_ENABLE_IT(line_num, line) CONCAT(LL, CPU_NR, _EXTI_EnableIT_##line_num)(line)
69-
#define EXTI_DISABLE_IT(line_num, line) CONCAT(LL, CPU_NR, _EXTI_DisableIT_##line_num)(line)
70-
#define EXTI_ENABLE_EVENT(line_num, line) CONCAT(LL, CPU_NR, _EXTI_EnableEvent_##line_num)(line)
71-
#define EXTI_DISABLE_EVENT(line_num, line) CONCAT(LL, CPU_NR, _EXTI_DisableEvent_##line_num)(line)
72-
#define EXTI_CLEAR_FLAG(line_num, line) CONCAT(LL, CPU_NR, _EXTI_ClearFlag_##line_num)(line)
73-
#define EXTI_IS_ACTIVE_FLAG(line_num, line) CONCAT(LL, CPU_NR, _EXTI_IsActiveFlag_##line_num)(line)
74-
#define EXTI_ENABLE_RISING_TRIG(line_num, line) CONCAT(LL, _EXTI_EnableRisingTrig_##line_num)(line)
75-
#define EXTI_ENABLE_FALLING_TRIG(line_num, line) CONCAT(LL, _EXTI_EnableFallingTrig_##line_num)(line)
76-
#define EXTI_DISABLE_FALLING_TRIG(line_num, line) CONCAT(LL, _EXTI_DisableFallingTrig_##line_num)(line)
77-
#define EXTI_DISABLE_RISING_TRIG(line_num, line) CONCAT(LL, _EXTI_DisableRisingTrig_##line_num)(line)
78-
#define EXTI_GENERATE_SWI(line_num, line) CONCAT(LL, _EXTI_GenerateSWI_##line_num)(line)
66+
#define EXTI_ENABLE_IT(line_range, line) \
67+
CONCAT(LL, CPU_NR, _EXTI_EnableIT_##line_range)(line)
68+
#define EXTI_DISABLE_IT(line_range, line) \
69+
CONCAT(LL, CPU_NR, _EXTI_DisableIT_##line_range)(line)
70+
#define EXTI_ENABLE_EVENT(line_range, line) \
71+
CONCAT(LL, CPU_NR, _EXTI_EnableEvent_##line_range)(line)
72+
#define EXTI_DISABLE_EVENT(line_range, line) \
73+
CONCAT(LL, CPU_NR, _EXTI_DisableEvent_##line_range)(line)
74+
#define EXTI_CLEAR_FLAG(line_range, line) \
75+
CONCAT(LL, CPU_NR, _EXTI_ClearFlag_##line_range)(line)
76+
#define EXTI_IS_ACTIVE_FLAG(line_range, line) \
77+
CONCAT(LL, CPU_NR, _EXTI_IsActiveFlag_##line_range)(line)
78+
#define EXTI_ENABLE_RISING_TRIG(line_range, line) \
79+
CONCAT(LL, _EXTI_EnableRisingTrig_##line_range)(line)
80+
#define EXTI_ENABLE_FALLING_TRIG(line_range, line) \
81+
CONCAT(LL, _EXTI_EnableFallingTrig_##line_range)(line)
82+
#define EXTI_DISABLE_FALLING_TRIG(line_range, line) \
83+
CONCAT(LL, _EXTI_DisableFallingTrig_##line_range)(line)
84+
#define EXTI_DISABLE_RISING_TRIG(line_range, line) \
85+
CONCAT(LL, _EXTI_DisableRisingTrig_##line_range)(line)
86+
#define EXTI_GENERATE_SWI(line_range, line) \
87+
CONCAT(LL, _EXTI_GenerateSWI_##line_range)(line)
7988

8089
/**
8190
* @returns LL_EXTI_LINE_n define corresponding to EXTI line number

dts/bindings/interrupt-controller/st,stm32-exti.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ properties:
2424
default: 16
2525
description: |
2626
Total number of GPIO lines supported by the interrupt controller.
27-
The defalut value of 16 is dedicated to most STM32 devices.
27+
The default value of 16 mirrors hardware of most STM32 devices.
2828
2929
line-ranges:
3030
type: array

0 commit comments

Comments
 (0)