All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v7 00/11] media: Report camera sensor properties
@ 2020-03-18 20:50 Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 01/11] dt-bindings: video-interfaces: Document 'location' property Jacopo Mondi
                   ` (10 more replies)
  0 siblings, 11 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel

This series has been floating around for quite a long time already.

This v7 is rebased on latest media master and the only change is actually
the rotation property description.

While working on libcamera we have gone through a -long- discussion and several
attempts to provide a precise definition for the camera rotation.  We came up
with a pretty lengthy description which I have replicated exactly here in the
DTS property definition. The description is meant to be read by integrators
which need a reference in order to properly calculate the rotation of their
camera modules. The property is thus expanded to be defined as the rotation
difference between to reference systems, precisely defined to reduce the
risk of having different interpretations between different camera module
integrators.

In the V4L2_CID_CAMERA_SENSOR_ROTATION control documentation I tried to provide
a description on how to use the control from a user point of view. The
description is meant to be read by application developers, which needs to
know how to rotate images to compensate the camera rotation. The value of the
control is exactly the same as the property one, but described from a consumer
point of view.

The rest of the series is unchanged.

Thanks
   j

Jacopo Mondi (11):
  dt-bindings: video-interfaces: Document 'location' property
  media: v4l2-ctrl: Document V4L2_CID_CAMERA_SENSOR_LOCATION
  dt-bindings: video-interface: Replace 'rotation' description
  media: v4l2-ctrl: Document V4L2_CID_CAMERA_SENSOR_ROTATION
  media: v4l2-ctrls: Add camera location and rotation
  media: v4l2-fwnode: Add helper to parse device properties
  include: v4l2-ctrl: Sort forward declarations
  media: v4l2-ctrls: Sort includes alphabetically
  media: v4l2-ctrls: Add helper to register properties
  media: i2c: ov5670: Parse and register properties
  media: i2c: ov13858: Parse and register properties

 .../bindings/media/video-interfaces.txt       | 372 +++++++++++++++++-
 .../media/uapi/v4l/ext-ctrls-camera.rst       | 153 +++++++
 drivers/media/i2c/ov13858.c                   |  11 +
 drivers/media/i2c/ov5670.c                    |  12 +
 drivers/media/v4l2-core/v4l2-ctrls.c          |  52 ++-
 drivers/media/v4l2-core/v4l2-fwnode.c         |  42 ++
 include/media/v4l2-ctrls.h                    |  34 +-
 include/media/v4l2-fwnode.h                   |  47 +++
 include/uapi/linux/v4l2-controls.h            |   7 +
 9 files changed, 718 insertions(+), 12 deletions(-)

--
2.25.1


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v7 01/11] dt-bindings: video-interfaces: Document 'location' property
  2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
@ 2020-03-18 20:50 ` Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 02/11] media: v4l2-ctrl: Document V4L2_CID_CAMERA_SENSOR_LOCATION Jacopo Mondi
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel, Rob Herring, Tomasz Figa

Add the 'location' device property, used to specify a device mounting
position. The property is particularly meaningful for mobile devices
with a well defined usage orientation.

Reviewed-by: Rob Herring <robh@kernel.org>
Acked-by: Tomasz Figa <tfiga@chromium.org>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 .../devicetree/bindings/media/video-interfaces.txt    | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/Documentation/devicetree/bindings/media/video-interfaces.txt b/Documentation/devicetree/bindings/media/video-interfaces.txt
index f884ada0bffc..1211bdf80722 100644
--- a/Documentation/devicetree/bindings/media/video-interfaces.txt
+++ b/Documentation/devicetree/bindings/media/video-interfaces.txt
@@ -89,6 +89,17 @@ Optional properties
   but a number of degrees counter clockwise. Typical values are 0 and 180
   (upside down).
 
+- location: The mount location of a device (typically an image sensor or a flash
+  LED) expressed as a position relative to the usage orientation of the system
+  where the device is installed on.
+  Possible values are:
+  0 - Front. The device is mounted on the front facing side of the system.
+  For mobile devices such as smartphones, tablets and laptops the front side is
+  the user facing side.
+  1 - Back. The device is mounted on the back side of the system, which is
+  defined as the opposite side of the front facing one.
+  2 - External. The device is not attached directly to the system but is
+  attached in a way that allows it to move freely.
 
 Optional endpoint properties
 ----------------------------
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v7 02/11] media: v4l2-ctrl: Document V4L2_CID_CAMERA_SENSOR_LOCATION
  2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 01/11] dt-bindings: video-interfaces: Document 'location' property Jacopo Mondi
@ 2020-03-18 20:50 ` Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 03/11] dt-bindings: video-interface: Replace 'rotation' description Jacopo Mondi
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel

Add documentation for the V4L2_CID_CAMERA_SENSOR_LOCATION camera
control. The newly added read-only control reports the camera device
mounting position.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 .../media/uapi/v4l/ext-ctrls-camera.rst       | 32 +++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/Documentation/media/uapi/v4l/ext-ctrls-camera.rst b/Documentation/media/uapi/v4l/ext-ctrls-camera.rst
index 51c1d5c9eb00..b151c016256c 100644
--- a/Documentation/media/uapi/v4l/ext-ctrls-camera.rst
+++ b/Documentation/media/uapi/v4l/ext-ctrls-camera.rst
@@ -510,6 +510,38 @@ enum v4l2_scene_mode -
     value down. A value of zero stops the motion if one is in progress
     and has no effect otherwise.
 
+``V4L2_CID_CAMERA_SENSOR_LOCATION (integer)``
+    This read-only control describes the camera sensor location by reporting
+    its mounting position on the device where the camera is installed. The
+    control value is constant and not modifiable by software. This control is
+    particularly meaningful for devices which have a well defined orientation,
+    such as phones, laptops and portable devices since the camera location is
+    expressed as a position relative to the device's intended usage orientation.
+    For example, a camera sensor installed on the user-facing side of a phone,
+    a tablet or a laptop device is said to be installed in the
+    ``V4L2_LOCATION_FRONT`` location while camera sensors installed on the side
+    opposite the front one are said to be installed in the
+    ``V4L2_LOCATION_BACK`` location. Camera sensors not directly attached to
+    the device or attached in a way that allows them to move freely, such as
+    webcams and digital cameras, are said to have the ``V4L2_LOCATION_EXTERNAL``
+    location.
+
+
+
+.. flat-table::
+    :header-rows:  0
+    :stub-columns: 0
+
+    * - ``V4L2_LOCATION_FRONT``
+      - The camera sensor is located on the front side of the device.
+    * - ``V4L2_LOCATION_BACK``
+      - The camera sensor is located on the back side of the device.
+    * - ``V4L2_LOCATION_EXTERNAL``
+      - The camera sensor is not directly attached to the device and is
+        freely movable.
+
+
+
 .. [#f1]
    This control may be changed to a menu control in the future, if more
    options are required.
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v7 03/11] dt-bindings: video-interface: Replace 'rotation' description
  2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 01/11] dt-bindings: video-interfaces: Document 'location' property Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 02/11] media: v4l2-ctrl: Document V4L2_CID_CAMERA_SENSOR_LOCATION Jacopo Mondi
@ 2020-03-18 20:50 ` Jacopo Mondi
  2020-03-20  1:03   ` Rob Herring
                     ` (2 more replies)
  2020-03-18 20:50 ` [PATCH v7 04/11] media: v4l2-ctrl: Document V4L2_CID_CAMERA_SENSOR_ROTATION Jacopo Mondi
                   ` (7 subsequent siblings)
  10 siblings, 3 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel, robh, devicetree, Niklas Soderlund

Replace the 'rotation' property description by providing a definition
relative to the camera sensor pixel array coordinate system and the
captured scene.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Co-developed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Co-developed-by: Niklas Soderlund <niklas.soderlund@ragnatech.se>

---
 .../bindings/media/video-interfaces.txt       | 359 +++++++++++++++++-
 1 file changed, 356 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/media/video-interfaces.txt b/Documentation/devicetree/bindings/media/video-interfaces.txt
index 1211bdf80722..36e61d599f34 100644
--- a/Documentation/devicetree/bindings/media/video-interfaces.txt
+++ b/Documentation/devicetree/bindings/media/video-interfaces.txt
@@ -85,9 +85,362 @@ Optional properties

 - lens-focus: A phandle to the node of the focus lens controller.

-- rotation: The device, typically an image sensor, is not mounted upright,
-  but a number of degrees counter clockwise. Typical values are 0 and 180
-  (upside down).
+- rotation: The camera rotation is expressed as the angular difference in
+  degrees between two reference systems, one relative to the camera module, and
+  one defined on the external world scene to be captured when projected on the
+  image sensor pixel array.
+
+  A camera sensor has a 2-dimensional reference system 'Rc' defined by
+  its pixel array read-out order. The origin is set to the first pixel
+  being read out, the X-axis points along the column read-out direction
+  towards the last columns, and the Y-axis along the row read-out
+  direction towards the last row.
+
+  A typical example for a sensor with a 2592x1944 pixel array matrix
+  observed from the front is
+
+              2591       X-axis          0
+                <------------------------+ 0
+                .......... ... ..........!
+                .......... ... ..........! Y-axis
+                           ...           !
+                .......... ... ..........!
+                .......... ... ..........! 1943
+                                         V
+
+  The external world scene reference system 'Rs' is a 2-dimensional
+  reference system on the focal plane of the camera module. The origin is
+  placed on the top-left corner of the visible scene, the X-axis points
+  towards the right, and the Y-axis points towards the bottom of the
+  scene. The top, bottom, left and right directions are intentionally not
+  defined and depend on the environment in which the camera is used.
+
+  A typical example of a (very common) picture of a shark swimming from
+  left to right, as seen from the camera, is
+
+               0               X-axis
+             0 +------------------------------------->
+               !
+               !
+               !
+               !           |\____)\___
+               !           ) _____  __`<
+               !           |/     )/
+               !
+               !
+               !
+               V
+             Y-axis
+
+  With the reference system 'Rs' placed on the camera focal plane.
+
+                                  ¸.·˙!
+                              ¸.·˙    !
+                  _       ¸.·˙        !
+               +-/ \-+¸.·˙            !
+               | (o) |                ! Camera focal plane
+               +-----+˙·.¸            !
+                          ˙·.¸        !
+                              ˙·.¸    !
+                                  ˙·.¸!
+
+  When projected on the sensor's pixel array, the image and the associated
+  reference system 'Rs' are typically (but not always) inverted, due to
+  the camera module's lens optical inversion effect.
+
+  Assuming the above represented scene of the swimming shark, the lens
+  inversion projects the scene and its reference system onto the sensor
+  pixel array, seen from the front of the camera sensor, as follow
+
+            Y-axis
+               ^
+               !
+               !
+               !
+               !            |\_____)\__
+               !            ) ____  ___.<
+               !            |/    )/
+               !
+               !
+               !
+             0 +------------------------------------->
+               0               X-axis
+
+  Note the shark being upside-down.
+
+  The resulting projected reference system is named 'Rp'.
+
+  The camera rotation property is then defined as the angular difference
+  in the counter-clockwise direction between the camera reference system
+  'Rc' and the projected scene reference system 'Rp'. It is expressed in
+  degrees as a number in the range [0, 360[.
+
+  Examples
+
+  0 degrees camera rotation
+
+
+                    Y-Rp
+                     ^
+              Y-Rc   !
+               ^     !
+               !     !
+               !     !
+               !     !
+               !     !
+               !     !
+               !     !
+               !     !
+               !   0 +------------------------------------->
+               !     0               X-Rp
+             0 +------------------------------------->
+               0               X-Rc
+
+
+                                X-Rc                0
+               <------------------------------------+ 0
+                           X-Rp                 0   !
+           <------------------------------------+ 0 !
+                                                !   !
+                                                !   !
+                                                !   !
+                                                !   !
+                                                !   !
+                                                !   !
+                                                !   !
+                                                !   V
+                                                !  Y-Rc
+                                                V
+                                               Y-Rp
+
+  90 degrees camera rotation
+
+               0        Y-Rc
+             0 +-------------------->
+               !   Y-Rp
+               !    ^
+               !    !
+               !    !
+               !    !
+               !    !
+               !    !
+               !    !
+               !    !
+               !    !
+               !    !
+               !  0 +------------------------------------->
+               !    0              X-Rp
+               !
+               !
+               !
+               !
+               V
+              X-Rc
+
+  180 degrees camera rotation
+
+                                            0
+       <------------------------------------+ 0
+                        X-Rc                !
+              Y-Rp                          !
+               ^                            !
+               !                            !
+               !                            !
+               !                            !
+               !                            !
+               !                            !
+               !                            !
+               !                            V
+               !                           Y-Rc
+             0 +------------------------------------->
+               0              X-Rp
+
+  270 degrees camera rotation
+
+               0        Y-Rc
+             0 +-------------------->
+               !                                        0
+               !    <-----------------------------------+ 0
+               !                    X-Rp                !
+               !                                        !
+               !                                        !
+               !                                        !
+               !                                        !
+               !                                        !
+               !                                        !
+               !                                        !
+               !                                        !
+               !                                        V
+               !                                       Y-Rp
+               !
+               !
+               !
+               !
+               V
+              X-Rc
+
+
+  Example one - Webcam
+
+  A camera module installed on the user facing part of a laptop screen
+  casing used for video calls. The captured images are meant to be
+  displayed in landscape mode (width > height) on the laptop screen.
+
+  The camera is typically mounted upside-down to compensate the lens
+  optical inversion effect.
+
+                    Y-Rp
+              Y-Rc   ^
+               ^     !
+               !     !
+               !     !       |\_____)\__
+               !     !       ) ____  ___.<
+               !     !       |/    )/
+               !     !
+               !     !
+               !     !
+               !   0 +------------------------------------->
+               !     0           X-Rp
+             0 +------------------------------------->
+               0            X-Rc
+
+  The two reference systems are aligned, the resulting camera rotation is
+  0 degrees, no rotation correction needs to be applied to the resulting
+  image once captured to memory buffers to correctly display it to users.
+
+               +--------------------------------------+
+               !                                      !
+               !                                      !
+               !                                      !
+               !             |\____)\___              !
+               !             ) _____  __`<            !
+               !             |/     )/                !
+               !                                      !
+               !                                      !
+               !                                      !
+               +--------------------------------------+
+
+  If the camera sensor is not mounted upside-down to compensate for the
+  lens optical inversion, the two reference systems will not be aligned,
+  with 'Rp' being rotated 180 degrees relatively to 'Rc'.
+
+
+                        X-Rc                0
+       <------------------------------------+ 0
+                                            !
+              Y-Rp                          !
+               ^                            !
+               !                            !
+               !       |\_____)\__          !
+               !       ) ____  ___.<        !
+               !       |/    )/             !
+               !                            !
+               !                            !
+               !                            V
+               !                           Y-Rc
+             0 +------------------------------------->
+               0            X-Rp
+
+  The image once captured to memory will then be rotated by 180 degrees
+
+               +--------------------------------------+
+               !                                      !
+               !                                      !
+               !                                      !
+               !              __/(_____/|             !
+               !            >.___  ____ (             !
+               !                 \(    \|             !
+               !                                      !
+               !                                      !
+               !                                      !
+               +--------------------------------------+
+
+  A software rotation correction of 180 degrees should be applied to
+  correctly display the image.
+
+               +--------------------------------------+
+               !                                      !
+               !                                      !
+               !                                      !
+               !             |\____)\___              !
+               !             ) _____  __`<            !
+               !             |/     )/                !
+               !                                      !
+               !                                      !
+               !                                      !
+               +--------------------------------------+
+
+  Example two - Phone camera
+
+  A camera installed on the back side of a mobile device facing away from
+  the user. The captured images are meant to be displayed in portrait mode
+  (height > width) to match the device screen orientation and the device
+  usage orientation used when taking the picture.
+
+  The camera sensor is typically mounted with its pixel array longer side
+  aligned to the device longer side, upside-down mounted to compensate for
+  the lens optical inversion effect.
+
+               0        Y-Rc
+             0 +-------------------->
+               !   Y-Rp
+               !    ^
+               !    !
+               !    !
+               !    !
+               !    !            |\_____)\__
+               !    !            ) ____  ___.<
+               !    !            |/    )/
+               !    !
+               !    !
+               !    !
+               !  0 +------------------------------------->
+               !    0                X-Rp
+               !
+               !
+               !
+               !
+               V
+              X-Rc
+
+  The two reference systems are not aligned and the 'Rp' reference
+  system is rotated by 90 degrees in the counter-clockwise direction
+  relatively to the 'Rc' reference system.
+
+  The image once captured to memory will be rotated.
+
+               +-------------------------------------+
+               |                 _ _                 |
+               |                \   /                |
+               |                 | |                 |
+               |                 | |                 |
+               |                 |  >                |
+               |                <  |                 |
+               |                 | |                 |
+               |                   .                 |
+               |                  V                  |
+               +-------------------------------------+
+
+  A correction of 90 degrees in counter-clockwise direction has to be
+  applied to correctly display the image in portrait mode on the device
+  screen.
+
+                        +--------------------+
+                        |                    |
+                        |                    |
+                        |                    |
+                        |                    |
+                        |                    |
+                        |                    |
+                        |   |\____)\___      |
+                        |   ) _____  __`<    |
+                        |   |/     )/        |
+                        |                    |
+                        |                    |
+                        |                    |
+                        |                    |
+                        |                    |
+                        +--------------------+

 - location: The mount location of a device (typically an image sensor or a flash
   LED) expressed as a position relative to the usage orientation of the system
--
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v7 04/11] media: v4l2-ctrl: Document V4L2_CID_CAMERA_SENSOR_ROTATION
  2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
                   ` (2 preceding siblings ...)
  2020-03-18 20:50 ` [PATCH v7 03/11] dt-bindings: video-interface: Replace 'rotation' description Jacopo Mondi
@ 2020-03-18 20:50 ` Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 05/11] media: v4l2-ctrls: Add camera location and rotation Jacopo Mondi
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel

Add documentation for the V4L2_CID_CAMERA_SENSOR_ROTATION camera
control. The newly added read-only control reports the rotation
correction to be applied to images before displaying them to the user.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 .../media/uapi/v4l/ext-ctrls-camera.rst       | 121 ++++++++++++++++++
 1 file changed, 121 insertions(+)

diff --git a/Documentation/media/uapi/v4l/ext-ctrls-camera.rst b/Documentation/media/uapi/v4l/ext-ctrls-camera.rst
index b151c016256c..0fab9b004015 100644
--- a/Documentation/media/uapi/v4l/ext-ctrls-camera.rst
+++ b/Documentation/media/uapi/v4l/ext-ctrls-camera.rst
@@ -542,6 +542,127 @@ enum v4l2_scene_mode -
 
 
 
+``V4L2_CID_CAMERA_SENSOR_ROTATION (integer)``
+    This read-only control describes the rotation correction in degrees in the
+    counter-clockwise direction to be applied to the captured images once
+    captured to memory to compensate for the camera sensor mounting rotation.
+
+    For a precise definition of the sensor mounting rotation refer to the
+    extensive description of the 'rotation' properties in the device tree
+    bindings file 'video-interfaces.txt'.
+
+    A few examples are below reported, using a shark swimming from left to
+    right in front of the user as the example scene to capture. ::
+
+                 0               X-axis
+               0 +------------------------------------->
+                 !
+                 !
+                 !
+                 !           |\____)\___
+                 !           ) _____  __`<
+                 !           |/     )/
+                 !
+                 !
+                 !
+                 V
+               Y-axis
+
+    Example one - Webcam
+
+    Assuming you can bring your laptop with you while swimming with sharks,
+    the camera module of the laptop is installed on the user facing part of a
+    laptop screen casing, and is typically used for video calls. The captured
+    images are meant to be displayed in landscape mode (width > height) on the
+    laptop screen.
+
+    The camera is typically mounted upside-down to compensate the lens optical
+    inversion effect. In this case the value of the
+    V4L2_CID_CAMERA_SENSOR_ROTATION control is 0, no rotation is required to
+    display images correctly to the user.
+
+    If the camera sensor is not mounted upside-down it is required to compensate
+    the lens optical inversion effect and the value of the
+    V4L2_CID_CAMERA_SENSOR_ROTATION control is 180 degrees, as images will
+    result rotated when captured to memory. ::
+
+                 +--------------------------------------+
+                 !                                      !
+                 !                                      !
+                 !                                      !
+                 !              __/(_____/|             !
+                 !            >.___  ____ (             !
+                 !                 \(    \|             !
+                 !                                      !
+                 !                                      !
+                 !                                      !
+                 +--------------------------------------+
+
+    A software rotation correction of 180 degrees has to be applied to correctly
+    display the image on the user screen. ::
+
+                 +--------------------------------------+
+                 !                                      !
+                 !                                      !
+                 !                                      !
+                 !             |\____)\___              !
+                 !             ) _____  __`<            !
+                 !             |/     )/                !
+                 !                                      !
+                 !                                      !
+                 !                                      !
+                 +--------------------------------------+
+
+    Example two - Phone camera
+
+    It is more handy to go and swim with sharks with only your mobile phone
+    with you and take pictures with the camera that is installed on the back
+    side of the device, facing away from the user. The captured images are meant
+    to be displayed in portrait mode (height > width) to match the device screen
+    orientation and the device usage orientation used when taking the picture.
+
+    The camera sensor is typically mounted with its pixel array longer side
+    aligned to the device longer side, upside-down mounted to compensate for
+    the lens optical inversion effect.
+
+    The images once captured to memory will be rotated and the value of the
+    V4L2_CID_CAMERA_SENSOR_ROTATION will report a 90 degree rotation. ::
+
+
+                 +-------------------------------------+
+                 |                 _ _                 |
+                 |                \   /                |
+                 |                 | |                 |
+                 |                 | |                 |
+                 |                 |  >                |
+                 |                <  |                 |
+                 |                 | |                 |
+                 |                   .                 |
+                 |                  V                  |
+                 +-------------------------------------+
+
+    A correction of 90 degrees in counter-clockwise direction has to be
+    applied to correctly display the image in portrait mode on the device
+    screen. ::
+
+                          +--------------------+
+                          |                    |
+                          |                    |
+                          |                    |
+                          |                    |
+                          |                    |
+                          |                    |
+                          |   |\____)\___      |
+                          |   ) _____  __`<    |
+                          |   |/     )/        |
+                          |                    |
+                          |                    |
+                          |                    |
+                          |                    |
+                          |                    |
+                          +--------------------+
+
+
 .. [#f1]
    This control may be changed to a menu control in the future, if more
    options are required.
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v7 05/11] media: v4l2-ctrls: Add camera location and rotation
  2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
                   ` (3 preceding siblings ...)
  2020-03-18 20:50 ` [PATCH v7 04/11] media: v4l2-ctrl: Document V4L2_CID_CAMERA_SENSOR_ROTATION Jacopo Mondi
@ 2020-03-18 20:50 ` Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 06/11] media: v4l2-fwnode: Add helper to parse device properties Jacopo Mondi
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel

Add support for the newly defined V4L2_CID_CAMERA_SENSOR_LOCATION
and V4L2_CID_CAMERA_SENSOR_ROTATION read-only controls used to report
the camera device mounting position and orientation respectively.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 drivers/media/v4l2-core/v4l2-ctrls.c | 4 ++++
 include/uapi/linux/v4l2-controls.h   | 7 +++++++
 2 files changed, 11 insertions(+)

diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index 2928c5e0a73d..e0aa24e8ad84 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -1015,6 +1015,8 @@ const char *v4l2_ctrl_get_name(u32 id)
 	case V4L2_CID_PAN_SPEED:		return "Pan, Speed";
 	case V4L2_CID_TILT_SPEED:		return "Tilt, Speed";
 	case V4L2_CID_UNIT_CELL_SIZE:		return "Unit Cell Size";
+	case V4L2_CID_CAMERA_SENSOR_LOCATION:	return "Camera Sensor Location";
+	case V4L2_CID_CAMERA_SENSOR_ROTATION:	return "Camera Sensor Rotation";
 
 	/* FM Radio Modulator controls */
 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
@@ -1341,6 +1343,8 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
 		break;
 	case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
 	case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:
+	case V4L2_CID_CAMERA_SENSOR_LOCATION:
+	case V4L2_CID_CAMERA_SENSOR_ROTATION:
 		*type = V4L2_CTRL_TYPE_INTEGER;
 		*flags |= V4L2_CTRL_FLAG_READ_ONLY;
 		break;
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index 5a7bedee2b0e..2517d2f63d2f 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -912,6 +912,13 @@ enum v4l2_auto_focus_range {
 #define V4L2_CID_PAN_SPEED			(V4L2_CID_CAMERA_CLASS_BASE+32)
 #define V4L2_CID_TILT_SPEED			(V4L2_CID_CAMERA_CLASS_BASE+33)
 
+#define V4L2_CID_CAMERA_SENSOR_LOCATION		(V4L2_CID_CAMERA_CLASS_BASE+34)
+#define V4L2_LOCATION_FRONT			0
+#define V4L2_LOCATION_BACK			1
+#define V4L2_LOCATION_EXTERNAL			2
+
+#define V4L2_CID_CAMERA_SENSOR_ROTATION		(V4L2_CID_CAMERA_CLASS_BASE+35)
+
 /* FM Modulator class control IDs */
 
 #define V4L2_CID_FM_TX_CLASS_BASE		(V4L2_CTRL_CLASS_FM_TX | 0x900)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v7 06/11] media: v4l2-fwnode: Add helper to parse device properties
  2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
                   ` (4 preceding siblings ...)
  2020-03-18 20:50 ` [PATCH v7 05/11] media: v4l2-ctrls: Add camera location and rotation Jacopo Mondi
@ 2020-03-18 20:50 ` Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 07/11] include: v4l2-ctrl: Sort forward declarations Jacopo Mondi
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel

Add an helper function to parse common device properties in the same
way as v4l2_fwnode_endpoint_parse() parses common endpoint properties.

Parse the 'rotation' and 'location' properties from the firmware
interface.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 drivers/media/v4l2-core/v4l2-fwnode.c | 42 ++++++++++++++++++++++++
 include/media/v4l2-fwnode.h           | 47 +++++++++++++++++++++++++++
 2 files changed, 89 insertions(+)

diff --git a/drivers/media/v4l2-core/v4l2-fwnode.c b/drivers/media/v4l2-core/v4l2-fwnode.c
index 6ece4320e1d2..24d3ef527e8e 100644
--- a/drivers/media/v4l2-core/v4l2-fwnode.c
+++ b/drivers/media/v4l2-core/v4l2-fwnode.c
@@ -596,6 +596,48 @@ void v4l2_fwnode_put_link(struct v4l2_fwnode_link *link)
 }
 EXPORT_SYMBOL_GPL(v4l2_fwnode_put_link);
 
+int v4l2_fwnode_device_parse(struct device *dev,
+			     struct v4l2_fwnode_device_properties *props)
+{
+	struct fwnode_handle *fwnode = dev_fwnode(dev);
+	u32 val;
+	int ret;
+
+	memset(props, 0, sizeof(*props));
+
+	props->location = V4L2_FWNODE_PROPERTY_UNSET;
+	ret = fwnode_property_read_u32(fwnode, "location", &val);
+	if (!ret) {
+		switch (val) {
+		case V4L2_FWNODE_LOCATION_FRONT:
+		case V4L2_FWNODE_LOCATION_BACK:
+		case V4L2_FWNODE_LOCATION_EXTERNAL:
+			break;
+		default:
+			dev_warn(dev, "Unsupported device location: %u\n", val);
+			return -EINVAL;
+		}
+
+		props->location = val;
+		dev_dbg(dev, "device location: %u\n", val);
+	}
+
+	props->rotation = V4L2_FWNODE_PROPERTY_UNSET;
+	ret = fwnode_property_read_u32(fwnode, "rotation", &val);
+	if (!ret) {
+		if (val >= 360 || val % 90) {
+			dev_warn(dev, "Unsupported device rotation: %u\n", val);
+			return -EINVAL;
+		}
+
+		props->rotation = val;
+		dev_dbg(dev, "device rotation: %u\n", val);
+	}
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(v4l2_fwnode_device_parse);
+
 static int
 v4l2_async_notifier_fwnode_parse_endpoint(struct device *dev,
 					  struct v4l2_async_notifier *notifier,
diff --git a/include/media/v4l2-fwnode.h b/include/media/v4l2-fwnode.h
index f6a7bcd13197..3443dd45cd5a 100644
--- a/include/media/v4l2-fwnode.h
+++ b/include/media/v4l2-fwnode.h
@@ -109,6 +109,36 @@ struct v4l2_fwnode_endpoint {
 	unsigned int nr_of_link_frequencies;
 };
 
+/**
+ * v4l2_fwnode_location - identify a non initialized property.
+ *
+ * All properties in &struct v4l2_fwnode_device_properties are initialized
+ * to this value.
+ */
+#define V4L2_FWNODE_PROPERTY_UNSET   (-1U)
+
+/**
+ * enum v4l2_fwnode_location - possible device locations
+ * @V4L2_FWNODE_LOCATION_FRONT: device installed on the front side
+ * @V4L2_FWNODE_LOCATION_BACK: device installed on the back side
+ * @V4L2_FWNODE_LOCATION_EXTERNAL: device externally located
+ */
+enum v4l2_fwnode_location {
+	V4L2_FWNODE_LOCATION_FRONT,
+	V4L2_FWNODE_LOCATION_BACK,
+	V4L2_FWNODE_LOCATION_EXTERNAL
+};
+
+/**
+ * struct v4l2_fwnode_device_properties - fwnode device properties
+ * @location: device location. See &enum v4l2_fwnode_location
+ * @rotation: device rotation
+ */
+struct v4l2_fwnode_device_properties {
+	enum v4l2_fwnode_location location;
+	unsigned int rotation;
+};
+
 /**
  * struct v4l2_fwnode_link - a link between two endpoints
  * @local_node: pointer to device_node of this endpoint
@@ -233,6 +263,23 @@ int v4l2_fwnode_parse_link(struct fwnode_handle *fwnode,
  */
 void v4l2_fwnode_put_link(struct v4l2_fwnode_link *link);
 
+/**
+ * v4l2_fwnode_device_parse() - parse fwnode device properties
+ * @dev: pointer to &struct device
+ * @props: pointer to &struct v4l2_fwnode_device_properties where to store the
+ *	   parsed properties values
+ *
+ * This function parses and validates the V4L2 fwnode device properties from the
+ * firmware interface, and fills the @struct v4l2_fwnode_device_properties
+ * provided by the caller.
+ *
+ * Return:
+ *	% 0 on success
+ *	%-EINVAL if a parsed property value is not valid
+ */
+int v4l2_fwnode_device_parse(struct device *dev,
+			     struct v4l2_fwnode_device_properties *props);
+
 /**
  * typedef parse_endpoint_func - Driver's callback function to be called on
  *	each V4L2 fwnode endpoint.
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v7 07/11] include: v4l2-ctrl: Sort forward declarations
  2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
                   ` (5 preceding siblings ...)
  2020-03-18 20:50 ` [PATCH v7 06/11] media: v4l2-fwnode: Add helper to parse device properties Jacopo Mondi
@ 2020-03-18 20:50 ` Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 08/11] media: v4l2-ctrls: Sort includes alphabetically Jacopo Mondi
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel

Before adding a new forward declaration to the v4l2-ctrls.h header file,
sort the existing ones alphabetically.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 include/media/v4l2-ctrls.h | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
index 7db9e719a583..cf59abafb0d9 100644
--- a/include/media/v4l2-ctrls.h
+++ b/include/media/v4l2-ctrls.h
@@ -25,14 +25,14 @@
 
 /* forward references */
 struct file;
+struct poll_table_struct;
+struct v4l2_ctrl;
 struct v4l2_ctrl_handler;
 struct v4l2_ctrl_helper;
-struct v4l2_ctrl;
-struct video_device;
+struct v4l2_fh;
 struct v4l2_subdev;
 struct v4l2_subscribed_event;
-struct v4l2_fh;
-struct poll_table_struct;
+struct video_device;
 
 /**
  * union v4l2_ctrl_ptr - A pointer to a control value.
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v7 08/11] media: v4l2-ctrls: Sort includes alphabetically
  2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
                   ` (6 preceding siblings ...)
  2020-03-18 20:50 ` [PATCH v7 07/11] include: v4l2-ctrl: Sort forward declarations Jacopo Mondi
@ 2020-03-18 20:50 ` Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 09/11] media: v4l2-ctrls: Add helper to register properties Jacopo Mondi
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel

Before adding a new include directive, sort the existing ones in
alphabetical order.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 drivers/media/v4l2-core/v4l2-ctrls.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index e0aa24e8ad84..4951a373015b 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -9,14 +9,14 @@
 #define pr_fmt(fmt) "v4l2-ctrls: " fmt
 
 #include <linux/ctype.h>
+#include <linux/export.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
-#include <linux/export.h>
-#include <media/v4l2-ioctl.h>
-#include <media/v4l2-device.h>
 #include <media/v4l2-ctrls.h>
-#include <media/v4l2-event.h>
 #include <media/v4l2-dev.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-ioctl.h>
 
 #define dprintk(vdev, fmt, arg...) do {					\
 	if (!WARN_ON(!(vdev)) && ((vdev)->dev_debug & V4L2_DEV_DEBUG_CTRL)) \
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v7 09/11] media: v4l2-ctrls: Add helper to register properties
  2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
                   ` (7 preceding siblings ...)
  2020-03-18 20:50 ` [PATCH v7 08/11] media: v4l2-ctrls: Sort includes alphabetically Jacopo Mondi
@ 2020-03-18 20:50 ` Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 10/11] media: i2c: ov5670: Parse and " Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 11/11] media: i2c: ov13858: " Jacopo Mondi
  10 siblings, 0 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel

Add an helper function to v4l2-ctrls to register controls associated
with a device property.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 drivers/media/v4l2-core/v4l2-ctrls.c | 40 ++++++++++++++++++++++++++++
 include/media/v4l2-ctrls.h           | 26 ++++++++++++++++++
 2 files changed, 66 insertions(+)

diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index 4951a373015b..57433baa7b2c 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -16,6 +16,7 @@
 #include <media/v4l2-dev.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-event.h>
+#include <media/v4l2-fwnode.h>
 #include <media/v4l2-ioctl.h>
 
 #define dprintk(vdev, fmt, arg...) do {					\
@@ -4594,3 +4595,42 @@ __poll_t v4l2_ctrl_poll(struct file *file, struct poll_table_struct *wait)
 	return 0;
 }
 EXPORT_SYMBOL(v4l2_ctrl_poll);
+
+int v4l2_ctrl_new_fwnode_properties(struct v4l2_ctrl_handler *hdl,
+				    const struct v4l2_ctrl_ops *ctrl_ops,
+				    const struct v4l2_fwnode_device_properties *p)
+{
+	if (p->location != V4L2_FWNODE_PROPERTY_UNSET) {
+		u32 location_ctrl;
+
+		switch (p->location) {
+		case V4L2_FWNODE_LOCATION_FRONT:
+			location_ctrl = V4L2_LOCATION_FRONT;
+			break;
+		case V4L2_FWNODE_LOCATION_BACK:
+			location_ctrl = V4L2_LOCATION_BACK;
+			break;
+		case V4L2_FWNODE_LOCATION_EXTERNAL:
+			location_ctrl = V4L2_LOCATION_EXTERNAL;
+			break;
+		default:
+			return -EINVAL;
+		}
+		if (!v4l2_ctrl_new_std(hdl, ctrl_ops,
+				       V4L2_CID_CAMERA_SENSOR_LOCATION,
+				       location_ctrl, location_ctrl, 1,
+				       location_ctrl))
+			return hdl->error;
+	}
+
+	if (p->rotation != V4L2_FWNODE_PROPERTY_UNSET) {
+		if (!v4l2_ctrl_new_std(hdl, ctrl_ops,
+				       V4L2_CID_CAMERA_SENSOR_ROTATION,
+				       p->rotation, p->rotation, 1,
+				       p->rotation))
+			return hdl->error;
+	}
+
+	return hdl->error;
+}
+EXPORT_SYMBOL(v4l2_ctrl_new_fwnode_properties);
diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
index cf59abafb0d9..409c800ab1f5 100644
--- a/include/media/v4l2-ctrls.h
+++ b/include/media/v4l2-ctrls.h
@@ -30,6 +30,7 @@ struct v4l2_ctrl;
 struct v4l2_ctrl_handler;
 struct v4l2_ctrl_helper;
 struct v4l2_fh;
+struct v4l2_fwnode_device_properties;
 struct v4l2_subdev;
 struct v4l2_subscribed_event;
 struct video_device;
@@ -1417,4 +1418,29 @@ int v4l2_ctrl_subdev_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
  */
 int v4l2_ctrl_subdev_log_status(struct v4l2_subdev *sd);
 
+/**
+ * v4l2_ctrl_new_fwnode_properties() - Register controls for the device
+ *				       properties
+ *
+ * @hdl: pointer to &struct v4l2_ctrl_handler to register controls on
+ * @ctrl_ops: pointer to &struct v4l2_ctrl_ops to register controls with
+ * @p: pointer to &struct v4l2_fwnode_device_properties
+ *
+ * This function registers controls associated to device properties, using the
+ * property values contained in @p parameter, if the property has been set to
+ * a value.
+ *
+ * Currently the following v4l2 controls are parsed and registered:
+ * - V4L2_CID_CAMERA_SENSOR_LOCATION;
+ * - V4L2_CID_CAMERA_SENSOR_ROTATION;
+ *
+ * Controls already registered by the caller with the @hdl control handler are
+ * not overwritten. Callers should register the controls they want to handle
+ * themselves before calling this function.
+ *
+ * Return: 0 on success, a negative error code on failure.
+ */
+int v4l2_ctrl_new_fwnode_properties(struct v4l2_ctrl_handler *hdl,
+				    const struct v4l2_ctrl_ops *ctrl_ops,
+				    const struct v4l2_fwnode_device_properties *p);
 #endif
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v7 10/11] media: i2c: ov5670: Parse and register properties
  2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
                   ` (8 preceding siblings ...)
  2020-03-18 20:50 ` [PATCH v7 09/11] media: v4l2-ctrls: Add helper to register properties Jacopo Mondi
@ 2020-03-18 20:50 ` Jacopo Mondi
  2020-03-18 20:50 ` [PATCH v7 11/11] media: i2c: ov13858: " Jacopo Mondi
  10 siblings, 0 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel

Parse device properties and register controls for them using the newly
introduced helpers.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 drivers/media/i2c/ov5670.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/media/i2c/ov5670.c b/drivers/media/i2c/ov5670.c
index 041fcbb4eebd..f118d44b0889 100644
--- a/drivers/media/i2c/ov5670.c
+++ b/drivers/media/i2c/ov5670.c
@@ -7,6 +7,7 @@
 #include <linux/pm_runtime.h>
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
+#include <media/v4l2-fwnode.h>
 
 #define OV5670_REG_CHIP_ID		0x300a
 #define OV5670_CHIP_ID			0x005670
@@ -2059,6 +2060,8 @@ static const struct v4l2_ctrl_ops ov5670_ctrl_ops = {
 /* Initialize control handlers */
 static int ov5670_init_controls(struct ov5670 *ov5670)
 {
+	struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
+	struct v4l2_fwnode_device_properties props;
 	struct v4l2_ctrl_handler *ctrl_hdlr;
 	s64 vblank_max;
 	s64 vblank_def;
@@ -2129,6 +2132,15 @@ static int ov5670_init_controls(struct ov5670 *ov5670)
 		goto error;
 	}
 
+	ret = v4l2_fwnode_device_parse(&client->dev, &props);
+	if (ret)
+		return ret;
+
+	ret = v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &ov5670_ctrl_ops,
+					      &props);
+	if (ret)
+		return ret;
+
 	ov5670->sd.ctrl_handler = ctrl_hdlr;
 
 	return 0;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v7 11/11] media: i2c: ov13858: Parse and register properties
  2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
                   ` (9 preceding siblings ...)
  2020-03-18 20:50 ` [PATCH v7 10/11] media: i2c: ov5670: Parse and " Jacopo Mondi
@ 2020-03-18 20:50 ` Jacopo Mondi
  10 siblings, 0 replies; 16+ messages in thread
From: Jacopo Mondi @ 2020-03-18 20:50 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: Jacopo Mondi, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel

Parse device properties and register controls for them using the newly
introduced helpers.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 drivers/media/i2c/ov13858.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/media/i2c/ov13858.c b/drivers/media/i2c/ov13858.c
index aac6f77afa0f..2ef5fb5cf519 100644
--- a/drivers/media/i2c/ov13858.c
+++ b/drivers/media/i2c/ov13858.c
@@ -7,6 +7,7 @@
 #include <linux/pm_runtime.h>
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
+#include <media/v4l2-fwnode.h>
 
 #define OV13858_REG_VALUE_08BIT		1
 #define OV13858_REG_VALUE_16BIT		2
@@ -1589,6 +1590,7 @@ static const struct v4l2_subdev_internal_ops ov13858_internal_ops = {
 static int ov13858_init_controls(struct ov13858 *ov13858)
 {
 	struct i2c_client *client = v4l2_get_subdevdata(&ov13858->sd);
+	struct v4l2_fwnode_device_properties props;
 	struct v4l2_ctrl_handler *ctrl_hdlr;
 	s64 exposure_max;
 	s64 vblank_def;
@@ -1666,6 +1668,15 @@ static int ov13858_init_controls(struct ov13858 *ov13858)
 		goto error;
 	}
 
+	ret = v4l2_fwnode_device_parse(&client->dev, &props);
+	if (ret)
+		return ret;
+
+	ret = v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &ov13858_ctrl_ops,
+					      &props);
+	if (ret)
+		return ret;
+
 	ov13858->sd.ctrl_handler = ctrl_hdlr;
 
 	return 0;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH v7 03/11] dt-bindings: video-interface: Replace 'rotation' description
  2020-03-18 20:50 ` [PATCH v7 03/11] dt-bindings: video-interface: Replace 'rotation' description Jacopo Mondi
@ 2020-03-20  1:03   ` Rob Herring
  2020-03-31 10:21   ` Hans Verkuil
  2020-06-08 10:09   ` Sakari Ailus
  2 siblings, 0 replies; 16+ messages in thread
From: Rob Herring @ 2020-03-20  1:03 UTC (permalink / raw)
  To: Jacopo Mondi
  Cc: Mauro Carvalho Chehab, Hans Verkuil, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel, Jacopo Mondi,
	open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel, robh, devicetree, Niklas Soderlund

On Wed, 18 Mar 2020 21:50:26 +0100, Jacopo Mondi wrote:
> Replace the 'rotation' property description by providing a definition
> relative to the camera sensor pixel array coordinate system and the
> captured scene.
> 
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> Co-developed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Co-developed-by: Niklas Soderlund <niklas.soderlund@ragnatech.se>
> 
> ---
>  .../bindings/media/video-interfaces.txt       | 359 +++++++++++++++++-
>  1 file changed, 356 insertions(+), 3 deletions(-)
> 

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v7 03/11] dt-bindings: video-interface: Replace 'rotation' description
  2020-03-18 20:50 ` [PATCH v7 03/11] dt-bindings: video-interface: Replace 'rotation' description Jacopo Mondi
  2020-03-20  1:03   ` Rob Herring
@ 2020-03-31 10:21   ` Hans Verkuil
  2020-06-08 10:09   ` Sakari Ailus
  2 siblings, 0 replies; 16+ messages in thread
From: Hans Verkuil @ 2020-03-31 10:21 UTC (permalink / raw)
  To: Jacopo Mondi, Mauro Carvalho Chehab, Sakari Ailus,
	Laurent Pinchart, tfiga, pavel
  Cc: open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel, robh, devicetree, Niklas Soderlund

On 3/18/20 9:50 PM, Jacopo Mondi wrote:
> Replace the 'rotation' property description by providing a definition
> relative to the camera sensor pixel array coordinate system and the
> captured scene.
> 
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> Co-developed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Co-developed-by: Niklas Soderlund <niklas.soderlund@ragnatech.se>
> 
> ---
>  .../bindings/media/video-interfaces.txt       | 359 +++++++++++++++++-
>  1 file changed, 356 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/media/video-interfaces.txt b/Documentation/devicetree/bindings/media/video-interfaces.txt
> index 1211bdf80722..36e61d599f34 100644
> --- a/Documentation/devicetree/bindings/media/video-interfaces.txt
> +++ b/Documentation/devicetree/bindings/media/video-interfaces.txt
> @@ -85,9 +85,362 @@ Optional properties
> 
>  - lens-focus: A phandle to the node of the focus lens controller.
> 
> -- rotation: The device, typically an image sensor, is not mounted upright,
> -  but a number of degrees counter clockwise. Typical values are 0 and 180
> -  (upside down).
> +- rotation: The camera rotation is expressed as the angular difference in
> +  degrees between two reference systems, one relative to the camera module, and
> +  one defined on the external world scene to be captured when projected on the
> +  image sensor pixel array.
> +
> +  A camera sensor has a 2-dimensional reference system 'Rc' defined by
> +  its pixel array read-out order. The origin is set to the first pixel
> +  being read out, the X-axis points along the column read-out direction
> +  towards the last columns, and the Y-axis along the row read-out
> +  direction towards the last row.
> +
> +  A typical example for a sensor with a 2592x1944 pixel array matrix
> +  observed from the front is

is -> is:

> +
> +              2591       X-axis          0
> +                <------------------------+ 0
> +                .......... ... ..........!
> +                .......... ... ..........! Y-axis
> +                           ...           !
> +                .......... ... ..........!
> +                .......... ... ..........! 1943
> +                                         V
> +
> +  The external world scene reference system 'Rs' is a 2-dimensional
> +  reference system on the focal plane of the camera module. The origin is
> +  placed on the top-left corner of the visible scene, the X-axis points
> +  towards the right, and the Y-axis points towards the bottom of the
> +  scene. The top, bottom, left and right directions are intentionally not
> +  defined and depend on the environment in which the camera is used.
> +
> +  A typical example of a (very common) picture of a shark swimming from
> +  left to right, as seen from the camera, is

is -> is:

> +
> +               0               X-axis
> +             0 +------------------------------------->
> +               !
> +               !
> +               !
> +               !           |\____)\___
> +               !           ) _____  __`<
> +               !           |/     )/
> +               !
> +               !
> +               !
> +               V
> +             Y-axis
> +
> +  With the reference system 'Rs' placed on the camera focal plane.

I think here 'With' can be 'with' (since you continue the previous sentence)
and 'plane.' should be 'plane:' since it refers to the picture below that explains
the focal plane.

> +
> +                                  ¸.·˙!
> +                              ¸.·˙    !
> +                  _       ¸.·˙        !
> +               +-/ \-+¸.·˙            !
> +               | (o) |                ! Camera focal plane
> +               +-----+˙·.¸            !
> +                          ˙·.¸        !
> +                              ˙·.¸    !
> +                                  ˙·.¸!
> +
> +  When projected on the sensor's pixel array, the image and the associated
> +  reference system 'Rs' are typically (but not always) inverted, due to
> +  the camera module's lens optical inversion effect.
> +
> +  Assuming the above represented scene of the swimming shark, the lens
> +  inversion projects the scene and its reference system onto the sensor
> +  pixel array, seen from the front of the camera sensor, as follow

follow -> follows:

> +
> +            Y-axis
> +               ^
> +               !
> +               !
> +               !
> +               !            |\_____)\__
> +               !            ) ____  ___.<
> +               !            |/    )/
> +               !
> +               !
> +               !
> +             0 +------------------------------------->
> +               0               X-axis
> +
> +  Note the shark being upside-down.
> +
> +  The resulting projected reference system is named 'Rp'.
> +
> +  The camera rotation property is then defined as the angular difference
> +  in the counter-clockwise direction between the camera reference system
> +  'Rc' and the projected scene reference system 'Rp'. It is expressed in
> +  degrees as a number in the range [0, 360[.
> +
> +  Examples
> +
> +  0 degrees camera rotation

rotation -> rotation:

> +
> +
> +                    Y-Rp
> +                     ^
> +              Y-Rc   !
> +               ^     !
> +               !     !
> +               !     !
> +               !     !
> +               !     !
> +               !     !
> +               !     !
> +               !     !
> +               !   0 +------------------------------------->
> +               !     0               X-Rp
> +             0 +------------------------------------->
> +               0               X-Rc
> +
> +
> +                                X-Rc                0
> +               <------------------------------------+ 0
> +                           X-Rp                 0   !
> +           <------------------------------------+ 0 !
> +                                                !   !
> +                                                !   !
> +                                                !   !
> +                                                !   !
> +                                                !   !
> +                                                !   !
> +                                                !   !
> +                                                !   V
> +                                                !  Y-Rc
> +                                                V
> +                                               Y-Rp
> +
> +  90 degrees camera rotation

Ditto here and for the 180 and 270 examples below.

> +
> +               0        Y-Rc
> +             0 +-------------------->
> +               !   Y-Rp
> +               !    ^
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !  0 +------------------------------------->
> +               !    0              X-Rp
> +               !
> +               !
> +               !
> +               !
> +               V
> +              X-Rc
> +
> +  180 degrees camera rotation
> +
> +                                            0
> +       <------------------------------------+ 0
> +                        X-Rc                !
> +              Y-Rp                          !
> +               ^                            !
> +               !                            !
> +               !                            !
> +               !                            !
> +               !                            !
> +               !                            !
> +               !                            !
> +               !                            V
> +               !                           Y-Rc
> +             0 +------------------------------------->
> +               0              X-Rp
> +
> +  270 degrees camera rotation
> +
> +               0        Y-Rc
> +             0 +-------------------->
> +               !                                        0
> +               !    <-----------------------------------+ 0
> +               !                    X-Rp                !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        V
> +               !                                       Y-Rp
> +               !
> +               !
> +               !
> +               !
> +               V
> +              X-Rc
> +
> +
> +  Example one - Webcam
> +
> +  A camera module installed on the user facing part of a laptop screen
> +  casing used for video calls. The captured images are meant to be
> +  displayed in landscape mode (width > height) on the laptop screen.
> +
> +  The camera is typically mounted upside-down to compensate the lens
> +  optical inversion effect.

effect. -> effect:

The : links the sentence with the following picture. I think this should be
done in the remainder of this section, so I won't repeat myself.

> +
> +                    Y-Rp
> +              Y-Rc   ^
> +               ^     !
> +               !     !
> +               !     !       |\_____)\__
> +               !     !       ) ____  ___.<
> +               !     !       |/    )/
> +               !     !
> +               !     !
> +               !     !
> +               !   0 +------------------------------------->
> +               !     0           X-Rp
> +             0 +------------------------------------->
> +               0            X-Rc
> +
> +  The two reference systems are aligned, the resulting camera rotation is
> +  0 degrees, no rotation correction needs to be applied to the resulting
> +  image once captured to memory buffers to correctly display it to users.
> +
> +               +--------------------------------------+
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               !             |\____)\___              !
> +               !             ) _____  __`<            !
> +               !             |/     )/                !
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               +--------------------------------------+
> +
> +  If the camera sensor is not mounted upside-down to compensate for the
> +  lens optical inversion, the two reference systems will not be aligned,
> +  with 'Rp' being rotated 180 degrees relatively to 'Rc'.
> +
> +
> +                        X-Rc                0
> +       <------------------------------------+ 0
> +                                            !
> +              Y-Rp                          !
> +               ^                            !
> +               !                            !
> +               !       |\_____)\__          !
> +               !       ) ____  ___.<        !
> +               !       |/    )/             !
> +               !                            !
> +               !                            !
> +               !                            V
> +               !                           Y-Rc
> +             0 +------------------------------------->
> +               0            X-Rp
> +
> +  The image once captured to memory will then be rotated by 180 degrees
> +
> +               +--------------------------------------+
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               !              __/(_____/|             !
> +               !            >.___  ____ (             !
> +               !                 \(    \|             !
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               +--------------------------------------+
> +
> +  A software rotation correction of 180 degrees should be applied to
> +  correctly display the image.
> +
> +               +--------------------------------------+
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               !             |\____)\___              !
> +               !             ) _____  __`<            !
> +               !             |/     )/                !
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               +--------------------------------------+
> +
> +  Example two - Phone camera
> +
> +  A camera installed on the back side of a mobile device facing away from
> +  the user. The captured images are meant to be displayed in portrait mode
> +  (height > width) to match the device screen orientation and the device
> +  usage orientation used when taking the picture.
> +
> +  The camera sensor is typically mounted with its pixel array longer side
> +  aligned to the device longer side, upside-down mounted to compensate for
> +  the lens optical inversion effect.
> +
> +               0        Y-Rc
> +             0 +-------------------->
> +               !   Y-Rp
> +               !    ^
> +               !    !
> +               !    !
> +               !    !
> +               !    !            |\_____)\__
> +               !    !            ) ____  ___.<
> +               !    !            |/    )/
> +               !    !
> +               !    !
> +               !    !
> +               !  0 +------------------------------------->
> +               !    0                X-Rp
> +               !
> +               !
> +               !
> +               !
> +               V
> +              X-Rc
> +
> +  The two reference systems are not aligned and the 'Rp' reference
> +  system is rotated by 90 degrees in the counter-clockwise direction
> +  relatively to the 'Rc' reference system.
> +
> +  The image once captured to memory will be rotated.
> +
> +               +-------------------------------------+
> +               |                 _ _                 |
> +               |                \   /                |
> +               |                 | |                 |
> +               |                 | |                 |
> +               |                 |  >                |
> +               |                <  |                 |
> +               |                 | |                 |
> +               |                   .                 |
> +               |                  V                  |
> +               +-------------------------------------+
> +
> +  A correction of 90 degrees in counter-clockwise direction has to be
> +  applied to correctly display the image in portrait mode on the device
> +  screen.
> +
> +                        +--------------------+
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |   |\____)\___      |
> +                        |   ) _____  __`<    |
> +                        |   |/     )/        |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        +--------------------+
> 
>  - location: The mount location of a device (typically an image sensor or a flash
>    LED) expressed as a position relative to the usage orientation of the system
> --
> 2.25.1
> 

Regards,

	Hans

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v7 03/11] dt-bindings: video-interface: Replace 'rotation' description
  2020-03-18 20:50 ` [PATCH v7 03/11] dt-bindings: video-interface: Replace 'rotation' description Jacopo Mondi
  2020-03-20  1:03   ` Rob Herring
  2020-03-31 10:21   ` Hans Verkuil
@ 2020-06-08 10:09   ` Sakari Ailus
  2020-06-08 21:41     ` Laurent Pinchart
  2 siblings, 1 reply; 16+ messages in thread
From: Sakari Ailus @ 2020-06-08 10:09 UTC (permalink / raw)
  To: Jacopo Mondi
  Cc: Mauro Carvalho Chehab, Hans Verkuil, Laurent Pinchart, tfiga,
	pavel, open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel, robh, devicetree, Niklas Soderlund

Hi Jacopo,

Thank you for this great piece of ASCII art. Also my apologies for
reviewing this so late. The latest version is 11 but I believe the content
is the same on the commented matters.

On Wed, Mar 18, 2020 at 09:50:26PM +0100, Jacopo Mondi wrote:
> Replace the 'rotation' property description by providing a definition
> relative to the camera sensor pixel array coordinate system and the
> captured scene.
> 
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> Co-developed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Co-developed-by: Niklas Soderlund <niklas.soderlund@ragnatech.se>
> 
> ---
>  .../bindings/media/video-interfaces.txt       | 359 +++++++++++++++++-
>  1 file changed, 356 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/media/video-interfaces.txt b/Documentation/devicetree/bindings/media/video-interfaces.txt
> index 1211bdf80722..36e61d599f34 100644
> --- a/Documentation/devicetree/bindings/media/video-interfaces.txt
> +++ b/Documentation/devicetree/bindings/media/video-interfaces.txt
> @@ -85,9 +85,362 @@ Optional properties
> 
>  - lens-focus: A phandle to the node of the focus lens controller.
> 
> -- rotation: The device, typically an image sensor, is not mounted upright,
> -  but a number of degrees counter clockwise. Typical values are 0 and 180
> -  (upside down).
> +- rotation: The camera rotation is expressed as the angular difference in
> +  degrees between two reference systems, one relative to the camera module, and
> +  one defined on the external world scene to be captured when projected on the
> +  image sensor pixel array.
> +
> +  A camera sensor has a 2-dimensional reference system 'Rc' defined by
> +  its pixel array read-out order. The origin is set to the first pixel
> +  being read out, the X-axis points along the column read-out direction
> +  towards the last columns, and the Y-axis along the row read-out
> +  direction towards the last row.
> +
> +  A typical example for a sensor with a 2592x1944 pixel array matrix
> +  observed from the front is
> +
> +              2591       X-axis          0
> +                <------------------------+ 0
> +                .......... ... ..........!
> +                .......... ... ..........! Y-axis
> +                           ...           !
> +                .......... ... ..........!
> +                .......... ... ..........! 1943
> +                                         V
> +
> +  The external world scene reference system 'Rs' is a 2-dimensional
> +  reference system on the focal plane of the camera module. The origin is
> +  placed on the top-left corner of the visible scene, the X-axis points
> +  towards the right, and the Y-axis points towards the bottom of the
> +  scene. The top, bottom, left and right directions are intentionally not
> +  defined and depend on the environment in which the camera is used.
> +
> +  A typical example of a (very common) picture of a shark swimming from
> +  left to right, as seen from the camera, is

In the previous paragraph, it is stated that "top, bottom, left and right
directions are intentionally not defined". How about something like

	A typical example of a (very common) pictore of a shark swimming in
	the direction of X axis, as seen from the camera, is

> +
> +               0               X-axis
> +             0 +------------------------------------->
> +               !
> +               !
> +               !
> +               !           |\____)\___
> +               !           ) _____  __`<
> +               !           |/     )/
> +               !
> +               !
> +               !
> +               V
> +             Y-axis
> +
> +  With the reference system 'Rs' placed on the camera focal plane.
> +
> +                                  ¸.·˙!
> +                              ¸.·˙    !
> +                  _       ¸.·˙        !
> +               +-/ \-+¸.·˙            !
> +               | (o) |                ! Camera focal plane
> +               +-----+˙·.¸            !
> +                          ˙·.¸        !
> +                              ˙·.¸    !
> +                                  ˙·.¸!
> +
> +  When projected on the sensor's pixel array, the image and the associated
> +  reference system 'Rs' are typically (but not always) inverted, due to
> +  the camera module's lens optical inversion effect.
> +
> +  Assuming the above represented scene of the swimming shark, the lens
> +  inversion projects the scene and its reference system onto the sensor
> +  pixel array, seen from the front of the camera sensor, as follow
> +
> +            Y-axis
> +               ^
> +               !
> +               !
> +               !
> +               !            |\_____)\__
> +               !            ) ____  ___.<
> +               !            |/    )/
> +               !
> +               !
> +               !
> +             0 +------------------------------------->
> +               0               X-axis
> +
> +  Note the shark being upside-down.

As it's inverted, wouldn't the same happen on the X axis as well?

> +
> +  The resulting projected reference system is named 'Rp'.
> +
> +  The camera rotation property is then defined as the angular difference
> +  in the counter-clockwise direction between the camera reference system
> +  'Rc' and the projected scene reference system 'Rp'. It is expressed in
> +  degrees as a number in the range [0, 360[.
> +
> +  Examples
> +
> +  0 degrees camera rotation
> +
> +
> +                    Y-Rp
> +                     ^
> +              Y-Rc   !
> +               ^     !
> +               !     !
> +               !     !
> +               !     !
> +               !     !
> +               !     !
> +               !     !
> +               !     !
> +               !   0 +------------------------------------->
> +               !     0               X-Rp
> +             0 +------------------------------------->
> +               0               X-Rc
> +
> +
> +                                X-Rc                0
> +               <------------------------------------+ 0
> +                           X-Rp                 0   !
> +           <------------------------------------+ 0 !
> +                                                !   !
> +                                                !   !
> +                                                !   !
> +                                                !   !
> +                                                !   !
> +                                                !   !
> +                                                !   !
> +                                                !   V
> +                                                !  Y-Rc
> +                                                V
> +                                               Y-Rp
> +
> +  90 degrees camera rotation
> +
> +               0        Y-Rc
> +             0 +-------------------->
> +               !   Y-Rp
> +               !    ^
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !    !
> +               !  0 +------------------------------------->
> +               !    0              X-Rp
> +               !
> +               !
> +               !
> +               !
> +               V
> +              X-Rc
> +
> +  180 degrees camera rotation
> +
> +                                            0
> +       <------------------------------------+ 0
> +                        X-Rc                !
> +              Y-Rp                          !
> +               ^                            !
> +               !                            !
> +               !                            !
> +               !                            !
> +               !                            !
> +               !                            !
> +               !                            !
> +               !                            V
> +               !                           Y-Rc
> +             0 +------------------------------------->
> +               0              X-Rp
> +
> +  270 degrees camera rotation
> +
> +               0        Y-Rc
> +             0 +-------------------->
> +               !                                        0
> +               !    <-----------------------------------+ 0
> +               !                    X-Rp                !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        !
> +               !                                        V
> +               !                                       Y-Rp
> +               !
> +               !
> +               !
> +               !
> +               V
> +              X-Rc
> +
> +
> +  Example one - Webcam
> +
> +  A camera module installed on the user facing part of a laptop screen
> +  casing used for video calls. The captured images are meant to be
> +  displayed in landscape mode (width > height) on the laptop screen.
> +
> +  The camera is typically mounted upside-down to compensate the lens
> +  optical inversion effect.
> +
> +                    Y-Rp
> +              Y-Rc   ^
> +               ^     !
> +               !     !
> +               !     !       |\_____)\__
> +               !     !       ) ____  ___.<
> +               !     !       |/    )/
> +               !     !
> +               !     !
> +               !     !
> +               !   0 +------------------------------------->
> +               !     0           X-Rp
> +             0 +------------------------------------->
> +               0            X-Rc
> +
> +  The two reference systems are aligned, the resulting camera rotation is
> +  0 degrees, no rotation correction needs to be applied to the resulting
> +  image once captured to memory buffers to correctly display it to users.
> +
> +               +--------------------------------------+
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               !             |\____)\___              !
> +               !             ) _____  __`<            !
> +               !             |/     )/                !
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               +--------------------------------------+
> +
> +  If the camera sensor is not mounted upside-down to compensate for the
> +  lens optical inversion, the two reference systems will not be aligned,
> +  with 'Rp' being rotated 180 degrees relatively to 'Rc'.

I'd say the camera is mounted upright (rotation 0) if the image it produces
is read from the top-left corner towards the bottom. That is what the
current rotation property refers to, and I don't think we can change that
anymore.

Note that the lens is a part of the camera (or camera module). Could this
be defined for the camera module instead, to be compatible with the
existing definition and to take the entire lens system in the module into
account?

> +
> +
> +                        X-Rc                0
> +       <------------------------------------+ 0
> +                                            !
> +              Y-Rp                          !
> +               ^                            !
> +               !                            !
> +               !       |\_____)\__          !
> +               !       ) ____  ___.<        !
> +               !       |/    )/             !
> +               !                            !
> +               !                            !
> +               !                            V
> +               !                           Y-Rc
> +             0 +------------------------------------->
> +               0            X-Rp
> +
> +  The image once captured to memory will then be rotated by 180 degrees
> +
> +               +--------------------------------------+
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               !              __/(_____/|             !
> +               !            >.___  ____ (             !
> +               !                 \(    \|             !
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               +--------------------------------------+
> +
> +  A software rotation correction of 180 degrees should be applied to
> +  correctly display the image.
> +
> +               +--------------------------------------+
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               !             |\____)\___              !
> +               !             ) _____  __`<            !
> +               !             |/     )/                !
> +               !                                      !
> +               !                                      !
> +               !                                      !
> +               +--------------------------------------+
> +
> +  Example two - Phone camera
> +
> +  A camera installed on the back side of a mobile device facing away from
> +  the user. The captured images are meant to be displayed in portrait mode
> +  (height > width) to match the device screen orientation and the device
> +  usage orientation used when taking the picture.
> +
> +  The camera sensor is typically mounted with its pixel array longer side
> +  aligned to the device longer side, upside-down mounted to compensate for
> +  the lens optical inversion effect.
> +
> +               0        Y-Rc
> +             0 +-------------------->
> +               !   Y-Rp
> +               !    ^
> +               !    !
> +               !    !
> +               !    !
> +               !    !            |\_____)\__
> +               !    !            ) ____  ___.<
> +               !    !            |/    )/
> +               !    !
> +               !    !
> +               !    !
> +               !  0 +------------------------------------->
> +               !    0                X-Rp
> +               !
> +               !
> +               !
> +               !
> +               V
> +              X-Rc
> +
> +  The two reference systems are not aligned and the 'Rp' reference
> +  system is rotated by 90 degrees in the counter-clockwise direction
> +  relatively to the 'Rc' reference system.
> +
> +  The image once captured to memory will be rotated.
> +
> +               +-------------------------------------+
> +               |                 _ _                 |
> +               |                \   /                |
> +               |                 | |                 |
> +               |                 | |                 |
> +               |                 |  >                |
> +               |                <  |                 |
> +               |                 | |                 |
> +               |                   .                 |
> +               |                  V                  |
> +               +-------------------------------------+
> +
> +  A correction of 90 degrees in counter-clockwise direction has to be
> +  applied to correctly display the image in portrait mode on the device
> +  screen.
> +
> +                        +--------------------+
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |   |\____)\___      |
> +                        |   ) _____  __`<    |
> +                        |   |/     )/        |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        |                    |
> +                        +--------------------+
> 
>  - location: The mount location of a device (typically an image sensor or a flash
>    LED) expressed as a position relative to the usage orientation of the system

-- 
Kind regards,

Sakari Ailus

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v7 03/11] dt-bindings: video-interface: Replace 'rotation' description
  2020-06-08 10:09   ` Sakari Ailus
@ 2020-06-08 21:41     ` Laurent Pinchart
  0 siblings, 0 replies; 16+ messages in thread
From: Laurent Pinchart @ 2020-06-08 21:41 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: Jacopo Mondi, Mauro Carvalho Chehab, Hans Verkuil, tfiga, pavel,
	open list:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),
	libcamera-devel, robh, devicetree, Niklas Soderlund

Hi Sakari,

On Mon, Jun 08, 2020 at 01:09:03PM +0300, Sakari Ailus wrote:
> Hi Jacopo,
> 
> Thank you for this great piece of ASCII art. Also my apologies for
> reviewing this so late. The latest version is 11 but I believe the content
> is the same on the commented matters.
> 
> On Wed, Mar 18, 2020 at 09:50:26PM +0100, Jacopo Mondi wrote:
> > Replace the 'rotation' property description by providing a definition
> > relative to the camera sensor pixel array coordinate system and the
> > captured scene.
> > 
> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> > Co-developed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > Co-developed-by: Niklas Soderlund <niklas.soderlund@ragnatech.se>
> > 
> > ---
> >  .../bindings/media/video-interfaces.txt       | 359 +++++++++++++++++-
> >  1 file changed, 356 insertions(+), 3 deletions(-)
> > 
> > diff --git a/Documentation/devicetree/bindings/media/video-interfaces.txt b/Documentation/devicetree/bindings/media/video-interfaces.txt
> > index 1211bdf80722..36e61d599f34 100644
> > --- a/Documentation/devicetree/bindings/media/video-interfaces.txt
> > +++ b/Documentation/devicetree/bindings/media/video-interfaces.txt
> > @@ -85,9 +85,362 @@ Optional properties
> > 
> >  - lens-focus: A phandle to the node of the focus lens controller.
> > 
> > -- rotation: The device, typically an image sensor, is not mounted upright,
> > -  but a number of degrees counter clockwise. Typical values are 0 and 180
> > -  (upside down).
> > +- rotation: The camera rotation is expressed as the angular difference in
> > +  degrees between two reference systems, one relative to the camera module, and
> > +  one defined on the external world scene to be captured when projected on the
> > +  image sensor pixel array.
> > +
> > +  A camera sensor has a 2-dimensional reference system 'Rc' defined by
> > +  its pixel array read-out order. The origin is set to the first pixel
> > +  being read out, the X-axis points along the column read-out direction
> > +  towards the last columns, and the Y-axis along the row read-out
> > +  direction towards the last row.
> > +
> > +  A typical example for a sensor with a 2592x1944 pixel array matrix
> > +  observed from the front is
> > +
> > +              2591       X-axis          0
> > +                <------------------------+ 0
> > +                .......... ... ..........!
> > +                .......... ... ..........! Y-axis
> > +                           ...           !
> > +                .......... ... ..........!
> > +                .......... ... ..........! 1943
> > +                                         V
> > +
> > +  The external world scene reference system 'Rs' is a 2-dimensional
> > +  reference system on the focal plane of the camera module. The origin is
> > +  placed on the top-left corner of the visible scene, the X-axis points
> > +  towards the right, and the Y-axis points towards the bottom of the
> > +  scene. The top, bottom, left and right directions are intentionally not
> > +  defined and depend on the environment in which the camera is used.
> > +
> > +  A typical example of a (very common) picture of a shark swimming from
> > +  left to right, as seen from the camera, is
> 
> In the previous paragraph, it is stated that "top, bottom, left and right
> directions are intentionally not defined". How about something like
> 
> 	A typical example of a (very common) pictore of a shark swimming in
> 	the direction of X axis, as seen from the camera, is
> 
> > +
> > +               0               X-axis
> > +             0 +------------------------------------->
> > +               !
> > +               !
> > +               !
> > +               !           |\____)\___
> > +               !           ) _____  __`<
> > +               !           |/     )/
> > +               !
> > +               !
> > +               !
> > +               V
> > +             Y-axis
> > +
> > +  With the reference system 'Rs' placed on the camera focal plane.
> > +
> > +                                  ¸.·˙!
> > +                              ¸.·˙    !
> > +                  _       ¸.·˙        !
> > +               +-/ \-+¸.·˙            !
> > +               | (o) |                ! Camera focal plane
> > +               +-----+˙·.¸            !
> > +                          ˙·.¸        !
> > +                              ˙·.¸    !
> > +                                  ˙·.¸!
> > +
> > +  When projected on the sensor's pixel array, the image and the associated
> > +  reference system 'Rs' are typically (but not always) inverted, due to
> > +  the camera module's lens optical inversion effect.
> > +
> > +  Assuming the above represented scene of the swimming shark, the lens
> > +  inversion projects the scene and its reference system onto the sensor
> > +  pixel array, seen from the front of the camera sensor, as follow
> > +
> > +            Y-axis
> > +               ^
> > +               !
> > +               !
> > +               !
> > +               !            |\_____)\__
> > +               !            ) ____  ___.<
> > +               !            |/    )/
> > +               !
> > +               !
> > +               !
> > +             0 +------------------------------------->
> > +               0               X-axis
> > +
> > +  Note the shark being upside-down.
> 
> As it's inverted, wouldn't the same happen on the X axis as well?

There's a double inversion. The lens will invert the image along both
axes, but this picture shows the image as projected on the camera
sensor, while the previous image showed the scene when looking from the
camera sensor. As humans have a tendency to turn their head in the
horizontal plane and not the vertical plane when they want to look
behind them, switching from looking towards the scene to looking towards
the sensor inverts the X axis. The end result is that only the Y axis is
inverted.

> > +
> > +  The resulting projected reference system is named 'Rp'.
> > +
> > +  The camera rotation property is then defined as the angular difference
> > +  in the counter-clockwise direction between the camera reference system
> > +  'Rc' and the projected scene reference system 'Rp'. It is expressed in
> > +  degrees as a number in the range [0, 360[.
> > +
> > +  Examples
> > +
> > +  0 degrees camera rotation
> > +
> > +
> > +                    Y-Rp
> > +                     ^
> > +              Y-Rc   !
> > +               ^     !
> > +               !     !
> > +               !     !
> > +               !     !
> > +               !     !
> > +               !     !
> > +               !     !
> > +               !     !
> > +               !   0 +------------------------------------->
> > +               !     0               X-Rp
> > +             0 +------------------------------------->
> > +               0               X-Rc
> > +
> > +
> > +                                X-Rc                0
> > +               <------------------------------------+ 0
> > +                           X-Rp                 0   !
> > +           <------------------------------------+ 0 !
> > +                                                !   !
> > +                                                !   !
> > +                                                !   !
> > +                                                !   !
> > +                                                !   !
> > +                                                !   !
> > +                                                !   !
> > +                                                !   V
> > +                                                !  Y-Rc
> > +                                                V
> > +                                               Y-Rp
> > +
> > +  90 degrees camera rotation
> > +
> > +               0        Y-Rc
> > +             0 +-------------------->
> > +               !   Y-Rp
> > +               !    ^
> > +               !    !
> > +               !    !
> > +               !    !
> > +               !    !
> > +               !    !
> > +               !    !
> > +               !    !
> > +               !    !
> > +               !    !
> > +               !  0 +------------------------------------->
> > +               !    0              X-Rp
> > +               !
> > +               !
> > +               !
> > +               !
> > +               V
> > +              X-Rc
> > +
> > +  180 degrees camera rotation
> > +
> > +                                            0
> > +       <------------------------------------+ 0
> > +                        X-Rc                !
> > +              Y-Rp                          !
> > +               ^                            !
> > +               !                            !
> > +               !                            !
> > +               !                            !
> > +               !                            !
> > +               !                            !
> > +               !                            !
> > +               !                            V
> > +               !                           Y-Rc
> > +             0 +------------------------------------->
> > +               0              X-Rp
> > +
> > +  270 degrees camera rotation
> > +
> > +               0        Y-Rc
> > +             0 +-------------------->
> > +               !                                        0
> > +               !    <-----------------------------------+ 0
> > +               !                    X-Rp                !
> > +               !                                        !
> > +               !                                        !
> > +               !                                        !
> > +               !                                        !
> > +               !                                        !
> > +               !                                        !
> > +               !                                        !
> > +               !                                        !
> > +               !                                        V
> > +               !                                       Y-Rp
> > +               !
> > +               !
> > +               !
> > +               !
> > +               V
> > +              X-Rc
> > +
> > +
> > +  Example one - Webcam
> > +
> > +  A camera module installed on the user facing part of a laptop screen
> > +  casing used for video calls. The captured images are meant to be
> > +  displayed in landscape mode (width > height) on the laptop screen.
> > +
> > +  The camera is typically mounted upside-down to compensate the lens
> > +  optical inversion effect.
> > +
> > +                    Y-Rp
> > +              Y-Rc   ^
> > +               ^     !
> > +               !     !
> > +               !     !       |\_____)\__
> > +               !     !       ) ____  ___.<
> > +               !     !       |/    )/
> > +               !     !
> > +               !     !
> > +               !     !
> > +               !   0 +------------------------------------->
> > +               !     0           X-Rp
> > +             0 +------------------------------------->
> > +               0            X-Rc
> > +
> > +  The two reference systems are aligned, the resulting camera rotation is
> > +  0 degrees, no rotation correction needs to be applied to the resulting
> > +  image once captured to memory buffers to correctly display it to users.
> > +
> > +               +--------------------------------------+
> > +               !                                      !
> > +               !                                      !
> > +               !                                      !
> > +               !             |\____)\___              !
> > +               !             ) _____  __`<            !
> > +               !             |/     )/                !
> > +               !                                      !
> > +               !                                      !
> > +               !                                      !
> > +               +--------------------------------------+
> > +
> > +  If the camera sensor is not mounted upside-down to compensate for the
> > +  lens optical inversion, the two reference systems will not be aligned,
> > +  with 'Rp' being rotated 180 degrees relatively to 'Rc'.
> 
> I'd say the camera is mounted upright (rotation 0) if the image it produces
> is read from the top-left corner towards the bottom. That is what the
> current rotation property refers to, and I don't think we can change that
> anymore.

The camera module is mounted upright, while the camera sensor is mounted
upside-down :-)

> Note that the lens is a part of the camera (or camera module). Could this
> be defined for the camera module instead, to be compatible with the
> existing definition and to take the entire lens system in the module into
> account?

This documentation intentionally defines rotation using a scene
reference and a camera sensor reference in order to take the lens (and
anything else between the two) into account.

> > +
> > +
> > +                        X-Rc                0
> > +       <------------------------------------+ 0
> > +                                            !
> > +              Y-Rp                          !
> > +               ^                            !
> > +               !                            !
> > +               !       |\_____)\__          !
> > +               !       ) ____  ___.<        !
> > +               !       |/    )/             !
> > +               !                            !
> > +               !                            !
> > +               !                            V
> > +               !                           Y-Rc
> > +             0 +------------------------------------->
> > +               0            X-Rp
> > +
> > +  The image once captured to memory will then be rotated by 180 degrees
> > +
> > +               +--------------------------------------+
> > +               !                                      !
> > +               !                                      !
> > +               !                                      !
> > +               !              __/(_____/|             !
> > +               !            >.___  ____ (             !
> > +               !                 \(    \|             !
> > +               !                                      !
> > +               !                                      !
> > +               !                                      !
> > +               +--------------------------------------+
> > +
> > +  A software rotation correction of 180 degrees should be applied to
> > +  correctly display the image.
> > +
> > +               +--------------------------------------+
> > +               !                                      !
> > +               !                                      !
> > +               !                                      !
> > +               !             |\____)\___              !
> > +               !             ) _____  __`<            !
> > +               !             |/     )/                !
> > +               !                                      !
> > +               !                                      !
> > +               !                                      !
> > +               +--------------------------------------+
> > +
> > +  Example two - Phone camera
> > +
> > +  A camera installed on the back side of a mobile device facing away from
> > +  the user. The captured images are meant to be displayed in portrait mode
> > +  (height > width) to match the device screen orientation and the device
> > +  usage orientation used when taking the picture.
> > +
> > +  The camera sensor is typically mounted with its pixel array longer side
> > +  aligned to the device longer side, upside-down mounted to compensate for
> > +  the lens optical inversion effect.
> > +
> > +               0        Y-Rc
> > +             0 +-------------------->
> > +               !   Y-Rp
> > +               !    ^
> > +               !    !
> > +               !    !
> > +               !    !
> > +               !    !            |\_____)\__
> > +               !    !            ) ____  ___.<
> > +               !    !            |/    )/
> > +               !    !
> > +               !    !
> > +               !    !
> > +               !  0 +------------------------------------->
> > +               !    0                X-Rp
> > +               !
> > +               !
> > +               !
> > +               !
> > +               V
> > +              X-Rc
> > +
> > +  The two reference systems are not aligned and the 'Rp' reference
> > +  system is rotated by 90 degrees in the counter-clockwise direction
> > +  relatively to the 'Rc' reference system.
> > +
> > +  The image once captured to memory will be rotated.
> > +
> > +               +-------------------------------------+
> > +               |                 _ _                 |
> > +               |                \   /                |
> > +               |                 | |                 |
> > +               |                 | |                 |
> > +               |                 |  >                |
> > +               |                <  |                 |
> > +               |                 | |                 |
> > +               |                   .                 |
> > +               |                  V                  |
> > +               +-------------------------------------+
> > +
> > +  A correction of 90 degrees in counter-clockwise direction has to be
> > +  applied to correctly display the image in portrait mode on the device
> > +  screen.
> > +
> > +                        +--------------------+
> > +                        |                    |
> > +                        |                    |
> > +                        |                    |
> > +                        |                    |
> > +                        |                    |
> > +                        |                    |
> > +                        |   |\____)\___      |
> > +                        |   ) _____  __`<    |
> > +                        |   |/     )/        |
> > +                        |                    |
> > +                        |                    |
> > +                        |                    |
> > +                        |                    |
> > +                        |                    |
> > +                        +--------------------+
> > 
> >  - location: The mount location of a device (typically an image sensor or a flash
> >    LED) expressed as a position relative to the usage orientation of the system

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2020-06-08 21:41 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-18 20:50 [PATCH v7 00/11] media: Report camera sensor properties Jacopo Mondi
2020-03-18 20:50 ` [PATCH v7 01/11] dt-bindings: video-interfaces: Document 'location' property Jacopo Mondi
2020-03-18 20:50 ` [PATCH v7 02/11] media: v4l2-ctrl: Document V4L2_CID_CAMERA_SENSOR_LOCATION Jacopo Mondi
2020-03-18 20:50 ` [PATCH v7 03/11] dt-bindings: video-interface: Replace 'rotation' description Jacopo Mondi
2020-03-20  1:03   ` Rob Herring
2020-03-31 10:21   ` Hans Verkuil
2020-06-08 10:09   ` Sakari Ailus
2020-06-08 21:41     ` Laurent Pinchart
2020-03-18 20:50 ` [PATCH v7 04/11] media: v4l2-ctrl: Document V4L2_CID_CAMERA_SENSOR_ROTATION Jacopo Mondi
2020-03-18 20:50 ` [PATCH v7 05/11] media: v4l2-ctrls: Add camera location and rotation Jacopo Mondi
2020-03-18 20:50 ` [PATCH v7 06/11] media: v4l2-fwnode: Add helper to parse device properties Jacopo Mondi
2020-03-18 20:50 ` [PATCH v7 07/11] include: v4l2-ctrl: Sort forward declarations Jacopo Mondi
2020-03-18 20:50 ` [PATCH v7 08/11] media: v4l2-ctrls: Sort includes alphabetically Jacopo Mondi
2020-03-18 20:50 ` [PATCH v7 09/11] media: v4l2-ctrls: Add helper to register properties Jacopo Mondi
2020-03-18 20:50 ` [PATCH v7 10/11] media: i2c: ov5670: Parse and " Jacopo Mondi
2020-03-18 20:50 ` [PATCH v7 11/11] media: i2c: ov13858: " Jacopo Mondi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.