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 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 /*