145 lines
5.6 KiB
YAML
145 lines
5.6 KiB
YAML
# Copyright (c) 2022 Espressif Systems (Shanghai) Co., Ltd.
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
description: |
|
|
Espressif's pin controller is in charge of controlling pin configurations, pin
|
|
functionalities and pin properties as defined by pin states. In its turn, pin
|
|
states are composed by groups of pre-defined pin muxing definitions and user
|
|
provided pin properties.
|
|
|
|
Each Zephyr-based application has its own set of pin muxing/pin configuration
|
|
requirements. The next steps use ESP-WROVER-KIT's I2C_0 to illustrate how one
|
|
could change a node's pin state properties. Though based on a particular board,
|
|
the same steps can be tweaked to address specifics of any other target board.
|
|
|
|
Suppose an application running on top of the ESP-WROVER-KIT board, for some
|
|
reason it needs I2C_0's SDA signal to be routed to GPIO_33. When looking at
|
|
that board's original device tree source file (i.e., 'esp_wrover_kit.dts'),
|
|
you'll notice that the I2C_0 node is already assigned to a pre-defined state.
|
|
Below is highlighted the information that most interests us on that file
|
|
|
|
|
|
#include "esp_wrover_kit-pinctrl.dtsi"
|
|
|
|
&i2c0 {
|
|
...
|
|
pinctrl-0 = <&i2c0_default>;
|
|
pinctrl-names = "default";
|
|
};
|
|
|
|
|
|
From the above excerpt, the pincrl-0 property is assigned the 'i2c0_default'
|
|
state value. This and other pin states of the board are defined on another file
|
|
(in this case, 'esp_wrover_kit-pinctrl.dtsi') on the same folder of the DTS file.
|
|
Check below the excerpt describing I2C_0's default state on that file
|
|
|
|
|
|
i2c0_default: i2c0_default {
|
|
group1 {
|
|
pinmux = <I2C0_SDA_GPIO21>,
|
|
<I2C0_SCL_GPIO22>;
|
|
bias-pull-up;
|
|
drive-open-drain;
|
|
output-high;
|
|
};
|
|
};
|
|
|
|
|
|
Only the 'pinmux' property above is actually required, other properties can
|
|
be chosen if meaningful for the target application and, of course, supported
|
|
by your target hardware. For example, some custom board may have an external
|
|
pull-up resistor soldered to GPIO_21's pin pad, in which case, 'bias-pull-up'
|
|
could be no longer required.
|
|
|
|
Back to our fictional application, the previous I2C_0 state definition does not
|
|
meet our expectations as we would like to route I2C_0's SDA signal to GPIO_33
|
|
instead of to GPIO_21. To achieve it, we need to update the 'pinmux' property
|
|
accordingly.
|
|
|
|
Note that replacing 'I2C0_SDA_GPIO21' by 'I2C0_SDA_GPIO33' is very tempting and
|
|
may even work, however, unless you have checked the hardware documentation first,
|
|
it is not recommended. That's because there are no guarantees that a particular
|
|
IO pin has the capability to route any specific signal.
|
|
|
|
The recommendation is to check the pinmux macros definitions available for the
|
|
target SoC in the following URL
|
|
|
|
|
|
https://github.com/zephyrproject-rtos/zephyr/tree/main/include/zephyr/dt-bindings/pinctrl
|
|
|
|
|
|
The ESP-WROVER-KIT board is based on the ESP32 SoC, in that case, we search
|
|
through the file 'esp32-pinctrl.h' in the above URL. Luckily for us, there is
|
|
one definition on that file that corresponds to our needs
|
|
|
|
|
|
#define I2C0_SDA_GPIO33 \
|
|
ESP32_PINMUX(33, ESP_I2CEXT0_SDA_IN, ESP_I2CEXT0_SDA_OUT)
|
|
|
|
|
|
Now, we go back to edit 'esp_wrover_kit-pinctrl.dtsi' and create a new pin state
|
|
on that file (or replace/update the one already defined) using the pinmux macro
|
|
definition above, yielding
|
|
|
|
|
|
i2c0_default: i2c0_default {
|
|
group1 {
|
|
pinmux = <I2C0_SDA_GPIO33>,
|
|
<I2C0_SCL_GPIO22>;
|
|
bias-pull-up;
|
|
drive-open-drain;
|
|
output-high;
|
|
};
|
|
};
|
|
|
|
|
|
With proper modifications, the same steps above apply when using different
|
|
combinations of boards, SoCs, peripherals and peripheral pins.
|
|
|
|
Note: Not all pins are available for a given peripheral, it depends if that
|
|
pin supports a set of properties required by the target peripheral.
|
|
|
|
When defining a state, the pin muxing information is constrained to
|
|
the definitions at 'hal_espressif', however, pin properties (like
|
|
bias-push-pull, drive-open-drain, etc) can be freely chosen, given the
|
|
property is meaningful to the peripheral signal and that it is also
|
|
available in the target GPIO.
|
|
|
|
Another thing worth noting is that all pin properties should be grouped.
|
|
All pins sharing common properties go under a common group (in the above
|
|
example, all pins are in 'group1'). Other peripherals can have more than
|
|
one group.
|
|
|
|
compatible: "espressif,esp32-pinctrl"
|
|
|
|
include: base.yaml
|
|
|
|
child-binding:
|
|
description: |
|
|
Espressif pin controller pin configuration state nodes.
|
|
child-binding:
|
|
description:
|
|
Espressif pin controller pin configuration group.
|
|
|
|
include:
|
|
- name: pincfg-node.yaml
|
|
property-allowlist:
|
|
- bias-disable
|
|
- bias-pull-down
|
|
- bias-pull-up
|
|
- drive-push-pull
|
|
- drive-open-drain
|
|
- input-enable
|
|
- output-enable
|
|
- output-high
|
|
- output-low
|
|
|
|
properties:
|
|
pinmux:
|
|
required: true
|
|
type: array
|
|
description: |
|
|
Each array element represents pin muxing information of an individual
|
|
pin. The array elements are pre-declared macros taken from Espressif's
|
|
HAL.
|