espressif,esp32-ledc

Vendor: Espressif Systems

Note

An implementation of a driver matching this compatible is available in drivers/pwm/pwm_led_esp32.c.

Description

Espressif's LEDC controller Node

The LEDC controller is primarily designed to control the intensity of LEDs, although it can be
used to generate PWM signals for other purposes as well.

The mapping between the channel and GPIO is done through pinctrl

  &ledc0 {
    pinctrl-0 = <&ledc0_default>;
    pinctrl-names = "default";
  }

The 'ledc0_default' node state is defined in <board>-pinctrl.dtsi.

  ledc0_default: ledc0_default {
          group1 {
                  pinmux = <LEDC_CH0_GPIO0>,
                           <LEDC_CH1_GPIO2>,
                           <LEDC_CH2_GPIO4>;
                  output-enable;
          };
  };

If another GPIO mapping is desired, check if <board>-pinctrl.dtsi already have it defined,
otherwise, define the required mapping at your own application folder into a custom
<board>.overlay file.
The 'pinmux' property uses a macro defined in
https://github.com/zephyrproject-rtos/hal_espressif/tree/zephyr/include/dt-bindings/pinctrl
Before including a new node, check if the desired mapping is available according to the SoC.

As an example, the 'ledc0_custom' state below illustrates an alternate mapping using another set
of channels and pins in a custom overlay file.

  &pinctrl {

          ledc0_custom:  ledc0_custom {
                  group1 {
                          pinmux = <LEDC_CH0_GPIO0>,
                                   <LEDC_CH9_GPIO2>,
                                   <LEDC_CH10_GPIO4>;
                          output-enable;
                  };
           };

  };

Use the child bindings to configure the desired channel:

  &ledc0 {
    pinctrl-0 = <&ledc0_custom>;
    pinctrl-names = "default";
    status = "okay";
    #address-cells = <1>;
    #size-cells = <0>;
    channel0@0 {
      reg = <0x0>;
      timer = <0>;
    };
    channel9@9 {
      reg = <0x9>;
      timer = <0>;
    };
    channel10@a {
      reg = <0xa>;
      timer = <1>;
    };
  };

  Note: The channel's 'reg' property defines the ID of the channel. It must match the channel used
    in the 'pinmux'.

Properties

Top level properties

These property descriptions apply to “espressif,esp32-ledc” nodes themselves. This page also describes child node properties in the following sections.

Properties not inherited from the base binding file.

Name

Type

Details

#pwm-cells

int

Number of items to expect in a pwm specifier

This property is required.

Constant value: 3

pinctrl-0

phandles

Pin configuration/s for the first state. Content is specific to the
selected pin controller driver implementation.

pinctrl-1

phandles

Pin configuration/s for the second state. See pinctrl-0.

pinctrl-2

phandles

Pin configuration/s for the third state. See pinctrl-0.

pinctrl-3

phandles

Pin configuration/s for the fourth state. See pinctrl-0.

pinctrl-4

phandles

Pin configuration/s for the fifth state. See pinctrl-0.

pinctrl-names

string-array

Names for the provided states. The number of names needs to match the
number of states.

Child node properties

Name

Type

Details

reg

int

The ESP32 has 8 low speed channel and 8 high speed channels.
The low speed channel are mapped from channel 0 to 7, and the high speed are mapped from
channel 8 to 15.

High speed channels are only available in the ESP32 SoC. ESP32S2 and ESP32S3 have 8
available channels, and ESP32C3 has 6. In these SoCs there is no differentiation between
low or high speed.

This property is required.

Legal values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15

See Important properties for more information.

timer

int

Timer selection.
For maximum flexibility, the high-speed as well as the low-speed channels can be driven from
one of four high-speed/low-speed timers.

This property is required.

Legal values: 0, 1, 2, 3

Specifier cell names

  • pwm cells: channel, period, flags