[libcamera-devel] [RFC PATCH 3/3] ipa: raspberrypi: Control the lens position
Jean-Michel Hautbois
jeanmichel.hautbois at ideasonboard.com
Wed Mar 23 14:36:22 CET 2022
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 at ideasonboard.com>
---
src/ipa/raspberrypi/raspberrypi.cpp | 36 +++++++++++++++++++++++++++--
1 file changed, 34 insertions(+), 2 deletions(-)
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 1bf4e270..2e862f37 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -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)
--
2.32.0
More information about the libcamera-devel
mailing list