Skip to content

Commit 8df999e

Browse files
committed
cores: arduino: zephyrCommon: Generate config from connector definition
If digital-gpio-pins is not defined, the pin configuration will be generated using the connector definition. This allows ArduinoCore-Zephyr to be used on boards that have arduino-header defined, without requiring specific configuration in ArduinoCore-Zephyr. Signed-off-by: TOKITA Hiroshi <tokita.hiroshi@gmail.com>
1 parent f66a922 commit 8df999e

6 files changed

Lines changed: 339 additions & 10 deletions

File tree

cores/arduino/Arduino.h

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/*
22
* Copyright (c) 2022 Dhruva Gole
3+
* Copyright (c) 2026 TOKITA Hiroshi
34
*
45
* SPDX-License-Identifier: Apache-2.0
56
*/
@@ -16,6 +17,8 @@
1617
#include <zephyr/drivers/i2c.h>
1718
#include <math.h>
1819

20+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
21+
1922
#if DT_PROP_LEN(DT_PATH(zephyr_user), digital_pin_gpios) > 0
2023
/* Note: DT_REG_ADDR needs an expanded argument or it will not work properly */
2124
#define DIGITAL_PIN_MATCHES(dev_pha, pin, dev, num) \
@@ -84,15 +87,33 @@
8487

8588
#define DN_ENUMS(n, p, i) D##i = i
8689

90+
#else
91+
92+
#include "connectors/connector.h"
93+
94+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), builtin_led_gpios) && \
95+
(DT_PROP_LEN(DT_PATH(zephyr_user), builtin_led_gpios) > 0)
96+
#define ZARD_LED_BUILTIN \
97+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0)) + \
98+
DT_PHA_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0, pin)
99+
#elif DT_NODE_EXISTS(DT_ALIAS(led0))
100+
#define ZARD_LED_BUILTIN \
101+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)) + \
102+
DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin)
103+
#endif
104+
#endif // digital_pin_gpios
105+
87106
/*
88107
* expand as
89108
* enum digitalPins { D0, D1, ... LED... NUM_OF_DIGITAL_PINS };
90109
*/
91110
enum digitalPins {
92-
#if DT_PROP_LEN(DT_PATH(zephyr_user), digital_pin_gpios) > 0
111+
#if DT_PROP_LEN_OR(DT_PATH(zephyr_user), digital_pin_gpios, 0) > 0
93112
DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, DN_ENUMS, (, )),
94-
#endif
95113
NUM_OF_DIGITAL_PINS
114+
#elif defined(ZARD_CONNECTOR)
115+
DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, ZARD_CONN_DN_ENUMS)
116+
#endif
96117
};
97118

98119
#ifdef CONFIG_ADC
@@ -102,7 +123,15 @@ enum digitalPins {
102123
DT_PHA_BY_IDX(DT_PATH(zephyr_user), p, i, pin)),
103124

104125
enum analogPins {
126+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), adc_pin_gpios)
127+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
105128
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, AN_ENUMS)
129+
#else
130+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ZARD_AN_ENUM_GLOBAL)
131+
#endif
132+
#elif defined(ZARD_CONNECTOR)
133+
DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, ZARD_CONN_AN_ENUMS)
134+
#endif
106135
};
107136

108137
// We provide analogReadResolution APIs

cores/arduino/Tone.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ using namespace zephyr::arduino;
1414
namespace {
1515

1616
#if CONFIG_ARDUINO_MAX_TONES < 0
17+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
1718
#define MAX_TONE_PINS DT_PROP_LEN(DT_PATH(zephyr_user), digital_pin_gpios)
19+
#elif defined(ZARD_CONNECTOR)
20+
#define MAX_TONE_PINS DT_PROP_LEN(DT_NODELABEL(ZARD_CONNECTOR), gpio_map)
21+
#else
22+
#define MAX_TONE_PINS 1
23+
#endif
1824
#else
1925
#define MAX_TONE_PINS CONFIG_ARDUINO_MAX_TONES
2026
#endif
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright (c) 2026 TOKITA Hiroshi
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#pragma once
8+
9+
#define ZARD_CONNECTOR arduino_header
10+
11+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_0 A0
12+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_1 A1
13+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_2 A2
14+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_3 A3
15+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_4 A4
16+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_5 A5
17+
18+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_6 D0
19+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_7 D1
20+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_8 D2
21+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_9 D3
22+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_10 D4
23+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_11 D5
24+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_12 D6
25+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_13 D7
26+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_14 D8
27+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_15 D9
28+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_16 D10
29+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_17 D11
30+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_18 D12
31+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_19 D13
32+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_20 D14
33+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_21 D15
34+
35+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_0 1
36+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_1 1
37+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_2 1
38+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_3 1
39+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_4 1
40+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_5 1
41+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_6 1
42+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_7 1
43+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_8 1
44+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_9 1
45+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_10 1
46+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_11 1
47+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_12 1
48+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_13 1
49+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_14 1
50+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_15 1
51+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_16 1
52+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_17 1
53+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_18 1
54+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_19 1
55+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_20 1
56+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_21 1
57+
58+
#if DT_NODE_EXISTS(DT_NODELABEL(arduino_adc))
59+
#define ZARD_ADC_CONNECTOR arduino_adc
60+
#endif
61+
62+
#if DT_NODE_EXISTS(DT_NODELABEL(arduino_pwm))
63+
#define ZARD_PWM_CONNECTOR arduino_pwm
64+
#endif
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Copyright (c) 2026 TOKITA Hiroshi
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#pragma once
8+
9+
#if DT_NODE_EXISTS(DT_NODELABEL(arduino_header))
10+
#if DT_NODE_HAS_COMPAT(DT_NODELABEL(arduino_header), arduino_header_r3)
11+
#include "arduino_header_r3.h"
12+
#else
13+
#warning "Only the arduino-header-r3 connector is supported; ignoring arduino_header"
14+
#endif
15+
#endif
16+
17+
#define ZARD_CHECK_GPIO_CTLR(node_id) \
18+
COND_CODE_1(DT_NODE_HAS_PROP(node_id, gpio_controller), (node_id,), ())
19+
20+
#define ZARD_ALL_GPIO_CTLR DT_FOREACH_NODE(ZARD_CHECK_GPIO_CTLR)
21+
22+
#define ZARD_IDX_IF_MATCH(i, n) \
23+
COND_CODE_1(DT_SAME_NODE(n, GET_ARG_N(UTIL_INC(i), ZARD_ALL_GPIO_CTLR)), (i), ())
24+
25+
#define ZARD_MATCH_IDX(n) LISTIFY(NUM_VA_ARGS_LESS_1(ZARD_ALL_GPIO_CTLR), ZARD_IDX_IF_MATCH, (), n)
26+
27+
#define ZARD_GET_NGPIOS(i, ...) DT_PROP(GET_ARG_N(UTIL_INC(i), __VA_ARGS__), ngpios)
28+
#define ZARD_SUM_NGPIOS(...) LISTIFY(NUM_VA_ARGS(__VA_ARGS__), ZARD_GET_NGPIOS, (+), __VA_ARGS__)
29+
30+
#define ZARD_GLOBAL_GPIO_OFFSET_(ph) \
31+
ZARD_SUM_NGPIOS(GET_ARGS_FIRST_N(ZARD_MATCH_IDX(ph), ZARD_ALL_GPIO_CTLR))
32+
33+
#define ZARD_GLOBAL_GPIO_OFFSET(ph) \
34+
COND_CODE_1(IS_EQ(NUM_VA_ARGS(ZARD_GLOBAL_GPIO_OFFSET_(ph)), 0), \
35+
(0), (ZARD_GLOBAL_GPIO_OFFSET_(ph)))
36+
37+
#define ZARD_GPIO_FLAGS_IF_MATCH(n, p, i, ctrl, pin) \
38+
((DT_SAME_NODE(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i), ctrl) && \
39+
(DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0) == pin)) ? \
40+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 1) : \
41+
0)
42+
43+
#define ZARD_GPIO_FLAGS_FOR_PIN(pin, ctrl) \
44+
DT_FOREACH_MAP_ENTRY_SEP_VARGS(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, \
45+
ZARD_GPIO_FLAGS_IF_MATCH, (|), ctrl, pin)
46+
47+
#define ZARD_GET_GPIO_FLAGS(node_id) \
48+
COND_CODE_1(DT_NODE_HAS_PROP(node_id, gpio_controller), \
49+
(LISTIFY(DT_PROP_OR(node_id, ngpios, 0), \
50+
ZARD_GPIO_FLAGS_FOR_PIN, (,), node_id),), ())
51+
52+
#define ZARD_AN_ENUM_GLOBAL(n, p, i) \
53+
A##i = ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin),
54+
55+
#define ZARD_CONNECTOR_PIN_IS_DIGITAL(node, num) \
56+
UTIL_CAT(UTIL_CAT(ZARD_, \
57+
UTIL_CAT(DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _IS_DIGITAL_)), \
58+
num)
59+
60+
#define ZARD_CONNECTOR_PIN_IS_ANALOG(node, num) \
61+
UTIL_CAT( \
62+
UTIL_CAT(ZARD_, UTIL_CAT(DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _IS_ANALOG_)), \
63+
num)
64+
65+
#define ZARD_CONNECTOR_PIN_NAME_D(node, num) \
66+
UTIL_CAT(UTIL_CAT(ZARD_, \
67+
UTIL_CAT(DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _PIN_NAME_D_)), \
68+
num)
69+
70+
#define ZARD_CONNECTOR_PIN_NAME_A(node, num) \
71+
UTIL_CAT(UTIL_CAT(ZARD_, \
72+
UTIL_CAT(DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _PIN_NAME_A_)), \
73+
num)
74+
75+
#define ZARD_CONN_DN_ENUMS(n, p, i) \
76+
COND_CODE_1(ZARD_CONNECTOR_PIN_IS_DIGITAL(DT_NODELABEL(ZARD_CONNECTOR), \
77+
DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)), \
78+
(ZARD_CONNECTOR_PIN_NAME_D(DT_NODELABEL(ZARD_CONNECTOR), \
79+
DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
80+
ZARD_GLOBAL_GPIO_OFFSET(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)) + \
81+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0),), ())
82+
83+
#define ZARD_CONN_AN_ENUMS(n, p, i) \
84+
COND_CODE_1(ZARD_CONNECTOR_PIN_IS_ANALOG(DT_NODELABEL(ZARD_CONNECTOR), \
85+
DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)), \
86+
(ZARD_CONNECTOR_PIN_NAME_A(DT_NODELABEL(ZARD_CONNECTOR), \
87+
DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
88+
ZARD_GLOBAL_GPIO_OFFSET(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)) + \
89+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0),), ())

0 commit comments

Comments
 (0)