mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-26 10:05:08 +03:00
libcamera: camera_sensor: Validate driver support
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: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
parent
1b4997ef08
commit
8502d4c52d
2 changed files with 85 additions and 0 deletions
|
@ -69,6 +69,7 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int generateId();
|
int generateId();
|
||||||
|
int validateSensorDriver();
|
||||||
int initProperties();
|
int initProperties();
|
||||||
|
|
||||||
const MediaEntity *entity_;
|
const MediaEntity *entity_;
|
||||||
|
|
|
@ -207,6 +207,10 @@ int CameraSensor::init()
|
||||||
*/
|
*/
|
||||||
resolution_ = sizes_.back();
|
resolution_ = sizes_.back();
|
||||||
|
|
||||||
|
ret = validateSensorDriver();
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
ret = initProperties();
|
ret = initProperties();
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -214,6 +218,86 @@ int CameraSensor::init()
|
||||||
return 0;
|
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";
|
||||||
|
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()
|
int CameraSensor::initProperties()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue