[libcamera-devel] [PATCH v4 2/6] libcamera: camera_sensor: Validate driver support
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Jan 4 14:12:23 CET 2021
On Mon, Jan 04, 2021 at 02:08:28PM +0100, Niklas Söderlund wrote:
> Hi Jacopo,
>
> Thanks for your work.
>
> On 2020-12-31 00:05:59 +0100, Jacopo Mondi wrote:
> > The CameraSensor class requires the sensor driver to report
> > information through V4L2 controls and through the V4L2 selection API,
> > and uses that information to register Camera properties and to
> > construct CameraSensorInfo class instances to provide them to the IPA.
> >
> > Currently, validation of the kernel support happens each time a
> > feature is requested, with slighly similar debug/error messages
> > output to the user in case a feature is not supported.
> >
> > Rationalize this by validating the sensor driver requirements in a
> > single function
> >
> > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > ---
> > include/libcamera/internal/camera_sensor.h | 1 +
> > src/libcamera/camera_sensor.cpp | 84 ++++++++++++++++++++++
> > 2 files changed, 85 insertions(+)
> >
> > diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
> > index f80d836161a5..aee10aa6e3c7 100644
> > --- a/include/libcamera/internal/camera_sensor.h
> > +++ b/include/libcamera/internal/camera_sensor.h
> > @@ -69,6 +69,7 @@ protected:
> >
> > private:
> > int generateId();
> > + int validateSensorDriver();
> > int initProperties();
> >
> > const MediaEntity *entity_;
> > diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
> > index e786821d4ba2..048fcd6a1fae 100644
> > --- a/src/libcamera/camera_sensor.cpp
> > +++ b/src/libcamera/camera_sensor.cpp
> > @@ -207,6 +207,10 @@ int CameraSensor::init()
> > */
> > resolution_ = sizes_.back();
> >
> > + ret = validateSensorDriver();
> > + if (ret)
> > + return ret;
> > +
> > ret = initProperties();
> > if (ret)
> > return ret;
> > @@ -214,6 +218,86 @@ int CameraSensor::init()
> > return 0;
> > }
> >
> > +int CameraSensor::validateSensorDriver()
> > +{
> > + /*
> > + * Make sure the sensor driver supports the mandatory controls
> > + * required by the CameraSensor class.
> > + * - V4L2_CID_PIXEL_RATE is used to calculate the sensor timings
> > + * - V4L2_CID_HBLANK is used to calculate the line length
> > + */
> > + const std::vector<uint32_t> mandatoryControls{
> > + V4L2_CID_PIXEL_RATE,
> > + V4L2_CID_HBLANK,
> > + };
> > +
> > + ControlList ctrls = subdev_->getControls(mandatoryControls);
> > + if (ctrls.empty()) {
> > + LOG(CameraSensor, Error)
> > + << "Mandatory V4L2 controls not available";
> > + 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";
>
> Here and below I think this should be reworked to a single LOG() call.
> When we go more multithreading there is a possibility other threads may
> inject other LOG() calls between the ones here which may be confusing,
> how about?
>
> LOG(CameraSensor, Error)
> << "Mandatory V4L2 controls not available" << std::endl
> << "The sensor kernel driver needs to be fixed" << std::endl
> << "See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information";
Then we won't have the timestamp and other prefixes added to the lines
beside the first one :-S
> With this fixed,
>
> Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
>
> > + return -EINVAL;
> > + }
> > +
> > + /*
> > + * Optional controls are used to register optional sensor properties. If
> > + * not present, some values will be defaulted.
> > + */
> > + const std::vector<uint32_t> optionalControls{
> > + V4L2_CID_CAMERA_ORIENTATION,
> > + V4L2_CID_CAMERA_SENSOR_ROTATION,
> > + };
> > +
> > + ctrls = subdev_->getControls(optionalControls);
> > + if (ctrls.empty())
> > + LOG(CameraSensor, Debug) << "Optional V4L2 controls not supported";
> > +
> > + /*
> > + * Make sure the required selection targets are supported.
> > + *
> > + * Failures in reading any of the targets are not deemed to be fatal,
> > + * but some properties and features, like constructing a
> > + * CameraSensorInfo for the IPA module, won't be supported.
> > + *
> > + * \todo Make support for selection targets mandatory as soon as all
> > + * test platforms have been updated.
> > + */
> > + int err = 0;
> > + Rectangle rect;
> > + int ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_BOUNDS, &rect);
> > + if (ret) {
> > + LOG(CameraSensor, Warning)
> > + << "Failed to retrieve the readable pixel array size";
> > + err = -EINVAL;
> > + }
> > +
> > + ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_DEFAULT, &rect);
> > + if (ret) {
> > + LOG(CameraSensor, Warning)
> > + << "Failed to retrieve the active pixel array size";
> > + err = -EINVAL;
> > + }
> > +
> > + ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP, &rect);
> > + if (ret) {
> > + LOG(CameraSensor, Warning)
> > + << "Failed to retrieve the sensor crop rectangle";
> > + err = -EINVAL;
> > + }
> > +
> > + if (err) {
> > + LOG(CameraSensor, Warning)
> > + << "The sensor kernel driver needs to be fixed";
> > + LOG(CameraSensor, Warning)
> > + << "See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information";
> > + }
> > +
> > + return 0;
> > +}
> > +
> > int CameraSensor::initProperties()
> > {
> > /*
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list