[libcamera-devel] [PATCH 3/3] libcamera: camera_sensor: Check control availability from idmap
Jacopo Mondi
jacopo at jmondi.org
Thu Feb 4 13:05:18 CET 2021
Hi Laurent,
On Mon, Feb 01, 2021 at 10:45:02PM +0200, Laurent Pinchart wrote:
> Hi Jacopo,
>
> On Mon, Feb 01, 2021 at 11:04:38AM +0100, Jacopo Mondi wrote:
> > 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() ?
>
> ControlInfoMap is indexed by a ControlId *, while we have unsigned int
> IDs here.
>
Right, sorry, I've overlooked this
> > > + 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
>
> I agree it would be useful. We could generate a list of Control<> for
> all V4L2 controls, like we do for libcamera controls ;-) It's an idea
> I've been toying with, but I'm still not sure if it's worth it.
>
That would be very nice and would make the controls framework get past
the <ControlId> <unsigned int> duality.
> > >
> > > /*
> > > * 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 ?
>
> I could, but I think printing all the missing controls is useful,
> instead of only printing the first one. Otherwise you'd go to the kernel
> driver, implement the missing control, try again, and only notice the
> next one. OK, you could also read the documentation and get a full list
> :-) But it's pretty much free to print them all.
>
Correct
Please add
Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
Thanks
j
> > > + }
> > > + }
> > > +
> > > + 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
More information about the libcamera-devel
mailing list