162306a36Sopenharmony_ci# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
262306a36Sopenharmony_ci%YAML 1.2
362306a36Sopenharmony_ci---
462306a36Sopenharmony_ci$id: http://devicetree.org/schemas/media/video-interface-devices.yaml#
562306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml#
662306a36Sopenharmony_ci
762306a36Sopenharmony_cititle: Common Properties for Video Receiver and Transmitter Devices
862306a36Sopenharmony_ci
962306a36Sopenharmony_cimaintainers:
1062306a36Sopenharmony_ci  - Jacopo Mondi <jacopo@jmondi.org>
1162306a36Sopenharmony_ci  - Sakari Ailus <sakari.ailus@linux.intel.com>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ciproperties:
1462306a36Sopenharmony_ci  flash-leds:
1562306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/phandle-array
1662306a36Sopenharmony_ci    description:
1762306a36Sopenharmony_ci      An array of phandles, each referring to a flash LED, a sub-node of the LED
1862306a36Sopenharmony_ci      driver device node.
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci  lens-focus:
2162306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/phandle
2262306a36Sopenharmony_ci    description:
2362306a36Sopenharmony_ci      A phandle to the node of the focus lens controller.
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci  rotation:
2662306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/uint32
2762306a36Sopenharmony_ci    enum: [ 0, 90, 180, 270 ]
2862306a36Sopenharmony_ci    description: |
2962306a36Sopenharmony_ci      The camera rotation is expressed as the angular difference in degrees
3062306a36Sopenharmony_ci      between two reference systems, one relative to the camera module, and one
3162306a36Sopenharmony_ci      defined on the external world scene to be captured when projected on the
3262306a36Sopenharmony_ci      image sensor pixel array.
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci      A camera sensor has a 2-dimensional reference system 'Rc' defined by its
3562306a36Sopenharmony_ci      pixel array read-out order. The origin is set to the first pixel being
3662306a36Sopenharmony_ci      read out, the X-axis points along the column read-out direction towards
3762306a36Sopenharmony_ci      the last columns, and the Y-axis along the row read-out direction towards
3862306a36Sopenharmony_ci      the last row.
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci      A typical example for a sensor with a 2592x1944 pixel array matrix
4162306a36Sopenharmony_ci      observed from the front is:
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci              2591       X-axis          0
4462306a36Sopenharmony_ci                <------------------------+ 0
4562306a36Sopenharmony_ci                .......... ... ..........!
4662306a36Sopenharmony_ci                .......... ... ..........! Y-axis
4762306a36Sopenharmony_ci                           ...           !
4862306a36Sopenharmony_ci                .......... ... ..........!
4962306a36Sopenharmony_ci                .......... ... ..........! 1943
5062306a36Sopenharmony_ci                                         V
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci      The external world scene reference system 'Rs' is a 2-dimensional
5362306a36Sopenharmony_ci      reference system on the focal plane of the camera module. The origin is
5462306a36Sopenharmony_ci      placed on the top-left corner of the visible scene, the X-axis points
5562306a36Sopenharmony_ci      towards the right, and the Y-axis points towards the bottom of the scene.
5662306a36Sopenharmony_ci      The top, bottom, left and right directions are intentionally not defined
5762306a36Sopenharmony_ci      and depend on the environment in which the camera is used.
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci      A typical example of a (very common) picture of a shark swimming from left
6062306a36Sopenharmony_ci      to right, as seen from the camera, is:
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci               0               X-axis
6362306a36Sopenharmony_ci             0 +------------------------------------->
6462306a36Sopenharmony_ci               !
6562306a36Sopenharmony_ci               !
6662306a36Sopenharmony_ci               !
6762306a36Sopenharmony_ci               !           |\____)\___
6862306a36Sopenharmony_ci               !           ) _____  __`<
6962306a36Sopenharmony_ci               !           |/     )/
7062306a36Sopenharmony_ci               !
7162306a36Sopenharmony_ci               !
7262306a36Sopenharmony_ci               !
7362306a36Sopenharmony_ci               V
7462306a36Sopenharmony_ci             Y-axis
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci      with the reference system 'Rs' placed on the camera focal plane:
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci                                  ¸.·˙!
7962306a36Sopenharmony_ci                              ¸.·˙    !
8062306a36Sopenharmony_ci                  _       ¸.·˙        !
8162306a36Sopenharmony_ci               +-/ \-+¸.·˙            !
8262306a36Sopenharmony_ci               | (o) |                ! Camera focal plane
8362306a36Sopenharmony_ci               +-----+˙·.¸            !
8462306a36Sopenharmony_ci                          ˙·.¸        !
8562306a36Sopenharmony_ci                              ˙·.¸    !
8662306a36Sopenharmony_ci                                  ˙·.¸!
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci      When projected on the sensor's pixel array, the image and the associated
8962306a36Sopenharmony_ci      reference system 'Rs' are typically (but not always) inverted, due to the
9062306a36Sopenharmony_ci      camera module's lens optical inversion effect.
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci      Assuming the above represented scene of the swimming shark, the lens
9362306a36Sopenharmony_ci      inversion projects the scene and its reference system onto the sensor
9462306a36Sopenharmony_ci      pixel array, seen from the front of the camera sensor, as follows:
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci            Y-axis
9762306a36Sopenharmony_ci               ^
9862306a36Sopenharmony_ci               !
9962306a36Sopenharmony_ci               !
10062306a36Sopenharmony_ci               !
10162306a36Sopenharmony_ci               !            |\_____)\__
10262306a36Sopenharmony_ci               !            ) ____  ___.<
10362306a36Sopenharmony_ci               !            |/    )/
10462306a36Sopenharmony_ci               !
10562306a36Sopenharmony_ci               !
10662306a36Sopenharmony_ci               !
10762306a36Sopenharmony_ci             0 +------------------------------------->
10862306a36Sopenharmony_ci               0               X-axis
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci      Note the shark being upside-down.
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci      The resulting projected reference system is named 'Rp'.
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci      The camera rotation property is then defined as the angular difference in
11562306a36Sopenharmony_ci      the counter-clockwise direction between the camera reference system 'Rc'
11662306a36Sopenharmony_ci      and the projected scene reference system 'Rp'. It is expressed in degrees
11762306a36Sopenharmony_ci      as a number in the range [0, 360[.
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci      Examples
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci      0 degrees camera rotation:
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci                    Y-Rp
12562306a36Sopenharmony_ci                     ^
12662306a36Sopenharmony_ci              Y-Rc   !
12762306a36Sopenharmony_ci               ^     !
12862306a36Sopenharmony_ci               !     !
12962306a36Sopenharmony_ci               !     !
13062306a36Sopenharmony_ci               !     !
13162306a36Sopenharmony_ci               !     !
13262306a36Sopenharmony_ci               !     !
13362306a36Sopenharmony_ci               !     !
13462306a36Sopenharmony_ci               !     !
13562306a36Sopenharmony_ci               !   0 +------------------------------------->
13662306a36Sopenharmony_ci               !     0               X-Rp
13762306a36Sopenharmony_ci             0 +------------------------------------->
13862306a36Sopenharmony_ci               0               X-Rc
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci                                X-Rc                0
14262306a36Sopenharmony_ci               <------------------------------------+ 0
14362306a36Sopenharmony_ci                           X-Rp                 0   !
14462306a36Sopenharmony_ci           <------------------------------------+ 0 !
14562306a36Sopenharmony_ci                                                !   !
14662306a36Sopenharmony_ci                                                !   !
14762306a36Sopenharmony_ci                                                !   !
14862306a36Sopenharmony_ci                                                !   !
14962306a36Sopenharmony_ci                                                !   !
15062306a36Sopenharmony_ci                                                !   !
15162306a36Sopenharmony_ci                                                !   !
15262306a36Sopenharmony_ci                                                !   V
15362306a36Sopenharmony_ci                                                !  Y-Rc
15462306a36Sopenharmony_ci                                                V
15562306a36Sopenharmony_ci                                               Y-Rp
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci      90 degrees camera rotation:
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci               0        Y-Rc
16062306a36Sopenharmony_ci             0 +-------------------->
16162306a36Sopenharmony_ci               !   Y-Rp
16262306a36Sopenharmony_ci               !    ^
16362306a36Sopenharmony_ci               !    !
16462306a36Sopenharmony_ci               !    !
16562306a36Sopenharmony_ci               !    !
16662306a36Sopenharmony_ci               !    !
16762306a36Sopenharmony_ci               !    !
16862306a36Sopenharmony_ci               !    !
16962306a36Sopenharmony_ci               !    !
17062306a36Sopenharmony_ci               !    !
17162306a36Sopenharmony_ci               !    !
17262306a36Sopenharmony_ci               !  0 +------------------------------------->
17362306a36Sopenharmony_ci               !    0              X-Rp
17462306a36Sopenharmony_ci               !
17562306a36Sopenharmony_ci               !
17662306a36Sopenharmony_ci               !
17762306a36Sopenharmony_ci               !
17862306a36Sopenharmony_ci               V
17962306a36Sopenharmony_ci              X-Rc
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci      180 degrees camera rotation:
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci                                            0
18462306a36Sopenharmony_ci       <------------------------------------+ 0
18562306a36Sopenharmony_ci                        X-Rc                !
18662306a36Sopenharmony_ci              Y-Rp                          !
18762306a36Sopenharmony_ci               ^                            !
18862306a36Sopenharmony_ci               !                            !
18962306a36Sopenharmony_ci               !                            !
19062306a36Sopenharmony_ci               !                            !
19162306a36Sopenharmony_ci               !                            !
19262306a36Sopenharmony_ci               !                            !
19362306a36Sopenharmony_ci               !                            !
19462306a36Sopenharmony_ci               !                            V
19562306a36Sopenharmony_ci               !                           Y-Rc
19662306a36Sopenharmony_ci             0 +------------------------------------->
19762306a36Sopenharmony_ci               0              X-Rp
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci      270 degrees camera rotation:
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci               0        Y-Rc
20262306a36Sopenharmony_ci             0 +-------------------->
20362306a36Sopenharmony_ci               !                                        0
20462306a36Sopenharmony_ci               !    <-----------------------------------+ 0
20562306a36Sopenharmony_ci               !                    X-Rp                !
20662306a36Sopenharmony_ci               !                                        !
20762306a36Sopenharmony_ci               !                                        !
20862306a36Sopenharmony_ci               !                                        !
20962306a36Sopenharmony_ci               !                                        !
21062306a36Sopenharmony_ci               !                                        !
21162306a36Sopenharmony_ci               !                                        !
21262306a36Sopenharmony_ci               !                                        !
21362306a36Sopenharmony_ci               !                                        !
21462306a36Sopenharmony_ci               !                                        V
21562306a36Sopenharmony_ci               !                                       Y-Rp
21662306a36Sopenharmony_ci               !
21762306a36Sopenharmony_ci               !
21862306a36Sopenharmony_ci               !
21962306a36Sopenharmony_ci               !
22062306a36Sopenharmony_ci               V
22162306a36Sopenharmony_ci              X-Rc
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci      Example one - Webcam
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci      A camera module installed on the user facing part of a laptop screen
22762306a36Sopenharmony_ci      casing used for video calls. The captured images are meant to be displayed
22862306a36Sopenharmony_ci      in landscape mode (width > height) on the laptop screen.
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci      The camera is typically mounted upside-down to compensate the lens optical
23162306a36Sopenharmony_ci      inversion effect:
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci                    Y-Rp
23462306a36Sopenharmony_ci              Y-Rc   ^
23562306a36Sopenharmony_ci               ^     !
23662306a36Sopenharmony_ci               !     !
23762306a36Sopenharmony_ci               !     !       |\_____)\__
23862306a36Sopenharmony_ci               !     !       ) ____  ___.<
23962306a36Sopenharmony_ci               !     !       |/    )/
24062306a36Sopenharmony_ci               !     !
24162306a36Sopenharmony_ci               !     !
24262306a36Sopenharmony_ci               !     !
24362306a36Sopenharmony_ci               !   0 +------------------------------------->
24462306a36Sopenharmony_ci               !     0           X-Rp
24562306a36Sopenharmony_ci             0 +------------------------------------->
24662306a36Sopenharmony_ci               0            X-Rc
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci      The two reference systems are aligned, the resulting camera rotation is
24962306a36Sopenharmony_ci      0 degrees, no rotation correction needs to be applied to the resulting
25062306a36Sopenharmony_ci      image once captured to memory buffers to correctly display it to users:
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci               +--------------------------------------+
25362306a36Sopenharmony_ci               !                                      !
25462306a36Sopenharmony_ci               !                                      !
25562306a36Sopenharmony_ci               !                                      !
25662306a36Sopenharmony_ci               !             |\____)\___              !
25762306a36Sopenharmony_ci               !             ) _____  __`<            !
25862306a36Sopenharmony_ci               !             |/     )/                !
25962306a36Sopenharmony_ci               !                                      !
26062306a36Sopenharmony_ci               !                                      !
26162306a36Sopenharmony_ci               !                                      !
26262306a36Sopenharmony_ci               +--------------------------------------+
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci      If the camera sensor is not mounted upside-down to compensate for the lens
26562306a36Sopenharmony_ci      optical inversion, the two reference systems will not be aligned, with
26662306a36Sopenharmony_ci      'Rp' being rotated 180 degrees relatively to 'Rc':
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci                        X-Rc                0
27062306a36Sopenharmony_ci       <------------------------------------+ 0
27162306a36Sopenharmony_ci                                            !
27262306a36Sopenharmony_ci              Y-Rp                          !
27362306a36Sopenharmony_ci               ^                            !
27462306a36Sopenharmony_ci               !                            !
27562306a36Sopenharmony_ci               !       |\_____)\__          !
27662306a36Sopenharmony_ci               !       ) ____  ___.<        !
27762306a36Sopenharmony_ci               !       |/    )/             !
27862306a36Sopenharmony_ci               !                            !
27962306a36Sopenharmony_ci               !                            !
28062306a36Sopenharmony_ci               !                            V
28162306a36Sopenharmony_ci               !                           Y-Rc
28262306a36Sopenharmony_ci             0 +------------------------------------->
28362306a36Sopenharmony_ci               0            X-Rp
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci      The image once captured to memory will then be rotated by 180 degrees:
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci               +--------------------------------------+
28862306a36Sopenharmony_ci               !                                      !
28962306a36Sopenharmony_ci               !                                      !
29062306a36Sopenharmony_ci               !                                      !
29162306a36Sopenharmony_ci               !              __/(_____/|             !
29262306a36Sopenharmony_ci               !            >.___  ____ (             !
29362306a36Sopenharmony_ci               !                 \(    \|             !
29462306a36Sopenharmony_ci               !                                      !
29562306a36Sopenharmony_ci               !                                      !
29662306a36Sopenharmony_ci               !                                      !
29762306a36Sopenharmony_ci               +--------------------------------------+
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci      A software rotation correction of 180 degrees should be applied to
30062306a36Sopenharmony_ci      correctly display the image:
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci               +--------------------------------------+
30362306a36Sopenharmony_ci               !                                      !
30462306a36Sopenharmony_ci               !                                      !
30562306a36Sopenharmony_ci               !                                      !
30662306a36Sopenharmony_ci               !             |\____)\___              !
30762306a36Sopenharmony_ci               !             ) _____  __`<            !
30862306a36Sopenharmony_ci               !             |/     )/                !
30962306a36Sopenharmony_ci               !                                      !
31062306a36Sopenharmony_ci               !                                      !
31162306a36Sopenharmony_ci               !                                      !
31262306a36Sopenharmony_ci               +--------------------------------------+
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci      Example two - Phone camera
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci      A camera installed on the back side of a mobile device facing away from
31762306a36Sopenharmony_ci      the user. The captured images are meant to be displayed in portrait mode
31862306a36Sopenharmony_ci      (height > width) to match the device screen orientation and the device
31962306a36Sopenharmony_ci      usage orientation used when taking the picture.
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci      The camera sensor is typically mounted with its pixel array longer side
32262306a36Sopenharmony_ci      aligned to the device longer side, upside-down mounted to compensate for
32362306a36Sopenharmony_ci      the lens optical inversion effect:
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci               0        Y-Rc
32662306a36Sopenharmony_ci             0 +-------------------->
32762306a36Sopenharmony_ci               !   Y-Rp
32862306a36Sopenharmony_ci               !    ^
32962306a36Sopenharmony_ci               !    !
33062306a36Sopenharmony_ci               !    !
33162306a36Sopenharmony_ci               !    !
33262306a36Sopenharmony_ci               !    !            |\_____)\__
33362306a36Sopenharmony_ci               !    !            ) ____  ___.<
33462306a36Sopenharmony_ci               !    !            |/    )/
33562306a36Sopenharmony_ci               !    !
33662306a36Sopenharmony_ci               !    !
33762306a36Sopenharmony_ci               !    !
33862306a36Sopenharmony_ci               !  0 +------------------------------------->
33962306a36Sopenharmony_ci               !    0                X-Rp
34062306a36Sopenharmony_ci               !
34162306a36Sopenharmony_ci               !
34262306a36Sopenharmony_ci               !
34362306a36Sopenharmony_ci               !
34462306a36Sopenharmony_ci               V
34562306a36Sopenharmony_ci              X-Rc
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci      The two reference systems are not aligned and the 'Rp' reference system is
34862306a36Sopenharmony_ci      rotated by 90 degrees in the counter-clockwise direction relatively to the
34962306a36Sopenharmony_ci      'Rc' reference system.
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci      The image once captured to memory will be rotated:
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci               +-------------------------------------+
35462306a36Sopenharmony_ci               |                 _ _                 |
35562306a36Sopenharmony_ci               |                \   /                |
35662306a36Sopenharmony_ci               |                 | |                 |
35762306a36Sopenharmony_ci               |                 | |                 |
35862306a36Sopenharmony_ci               |                 |  >                |
35962306a36Sopenharmony_ci               |                <  |                 |
36062306a36Sopenharmony_ci               |                 | |                 |
36162306a36Sopenharmony_ci               |                   .                 |
36262306a36Sopenharmony_ci               |                  V                  |
36362306a36Sopenharmony_ci               +-------------------------------------+
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci      A correction of 90 degrees in counter-clockwise direction has to be
36662306a36Sopenharmony_ci      applied to correctly display the image in portrait mode on the device
36762306a36Sopenharmony_ci      screen:
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci                        +--------------------+
37062306a36Sopenharmony_ci                        |                    |
37162306a36Sopenharmony_ci                        |                    |
37262306a36Sopenharmony_ci                        |                    |
37362306a36Sopenharmony_ci                        |                    |
37462306a36Sopenharmony_ci                        |                    |
37562306a36Sopenharmony_ci                        |                    |
37662306a36Sopenharmony_ci                        |   |\____)\___      |
37762306a36Sopenharmony_ci                        |   ) _____  __`<    |
37862306a36Sopenharmony_ci                        |   |/     )/        |
37962306a36Sopenharmony_ci                        |                    |
38062306a36Sopenharmony_ci                        |                    |
38162306a36Sopenharmony_ci                        |                    |
38262306a36Sopenharmony_ci                        |                    |
38362306a36Sopenharmony_ci                        |                    |
38462306a36Sopenharmony_ci                        +--------------------+
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci  orientation:
38762306a36Sopenharmony_ci    description:
38862306a36Sopenharmony_ci      The orientation of a device (typically an image sensor or a flash LED)
38962306a36Sopenharmony_ci      describing its mounting position relative to the usage orientation of the
39062306a36Sopenharmony_ci      system where the device is installed on.
39162306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/uint32
39262306a36Sopenharmony_ci    enum:
39362306a36Sopenharmony_ci        # Front. The device is mounted on the front facing side of the system. For
39462306a36Sopenharmony_ci        # mobile devices such as smartphones, tablets and laptops the front side
39562306a36Sopenharmony_ci        # is the user facing side.
39662306a36Sopenharmony_ci      - 0
39762306a36Sopenharmony_ci        # Back. The device is mounted on the back side of the system, which is
39862306a36Sopenharmony_ci        # defined as the opposite side of the front facing one.
39962306a36Sopenharmony_ci      - 1
40062306a36Sopenharmony_ci        # External. The device is not attached directly to the system but is
40162306a36Sopenharmony_ci        # attached in a way that allows it to move freely.
40262306a36Sopenharmony_ci      - 2
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ciadditionalProperties: true
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ci...
407