@@ -108,6 +108,7 @@ private:
void setMode(const IPACameraSensorInfo &sensorInfo);
bool validateSensorControls();
bool validateIspControls();
+ bool validateLensControls();
void queueRequest(const ControlList &controls);
void returnEmbeddedBuffer(unsigned int bufferId);
void prepareISP(const ipa::RPi::ISPConfig &data);
@@ -132,6 +133,7 @@ private:
ControlInfoMap sensorCtrls_;
ControlInfoMap ispCtrls_;
+ ControlInfoMap lensCtrls_;
ControlList libcameraMetadata_;
/* Camera sensor params. */
@@ -342,13 +344,14 @@ int IPARPi::configure(const IPACameraSensorInfo &sensorInfo,
const ipa::RPi::IPAConfig &ipaConfig,
ControlList *controls)
{
- if (entityControls.size() != 2) {
- LOG(IPARPI, Error) << "No ISP or sensor controls found.";
+ if (entityControls.size() != 3) {
+ LOG(IPARPI, Error) << "No ISP, lens or sensor controls found.";
return -1;
}
sensorCtrls_ = entityControls.at(0);
ispCtrls_ = entityControls.at(1);
+ lensCtrls_ = entityControls.at(2);
if (!validateSensorControls()) {
LOG(IPARPI, Error) << "Sensor control validation failed.";
@@ -360,6 +363,10 @@ int IPARPi::configure(const IPACameraSensorInfo &sensorInfo,
return -1;
}
+ if (!validateLensControls()) {
+ LOG(IPARPI, Error) << "Lens control validation failed.";
+ }
+
maxSensorGainCode_ = sensorCtrls_.at(V4L2_CID_ANALOGUE_GAIN).max().get<int32_t>();
/* Setup a metadata ControlList to output metadata. */
@@ -578,6 +585,23 @@ bool IPARPi::validateIspControls()
return true;
}
+bool IPARPi::validateLensControls()
+{
+ static const uint32_t ctrls[] = {
+ V4L2_CID_FOCUS_ABSOLUTE,
+ };
+
+ for (auto c : ctrls) {
+ if (lensCtrls_.find(c) == lensCtrls_.end()) {
+ LOG(IPARPI, Error) << "Unable to find lens control "
+ << utils::hex(c);
+ return false;
+ }
+ }
+
+ return true;
+}
+
/*
* Converting between enums (used in the libcamera API) and the names that
* we use to identify different modes. Unfortunately, the conversion tables
@@ -1066,6 +1090,14 @@ void IPARPi::processStats(unsigned int bufferId)
setDelayedControls.emit(ctrls);
}
+
+ struct FocusStatus focusStatus;
+ if (rpiMetadata_.Get("af.status", focusStatus) == 0) {
+ ControlList lensCtrls(lensCtrls_);
+ lensCtrls.set(V4L2_CID_FOCUS_ABSOLUTE,
+ static_cast<int32_t>(focusStatus.focus));
+ setLensControls.emit(lensCtrls);
+ }
}
void IPARPi::applyAWB(const struct AwbStatus *awbStatus, ControlList &ctrls)
Now that the ancillary links are configured, we can use the CameraLens class and control the VCM through the IPA. For now, force a default value for the lens position, until the AF algorithm is introduced. Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> --- src/ipa/raspberrypi/raspberrypi.cpp | 36 +++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-)