From 1c2a6d425f6e662156328a088a97b98e36a9919c Mon Sep 17 00:00:00 2001 From: TOKITA Hiroshi Date: Mon, 10 Oct 2022 13:59:51 +0900 Subject: [PATCH 1/2] variants: Introduce the `builtin-led-gpios` node Introduce the `builtin-led-gpios` node to make possible to configuring the builtin-led from dts. This node uses to determine the value of the `LED_BUILTIN` macro. Use the `led0` alias to determine the `LED_BUILTIN` if the `builtin-led-gpios` is not defined. The behavior can override by defining the `LED_BUILTIN` in pinmap.h. It uses definitions that are defined in the header preferentially. Signed-off-by: TOKITA Hiroshi --- .../arduino_mkrzero/arduino_mkrzero.overlay | 3 +- .../arduino_mkrzero/arduino_mkrzero_pinmap.h | 1 - .../arduino_nano_33_ble.overlay | 2 + .../arduino_nano_33_ble_pinmap.h | 1 - .../arduino_nano_33_ble_sense.overlay | 2 + .../arduino_nano_33_ble_sense_pinmap.h | 1 - .../arduino_nano_33_iot_pinmap.h | 1 - .../nrf52840dk_nrf52840_pinmap.h | 2 - variants/variants.h | 43 +++++++++++++++++++ 9 files changed, 49 insertions(+), 7 deletions(-) diff --git a/variants/arduino_mkrzero/arduino_mkrzero.overlay b/variants/arduino_mkrzero/arduino_mkrzero.overlay index 19e90afa..a5505b48 100644 --- a/variants/arduino_mkrzero/arduino_mkrzero.overlay +++ b/variants/arduino_mkrzero/arduino_mkrzero.overlay @@ -29,7 +29,8 @@ <&arduino_mkr_header 18 0>, /* D18 / A4 / I2C-SDA */ <&arduino_mkr_header 19 0>, /* D19 / A5 / I2C-SCL */ <&arduino_mkr_header 20 0>, - <&arduino_mkr_header 21 0>; + <&arduino_mkr_header 21 0>, + <&portb 8 0>; pwms = <&tcc0 2 255>, <&tcc0 3 255>; diff --git a/variants/arduino_mkrzero/arduino_mkrzero_pinmap.h b/variants/arduino_mkrzero/arduino_mkrzero_pinmap.h index 11609bd0..1ad579e4 100644 --- a/variants/arduino_mkrzero/arduino_mkrzero_pinmap.h +++ b/variants/arduino_mkrzero/arduino_mkrzero_pinmap.h @@ -9,4 +9,3 @@ #include #include -#define LED_BUILTIN 22 diff --git a/variants/arduino_nano_33_ble/arduino_nano_33_ble.overlay b/variants/arduino_nano_33_ble/arduino_nano_33_ble.overlay index 2153020f..6f8d0bed 100644 --- a/variants/arduino_nano_33_ble/arduino_nano_33_ble.overlay +++ b/variants/arduino_nano_33_ble/arduino_nano_33_ble.overlay @@ -44,6 +44,8 @@ serials = <&uart0>; i2cs = <&arduino_nano_i2c>; + + builtin-led-gpios = <&arduino_nano_header 13 0>; }; }; diff --git a/variants/arduino_nano_33_ble/arduino_nano_33_ble_pinmap.h b/variants/arduino_nano_33_ble/arduino_nano_33_ble_pinmap.h index d1a6d6b5..48517b4d 100644 --- a/variants/arduino_nano_33_ble/arduino_nano_33_ble_pinmap.h +++ b/variants/arduino_nano_33_ble/arduino_nano_33_ble_pinmap.h @@ -11,4 +11,3 @@ #include #include -#define LED_BUILTIN 13 diff --git a/variants/arduino_nano_33_ble_sense/arduino_nano_33_ble_sense.overlay b/variants/arduino_nano_33_ble_sense/arduino_nano_33_ble_sense.overlay index 2153020f..6f8d0bed 100644 --- a/variants/arduino_nano_33_ble_sense/arduino_nano_33_ble_sense.overlay +++ b/variants/arduino_nano_33_ble_sense/arduino_nano_33_ble_sense.overlay @@ -44,6 +44,8 @@ serials = <&uart0>; i2cs = <&arduino_nano_i2c>; + + builtin-led-gpios = <&arduino_nano_header 13 0>; }; }; diff --git a/variants/arduino_nano_33_ble_sense/arduino_nano_33_ble_sense_pinmap.h b/variants/arduino_nano_33_ble_sense/arduino_nano_33_ble_sense_pinmap.h index d1a6d6b5..48517b4d 100644 --- a/variants/arduino_nano_33_ble_sense/arduino_nano_33_ble_sense_pinmap.h +++ b/variants/arduino_nano_33_ble_sense/arduino_nano_33_ble_sense_pinmap.h @@ -11,4 +11,3 @@ #include #include -#define LED_BUILTIN 13 diff --git a/variants/arduino_nano_33_iot/arduino_nano_33_iot_pinmap.h b/variants/arduino_nano_33_iot/arduino_nano_33_iot_pinmap.h index d1a6d6b5..48517b4d 100644 --- a/variants/arduino_nano_33_iot/arduino_nano_33_iot_pinmap.h +++ b/variants/arduino_nano_33_iot/arduino_nano_33_iot_pinmap.h @@ -11,4 +11,3 @@ #include #include -#define LED_BUILTIN 13 diff --git a/variants/nrf52840dk_nrf52840/nrf52840dk_nrf52840_pinmap.h b/variants/nrf52840dk_nrf52840/nrf52840dk_nrf52840_pinmap.h index b5cc2d90..976d3241 100644 --- a/variants/nrf52840dk_nrf52840/nrf52840dk_nrf52840_pinmap.h +++ b/variants/nrf52840dk_nrf52840/nrf52840dk_nrf52840_pinmap.h @@ -11,6 +11,4 @@ #include #include -#define LED_BUILTIN 22 - #endif diff --git a/variants/variants.h b/variants/variants.h index feb8d496..1fdea12a 100644 --- a/variants/variants.h +++ b/variants/variants.h @@ -37,6 +37,49 @@ #undef DIGITAL_PIN_CHECK_UNIQUE +#ifndef LED_BUILTIN + +/* Return the index of it if matched, oterwise return 0 */ +#define LED_BUILTIN_INDEX_BY_REG_AND_PINNUM(n, p, i, dev, num) \ + (DIGITAL_PIN_EXISTS(n, p, i, dev, num) ? i : 0) + +/* Only matched pin returns non-zero value, so the sum is matched pin's index */ +#define LED_BUILTIN_FIND_DIGITAL_PIN(dev, pin) \ + DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_PATH(zephyr_user), digital_pin_gpios, \ + LED_BUILTIN_INDEX_BY_REG_AND_PINNUM, (+), dev, pin) + +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), builtin_led_gpios) && \ + (DT_PROP_LEN(DT_PATH(zephyr_user), builtin_led_gpios) > 0) + +#if !(DT_FOREACH_PROP_ELEM_SEP_VARGS( \ + DT_PATH(zephyr_user), digital_pin_gpios, DIGITAL_PIN_EXISTS, (+), \ + DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0)), \ + DT_PHA_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0, pin)) > 0) +#warning "pin not found in digital_pin_gpios" +#else +#define LED_BUILTIN \ + LED_BUILTIN_FIND_DIGITAL_PIN( \ + DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0)), \ + DT_PHA_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0, pin)) +#endif + +/* If digital-pin-gpios is not defined, tries to use the led0 alias */ +#elif DT_NODE_EXISTS(DT_ALIAS(led0)) + +#if !(DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_PATH(zephyr_user), digital_pin_gpios, DIGITAL_PIN_EXISTS, \ + (+), DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)), \ + DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin)) > 0) +#warning "pin not found in digital_pin_gpios" +#else +#define LED_BUILTIN \ + LED_BUILTIN_FIND_DIGITAL_PIN(DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)), \ + DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin)) +#endif + +#endif // builtin_led_gpios + +#endif // LED_BUILTIN + #define DN_ENUMS(n, p, i) D##i = i /* From d5d53c69decf9affc2a28cd014ebba108bcb8b56 Mon Sep 17 00:00:00 2001 From: TOKITA Hiroshi Date: Mon, 10 Oct 2022 13:25:39 +0900 Subject: [PATCH 2/2] documentation: Add document about `builtin-led-gpios` Add a description for `builtin-led-gpios` Signed-off-by: TOKITA Hiroshi --- documentation/variants.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/documentation/variants.md b/documentation/variants.md index 4344a518..79e98a79 100644 --- a/documentation/variants.md +++ b/documentation/variants.md @@ -129,6 +129,34 @@ The following example instantiates `Wire` and `Wire2` with each `i2c0` and `i2c1 }; ``` +### Configure Builtin-LED + +The `builtin-led-gpios` node defines the Builtin-LED. +This node defines the `LED_BUILTIN` value by looking up the `digital-pin-gpios` +array to find the index of the pin. + +The node is phandle-array, which uses the format same as `digital-pin-gpios`. + +It set the digital pin number to the `LED_BUILTIN` if found the pin +that defined in `builtin-led-gpios` from `digital-pin-gpios`. + +If the `builtin-led-gpios` is not defined, Use the node aliased as `led0` +to define `LED_BUILTIN`. + +The `LED_BUILTIN` does not define here if it has not found both nodes or +defined `LED_BUILTIN` already. + +For example, in the case of the 13th digital pins connected to the onboard LED, +define `builtin-led-gpios` as follows. + +``` +/ { + zephyr,user { + builtin-led-gpios = <&arduino_nano_header 13 0>; + }; +}; +``` + ### Overlays from scratch You can see in the example above that there is no mapping for `LED0` in the