Message ID | 20211207224512.753979-5-djrscally@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Daniel, Thank you for the patch. On Tue, Dec 07, 2021 at 10:45:07PM +0000, Daniel Scally wrote: > Add a function to check for and initialise any VCMs linked to the > CameraSensor's entity by ancillary links. This should initialise > the lens_ member with the linked entity. Call the new function > during CameraSensor::init(). > > Signed-off-by: Daniel Scally <djrscally@gmail.com> > --- > Changes in v3: > > - Fixed some style errors > - Replaced the flash case by printing the entity function in the > default case. > > include/libcamera/internal/camera_sensor.h | 1 + > src/libcamera/camera_sensor.cpp | 39 ++++++++++++++++++++++ > 2 files changed, 40 insertions(+) > > diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h > index 2fa11567..7fb4eded 100644 > --- a/include/libcamera/internal/camera_sensor.h > +++ b/include/libcamera/internal/camera_sensor.h > @@ -81,6 +81,7 @@ private: > void initTestPatternModes(); > int initProperties(); > int applyTestPatternMode(controls::draft::TestPatternModeEnum mode); > + int discoverAncillaryDevices(); > > const MediaEntity *entity_; > std::unique_ptr<V4L2Subdevice> subdev_; > diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp > index 7bb39b1e..1cfb1781 100644 > --- a/src/libcamera/camera_sensor.cpp > +++ b/src/libcamera/camera_sensor.cpp > @@ -161,6 +161,10 @@ int CameraSensor::init() > if (ret) > return ret; > > + ret = discoverAncillaryDevices(); > + if (ret) > + return ret; > + > return applyTestPatternMode(controls::draft::TestPatternModeEnum::TestPatternModeOff); > } > > @@ -432,6 +436,41 @@ int CameraSensor::initProperties() > return 0; > } > > +/** > + * \brief Check for and initialise any ancillary devices > + * > + * Sensors sometimes have ancillary devices such as a Lens or Flash that could > + * be linked to their MediaEntity by the kernel. Search for and handle any > + * such device. > + * > + * \todo Handle MEDIA_ENT_F_FLASH too. > + */ > +int CameraSensor::discoverAncillaryDevices() > +{ > + int ret; > + > + for (MediaEntity *ancillary : entity_->ancillaryEntities()) { > + switch (ancillary->function()) { > + case MEDIA_ENT_F_LENS: > + focusLens_ = std::make_unique<CameraLens>(ancillary); > + ret = focusLens_->init(); > + if (ret) { > + LOG(CameraSensor, Error) > + << "CameraLens initialisation failed"; > + return ret; > + } > + break; > + > + default: > + LOG(CameraSensor, Warning) > + << "Unsupported ancillary entity function: " s/function:/function/ Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > + << ancillary->function(); > + } > + } > + > + return 0; > +} > + > /** > * \fn CameraSensor::model() > * \brief Retrieve the sensor model name
diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index 2fa11567..7fb4eded 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -81,6 +81,7 @@ private: void initTestPatternModes(); int initProperties(); int applyTestPatternMode(controls::draft::TestPatternModeEnum mode); + int discoverAncillaryDevices(); const MediaEntity *entity_; std::unique_ptr<V4L2Subdevice> subdev_; diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp index 7bb39b1e..1cfb1781 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -161,6 +161,10 @@ int CameraSensor::init() if (ret) return ret; + ret = discoverAncillaryDevices(); + if (ret) + return ret; + return applyTestPatternMode(controls::draft::TestPatternModeEnum::TestPatternModeOff); } @@ -432,6 +436,41 @@ int CameraSensor::initProperties() return 0; } +/** + * \brief Check for and initialise any ancillary devices + * + * Sensors sometimes have ancillary devices such as a Lens or Flash that could + * be linked to their MediaEntity by the kernel. Search for and handle any + * such device. + * + * \todo Handle MEDIA_ENT_F_FLASH too. + */ +int CameraSensor::discoverAncillaryDevices() +{ + int ret; + + for (MediaEntity *ancillary : entity_->ancillaryEntities()) { + switch (ancillary->function()) { + case MEDIA_ENT_F_LENS: + focusLens_ = std::make_unique<CameraLens>(ancillary); + ret = focusLens_->init(); + if (ret) { + LOG(CameraSensor, Error) + << "CameraLens initialisation failed"; + return ret; + } + break; + + default: + LOG(CameraSensor, Warning) + << "Unsupported ancillary entity function: " + << ancillary->function(); + } + } + + return 0; +} + /** * \fn CameraSensor::model() * \brief Retrieve the sensor model name
Add a function to check for and initialise any VCMs linked to the CameraSensor's entity by ancillary links. This should initialise the lens_ member with the linked entity. Call the new function during CameraSensor::init(). Signed-off-by: Daniel Scally <djrscally@gmail.com> --- Changes in v3: - Fixed some style errors - Replaced the flash case by printing the entity function in the default case. include/libcamera/internal/camera_sensor.h | 1 + src/libcamera/camera_sensor.cpp | 39 ++++++++++++++++++++++ 2 files changed, 40 insertions(+)