# Copyright (c) 2022 Espressif Systems (Shanghai) Co., Ltd.
# SPDX-License-Identifier: Apache-2.0

description: |

  ESP32 Pulse Counter (PCNT)

  The pulse counter module is designed to count the number of
  rising and/or falling edges of an input signal.

  The ESP32's PCNT module has 8 independent counting “units” numbered from 0 to 7.
  ESP32S2 and ESP32S3 have 4 independent counting “units” numbered from 0 to 3.

  Each pulse counter unit has a 16-bit signed counter register.

  Each unit has two independent channel: ch0 and ch1 that can be configured
  to either increment or decrement the counter.

  Each channel has two inputs: a signal input that accepts signal edges
  to be detected, as well as a control input that can be used to enable
  or disable the signal input.

  Each pulse counter unit also features a filter on each of the four inputs,
  adding the option to ignore short glitches in the signals.

  By combining the usage of both signal and control inputs, a PCNT unit can
  act as a quadrature decoder.

  Example: Use PCNT to read a rotary-enconder

  The mapping between signal and control input and the pin is done through pinctrl:

    &pinctrl {
        pcnt_default: pcnt_default {
            group1 {
                pinmux = <PCNT0_CH0SIG_GPIO14>,
                        <PCNT0_CH0CTRL_GPIO15>;
                bias-pull-up;
            };
        };
    };

  Note: Check espressif,esp32-pinctrl.yaml for complete documentation regarding pinctrl.

  Use the PCNT node to configure the module:

    &pcnt {
      pinctrl-0 = <&pcnt_default>;
      pinctrl-names = "default";
      status = "okay";
      #address-cells = <1>;
      #size-cells = <0>;
      unit0@0 {
        reg = <0>;
        #address-cells = <1>;
        #size-cells = <0>;
        filter = <100>;
        channelA@0 {
            reg = <0>;
            sig-pos-mode = <2>;
            sig-neg-mode = <1>;
            ctrl-h-mode = <0>;
            ctrl-l-mode = <1>;
        };
      };
    };

compatible: "espressif,esp32-pcnt"

include: [sensor-device.yaml, pinctrl-device.yaml]

child-binding:
  description: PCNT Unit configuration.

  properties:
    reg:
      type: int
      required: true
      enum:
      - 0
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7

      description: |
        The PCNT unit index.
        The ESP32 has 8 PCNT units. ESP32S2/S3 have 4 PCNT units.

    filter:
      type: int
      description: Pulse length (ns) to be ignored

  child-binding:
    description: PCNT Channel configuration.

    properties:
      reg:
        type: int
        required: true
        enum:
        - 0
        - 1

        description: The PCNT channel index.

      sig-pos-mode:
        type: int
        enum:
        - 0
        - 1
        - 2

        description: |
          Define what to do on the positive edge of pulse input.
          0 (Default) - Inhibit counter (counter value will not change in this condition).
          1 - Increase counter value.
          2 - Decrease counter value.

      sig-neg-mode:
        type: int
        enum:
        - 0
        - 1
        - 2

        description: |
          Define what to do on the negative edge of pulse input.
          0 (Default) - Inhibit counter (counter value will not change in this condition).
          1 - Increase counter value.
          2 - Decrease counter value.

      ctrl-h-mode:
        type: int
        enum:
        - 0
        - 1
        - 2

        description: |
          Define what to do when the control input is high.
          0 (Default) - Don't change counter mode.
          1 - Invert counter mode(increase -> decrease, decrease -> increase).
          2 - Control mode: Inhibit counter (counter value will not change in this condition).

      ctrl-l-mode:
        type: int
        enum:
        - 0
        - 1
        - 2

        description: |
          Define what to do when the control input is low.
          0 (Default) - Don't change counter mode.
          1 - Invert counter mode(increase -> decrease, decrease -> increase).
          2 - Control mode: Inhibit counter (counter value will not change in this condition).
