[libcamera-devel] [PATCH 0/9] libcamera: camera: Add camera ID

Jacopo Mondi jacopo at jmondi.org
Mon Jul 20 16:48:26 CEST 2020


Hi Niklas,

On Sat, Jul 18, 2020 at 03:23:15PM +0200, Niklas Söderlund wrote:
> Hello,
>
> This series aims to add a ID to each camera in addition to it's more
> user-friendly name. The ID is unique and persistent between reboots of
> the same system. The use-case for this is to create a single
> machine-friendly ID that can be stored and used to always resolve to the
> same camera.
>
> The idea on how to generate a ID is to take the sysfs path of the sensor
> device which is part of each camera pipeline. As the path describes the
> location of the sensor hardware it is persistent across reboots and as
> the path is read from sysfs it's guaranteed to be unique in the system.
>
> For pipelines that do not have a sensor (UVC) the sysfs path of the main
> video device is used instead. That path resolves to the USB device and
> includes the USB bus information so it satisfy the ID requirements.
>
> While working with this problem it became apparent that two pipelines
> diverge from the others on how they name their cameras, raspberrypi and
> vimc. This series aligns these two and adds a helper to avoid such
> situations in the future. Unfortunately this means the user-friendly
> name of the sensor changes but this proves the need for a
> machine-friendly ID which luckily this series also adds :-)
>
> Before this series camera user-friendly names on different systems
> looked like this (I do not have access to a simple pipeline device):
>
> - ipu3
>         ov13858 8-0010
>         ov5670 10-0036
> - raspberrypi
>         imx219
> - rkisp1
>         ov5695 7-0036
>         ov2685 7-003c
> - uvcvideo
>         Logitech Webcam C930e
> - vimc
>         VIMC Sensor B
>
> With this series applied the user-friendly names machine-friendly ID on
> the same systems look like this:
>
> The format is:
>     <user-friendly name> (<machine-friendly ID>)
>
> - ipu3
>         ov13858 8-0010 (pci0000:00/0000:00:15.2/i2c_designware.2/i2c-8/i2c-OVTID858:00)
>         ov5670 10-0036 (pci0000:00/0000:00:19.2/i2c_designware.5/i2c-10/i2c-INT3479:00)
> - raspberrypi
>         imx219 10-0010 (platform/soc/3f205000.i2c/i2c-11/i2c-10/10-0010)
> - rkisp1
>         ov5695 7-0036 (platform/ff160000.i2c/i2c-7/7-0036)
>         ov2685 7-003c (platform/ff160000.i2c/i2c-7/7-003c)
> - uvcvideo
>         Logitech Webcam C930e (pci0000:00/0000:00:1c.4/0000:08:00.0/0000:09:02.0/0000:25:00.0/usb3/3-2/3-2.4/3-2.4:1.0)
> - vimc
>         Sensor B (platform/vimc.0)

Really an open question, are those name really useful ?

I've spent some time going through systemd predictable interfaces
names and udevadm test-builtin path_id and indeed they use the same
information you have here collected, but they produce a name without /
and with a well defined naming scheme (systemd at least) that could be
guessed by knowing how the devices are integrated in the system.

I don't think we need to go as far as making our camera names
predictable, at least I don't see a urgent use case for that, but
taking the raw sysfs path seems a bit too simplicistic, especially
when you then have to deal with ids like:
        pci0000:00/0000:00:1c.4/0000:08:00.0/0000:09:02.0/0000:25:00.0/usb3/3-2/3-2.4/3-2.4:1.0

which seems a bit long to me.

I know this is not expected to be used by users directly, but as per
my previous comment I think we should not expose an API in libcamera
that works on names which are not guranteed to be unique (althoug
application should be able to provide shortcut, maybe using friendly
names as reported by pipeline handlers.

Trying to list which kind of sensor we should deal with, their number
is fairly limited for my understanding: usb and i2c. Wouldn't coupling
the bus identifier with the sensor identifier enough to provide a
unique and almost-as-friendly-as-a-name id ?

Using the use example you have above provided:
- ipu3
        i2c-8_i2c-OVTID858:00
        i2c-10_i2c-INT3479:00
- raspberrypi
        i2c-10_10-0010
- rkisp1
        i2c-7_7-0036
        i2c-7_7-003c
- uvcvideo
        usb3_3-2_3-2.4_3-2.4:1.0
- vimc
        vimc.0

I2c is trivial, use the device identifier and walk the path back until
the i2c parent identifier is found, then couple the 2.

usb seems a bit more tricky as a full name like
        usb3_3-2_3-2.4_3-2.4:1.0
could probably be reduced to
        usb3_3-2.4:1.0

(however, udevadm for my UVC camera gives me:
udevadm test-builtin path_id /sys/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0
ID_PATH_TAG=pci-0000_00_14_0-usb-0_8_1_0
while I would have expected usb1_1-8:1.0

I know nothing about USB, but it might be worth reading why udev
thinks that path tag should in that form
https://github.com/systemd/systemd/blob/master/src/udev/udev-builtin-path_id.c

Vimc is kind of special, you cannot have 2 vimc instances in your
system loaded at the same time, so I guess the device name should be
enough.

What options have you considered in place of the full sysfs path ? Or
do you think there's no need to and a string like
        pci0000:00/0000:00:1c.4/0000:08:00.0/0000:09:02.0/0000:25:00.0/usb3/3-2/3-2.4/3-2.4:1.0
could be easily managed by applications ?

Thanks
  j

>
> Where it previously where possible to select a camera by its
> user-friendly name its now possible to also select it using its
> machine-friendly one. The following is therefor two equivalent
> commands:
>
>     $ cam -c "Logitech Webcam C930e" -C
>     $ cam -c "pci0000:00/0000:00:1c.4/0000:08:00.0/0000:09:02.0/0000:25:00.0/usb3/3-2/3-2.4/3-2.4:1.0" -C
>
> Niklas Söderlund (9):
>   libcamera: v4l2_device: Add method to lookup device path
>   libcamera: camera_sensor: Expose a sensor ID
>   libcamera: camera: Add camera ID
>   libcamera: camera_manager: Enforce unique camera IDs
>   libcamera: camera_manager: Try to match camera IDs first
>   libcamera: pipeline: vimc: Align camera name
>   libcamera: pipeline: raspberrypi: Align camera name
>   libcamera: camera: Add create() that operates on CameraSensor
>   cam: Print camera IDs when listing cameras
>
>  include/libcamera/camera.h                    | 11 +++-
>  include/libcamera/internal/camera_sensor.h    |  2 +
>  include/libcamera/internal/v4l2_device.h      |  1 +
>  src/cam/main.cpp                              |  3 +-
>  src/libcamera/camera.cpp                      | 54 +++++++++++++++----
>  src/libcamera/camera_manager.cpp              | 13 +++++
>  src/libcamera/camera_sensor.cpp               | 17 ++++++
>  src/libcamera/pipeline/ipu3/ipu3.cpp          |  9 ++--
>  .../pipeline/raspberrypi/raspberrypi.cpp      |  3 +-
>  src/libcamera/pipeline/rkisp1/rkisp1.cpp      |  2 +-
>  src/libcamera/pipeline/simple/simple.cpp      |  3 +-
>  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp  |  7 ++-
>  src/libcamera/pipeline/vimc/vimc.cpp          |  4 +-
>  src/libcamera/v4l2_device.cpp                 | 27 ++++++++++
>  test/camera/buffer_import.cpp                 |  2 +-
>  test/camera/capture.cpp                       |  2 +-
>  test/camera/configuration_default.cpp         |  2 +-
>  test/camera/configuration_set.cpp             |  2 +-
>  test/camera/statemachine.cpp                  |  2 +-
>  test/controls/control_info_map.cpp            |  2 +-
>  test/controls/control_list.cpp                |  2 +-
>  21 files changed, 138 insertions(+), 32 deletions(-)
>
> --
> 2.27.0
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel


More information about the libcamera-devel mailing list