[libcamera-devel] [PATCH 3/3] libcamera: camera_sensor: Check control availability from idmap
Jacopo Mondi
jacopo at jmondi.org
Mon Feb 1 11:04:38 CET 2021
Hi Laurent
On Sun, Jan 31, 2021 at 08:17:22PM +0200, Laurent Pinchart wrote:
> The presence of mandatory and optional controls is checked in
> CameraSensor::validateSensorDriver() by trying to retrieve them. This
> cases an error message to be printed in the V4L2Device class if an
causes
> optional control isn't present, while this isn't an error.
>
> To fix this, use the control idmap reported by the V4L2Device to check
> for control availability. The function can now print the whole list of
controls
> missing controls, making debugging easier.
Niiiice!
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/libcamera/camera_sensor.cpp | 31 +++++++++++++++++++++----------
> 1 file changed, 21 insertions(+), 10 deletions(-)
>
> diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
> index 10713d3a0c29..85813befbf58 100644
> --- a/src/libcamera/camera_sensor.cpp
> +++ b/src/libcamera/camera_sensor.cpp
> @@ -250,14 +250,18 @@ int CameraSensor::validateSensorDriver()
> * Optional controls are used to register optional sensor properties. If
> * not present, some values will be defaulted.
> */
> - const std::vector<uint32_t> optionalControls{
> + static constexpr uint32_t optionalControls[] = {
Unrelated but welcome
> V4L2_CID_CAMERA_ORIENTATION,
> V4L2_CID_CAMERA_SENSOR_ROTATION,
> };
>
> - ControlList ctrls = subdev_->getControls(optionalControls);
> - if (ctrls.empty())
> - LOG(CameraSensor, Debug) << "Optional V4L2 controls not supported";
> + const ControlIdMap &controls = subdev_->controls().idmap();
> + for (uint32_t ctrl : optionalControls) {
> + if (!controls.count(ctrl))
Why going through the idmap ? Can't you call count() on the
ControlInfoMap returned by subdev_->controls() ?
> + LOG(CameraSensor, Debug)
> + << "Optional V4L2 control " << utils::hex(ctrl)
> + << " not supported";
> + }
I really hoped we could have printed the control name out.
The only way I can think of, as we can't create the V4L2ControlId from
the kernel interface that reports the control's name is going through
a macro that stringifies the V4L2_CID_... identifier.
Not for this patch though
>
> /*
> * Make sure the required selection targets are supported.
> @@ -312,21 +316,28 @@ int CameraSensor::validateSensorDriver()
> * For raw sensors, make sure the sensor driver supports the controls
> * required by the CameraSensor class.
> */
> - const std::vector<uint32_t> mandatoryControls{
> + static constexpr uint32_t mandatoryControls[] = {
> V4L2_CID_EXPOSURE,
> V4L2_CID_HBLANK,
> V4L2_CID_PIXEL_RATE,
> };
>
> - ctrls = subdev_->getControls(mandatoryControls);
> - if (ctrls.empty()) {
> - LOG(CameraSensor, Error)
> - << "Mandatory V4L2 controls not available";
> + err = 0;
> + for (uint32_t ctrl : mandatoryControls) {
> + if (!controls.count(ctrl)) {
> + LOG(CameraSensor, Error)
> + << "Mandatory V4L2 control " << utils::hex(ctrl)
> + << " not available";
> + err = -EINVAL;
Should you break here ?
> + }
> + }
> +
> + if (err) {
> LOG(CameraSensor, Error)
> << "The sensor kernel driver needs to be fixed";
> LOG(CameraSensor, Error)
> << "See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information";
> - return -EINVAL;
> + return err;
> }
>
> return 0;
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> 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