.. SPDX-License-Identifier: GPL-2.0

BCM2835 ISP Driver
==================

Introduction
------------

The BCM2835 Image Sensor Pipeline (ISP) is a fixed function hardware pipeline
for performing image processing operations.  Images are fed to the input
of the ISP through memory frame buffers.  These images may be in various YUV,
RGB, or Bayer formats.  A typical use case would have Bayer images obtained from
an image sensor by the BCM2835 Unicam peripheral, written to a memory
frame buffer, and finally fed into the input of the ISP.  Two concurrent output
images may be generated in YUV or RGB format at different resolutions.
Statistics output is also generated for Bayer input images.

The bcm2835-isp driver exposes the following media pads as V4L2 device nodes:

.. tabularcolumns:: |l|l|l|l|

.. cssclass: longtable

.. flat-table::

    * - *Pad*
      - *Direction*
      - *Purpose*
      - *Formats*

    * - "bcm2835-isp0-output0"
      - sink
      - Accepts Bayer, RGB or YUV format frame buffers as input to the ISP HW
        pipeline.
      - :ref:`RAW8 <V4L2-PIX-FMT-SRGGB8>`,
        :ref:`RAW10P <V4L2-PIX-FMT-SRGGB10P>`,
        :ref:`RAW12P <V4L2-PIX-FMT-SRGGB12P>`,
        :ref:`RAW14P <V4L2-PIX-FMT-SRGGB14P>`,
        :ref:`RAW16 <V4L2-PIX-FMT-SRGGB16>`,
        :ref:`RGB24/BGR24 <V4L2-PIX-FMT-RGB24>`,
        :ref:`YUYV <V4L2-PIX-FMT-YUYV>`,
        :ref:`YVYU <V4L2-PIX-FMT-YVYU>`,
        :ref:`UYVY <V4L2-PIX-FMT-UYVY>`,
        :ref:`VYUY <V4L2-PIX-FMT-VYUY>`,
        :ref:`YUV420/YVU420 <V4L2-PIX-FMT-YUV420>`

    * - "bcm2835-isp0-capture1"
      - source
      - High resolution YUV or RGB processed output from the ISP.
      - :ref:`RGB565 <V4L2-PIX-FMT-RGB565>`,
        :ref:`RGB24/BGR24 <V4L2-PIX-FMT-RGB24>`,
        :ref:`ABGR32 <V4L2-PIX-FMT-ABGR32>`,
        :ref:`YUYV <V4L2-PIX-FMT-YUYV>`,
        :ref:`YVYU <V4L2-PIX-FMT-YVYU>`,
        :ref:`UYVY <V4L2-PIX-FMT-UYVY>`,
        :ref:`VYUY <V4L2-PIX-FMT-VYUY>`.
        :ref:`YUV420/YVU420 <V4L2-PIX-FMT-YUV420>`,
        :ref:`NV12/NV21 <V4L2-PIX-FMT-NV12>`,

    * - "bcm2835-isp0-capture2"
      - source
      - Low resolution YUV processed output from the ISP. The output of
        this pad cannot have a resolution larger than the "bcm2835-isp0-capture1" pad in any dimension.
      - :ref:`YUYV <V4L2-PIX-FMT-YUYV>`,
        :ref:`YVYU <V4L2-PIX-FMT-YVYU>`,
        :ref:`UYVY <V4L2-PIX-FMT-UYVY>`,
        :ref:`VYUY <V4L2-PIX-FMT-VYUY>`.
        :ref:`YUV420/YVU420 <V4L2-PIX-FMT-YUV420>`,
        :ref:`NV12/NV21 <V4L2-PIX-FMT-NV12>`,

    * - "bcm2835-isp0-capture1"
      - source
      - Image statistics calculated from the input image provided on the
        "bcm2835-isp0-output0" pad.  Statistics are only available for Bayer
        format input images.
      - :ref:`v4l2-meta-fmt-bcm2835-isp-stats`.

Pipeline Configuration
----------------------

The ISP pipeline can be configure through user-space by calling
:ref:`VIDIOC_S_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` on the “bcm2835-isp0-output0”
node with the appropriate parameters as shown in the table below.

.. tabularcolumns:: |p{2cm}|p{5.0cm}|

.. cssclass: longtable

.. flat-table::

    * - *id*
      - *Parameter*

    * - ``V4L2_CID_USER_BCM2835_ISP_CC_MATRIX``
      - struct :c:type:`bcm2835_isp_custom_ccm`

    * - ``V4L2_CID_USER_BCM2835_ISP_LENS_SHADING``
      - struct :c:type:`bcm2835_isp_lens_shading`

    * - ``V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL``
      - struct :c:type:`bcm2835_isp_black_level`

    * - ``V4L2_CID_USER_BCM2835_ISP_GEQ``
      - struct :c:type:`bcm2835_isp_geq`

    * - ``V4L2_CID_USER_BCM2835_ISP_GAMMA``
      - struct :c:type:`bcm2835_isp_gamma`

    * - ``V4L2_CID_USER_BCM2835_ISP_DENOISE``
      - struct :c:type:`bcm2835_isp_denoise`

    * - ``V4L2_CID_USER_BCM2835_ISP_SHARPEN``
      - struct :c:type:`bcm2835_isp_sharpen`

    * - ``V4L2_CID_USER_BCM2835_ISP_DPC``
      - struct :c:type:`bcm2835_isp_dpc`

++++++++++++++++++++++++
Configuration Parameters
++++++++++++++++++++++++

.. kernel-doc:: include/uapi/linux/bcm2835-isp.h
   :functions: bcm2835_isp_rational bcm2835_isp_ccm bcm2835_isp_custom_ccm
                bcm2835_isp_gain_format bcm2835_isp_lens_shading
                bcm2835_isp_black_level bcm2835_isp_geq bcm2835_isp_gamma
                bcm2835_isp_denoise bcm2835_isp_sharpen
                bcm2835_isp_dpc_mode bcm2835_isp_dpc
