#
# Copyright (c) 2024 Charles Dias <charlesdias.cd@outlook.com>
#
# SPDX-License-Identifier: Apache-2.0
#

description: |
    STM32 Digital Camera Memory Interface (DCMI).

    Example of node configuration at board level:

    &dcmi {
      status = "okay";
      sensor = <&ov2640>;
      pinctrl-0 = <&dcmi_hsync_pa4 &dcmi_pixclk_pa6 &dcmi_vsync_pb7
                  &dcmi_d0_pc6 &dcmi_d1_pc7 &dcmi_d2_pe0 &dcmi_d3_pe1
                  &dcmi_d4_pe4 &dcmi_d5_pd3 &dcmi_d6_pe5 &dcmi_d7_pe6>;
      pinctrl-names = "default";
      bus-width = <8>;
      hsync-active = <0>;
      vsync-active = <0>;
      pixelclk-active = <1>;
      capture-rate = <1>;
      dmas = <&dma1 0 75 (STM32_DMA_PERIPH_TO_MEMORY | STM32_DMA_PERIPH_NO_INC |
              STM32_DMA_MEM_INC | STM32_DMA_PERIPH_8BITS | STM32_DMA_MEM_32BITS |
              STM32_DMA_PRIORITY_HIGH) STM32_DMA_FIFO_1_4>;

      port {
        dcmi_ep_in: endpoint {
          remote-endpoint = <&ov2640_ep_out>;
        };
      };
    };

compatible: "st,stm32-dcmi"

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

properties:
  interrupts:
    required: true

  sensor:
    required: true
    type: phandle
    description: phandle of connected sensor device

  bus-width:
    type: int
    required: true
    enum:
      - 8
      - 10
      - 12
      - 14
    default: 8
    description: |
      Number of data lines actively used, valid for the parallel busses.

  hsync-active:
    type: int
    required: true
    enum:
      - 0
      - 1
    description: |
      Polarity of horizontal synchronization (DCMI_HSYNC_Polarity).
      0 Horizontal synchronization active Low.
      1 Horizontal synchronization active High.

      For example, if DCMI_HSYNC_Polarity is programmed active high:
      When HSYNC is low, the data is valid.
      When HSYNC is high, the data is not valid (horizontal blanking).

  vsync-active:
    type: int
    required: true
    enum:
      - 0
      - 1
    description: |
      Polarity of vertical synchronization (DCMI_VSYNC_Polarity).
      0 Vertical synchronization active Low.
      1 Vertical synchronization active High.

      For example, if DCMI_VSYNC_Polarity is programmed active high:
      When VSYNC is low, the data is valid.
      When VSYNC is high, the data is not valid (vertical blanking).

  pixelclk-active:
    type: int
    required: true
    enum:
      - 0
      - 1
    description: |
      Polarity of pixel clock (DCMI_PIXCK_Polarity).
      0 Pixel clock active on Falling edge.
      1 Pixel clock active on Rising edge.

  capture-rate:
    type: int
    enum:
      - 1
      - 2
      - 4
    default: 1
    description: |
      The DCMI can capture all frames or alternate frames. If it is not specified,
      the default is all frames.
      1 Capture all frames.
      2 Capture alternate frames.
      4 Capture one frame every 4 frames.

  dmas:
    required: true
    description: |
      phandle of DMA controller. The DMA controller should be compatible with
      DMA channel specifier. Specifies a phandle reference to the dma controller,
      the channel number, the slot number, channel configuration and finally features.

      dmas = <&dma1 0 75 (STM32_DMA_PERIPH_TO_MEMORY | STM32_DMA_PERIPH_NO_INC |
              STM32_DMA_MEM_INC | STM32_DMA_PERIPH_8BITS | STM32_DMA_MEM_32BITS |
              STM32_DMA_PRIORITY_HIGH) STM32_DMA_FIFO_1_4>;
