[libcamera-devel] [PATCH v2 2/2] pipeline: raspberrypi: Add a Unicam dequeue timeout
Naushir Patuck
naush at raspberrypi.com
Thu Mar 24 10:34:09 CET 2022
Enable the V4L2VideoDevice dequeue timeout for the Unicam Image node, and
connect the timeout signal to a slot in the pipeline handler. This slot will
log a fatal error message informing the user of a possible hardware stall.
The timeout is calculated as 2x the maximum frame length possible for a given
mode, returned by the IPA.
Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
---
include/libcamera/ipa/raspberrypi.mojom | 1 +
src/ipa/raspberrypi/raspberrypi.cpp | 2 ++
.../pipeline/raspberrypi/raspberrypi.cpp | 15 +++++++++++++++
3 files changed, 18 insertions(+)
diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom
index acd3cafe6c91..5a228b75cd2f 100644
--- a/include/libcamera/ipa/raspberrypi.mojom
+++ b/include/libcamera/ipa/raspberrypi.mojom
@@ -41,6 +41,7 @@ struct IPAConfig {
struct StartConfig {
libcamera.ControlList controls;
int32 dropFrameCount;
+ uint32 maxSensorFrameLengthMs;
};
interface IPARPiInterface {
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 1bf4e270b062..89767a9db471 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -280,6 +280,8 @@ void IPARPi::start(const ControlList &controls, ipa::RPi::StartConfig *startConf
}
startConfig->dropFrameCount = dropFrameCount_;
+ const Duration maxSensorFrameDuration = mode_.max_frame_length * mode_.line_length;
+ startConfig->maxSensorFrameLengthMs = maxSensorFrameDuration.get<std::milli>();
firstStart_ = false;
lastRunTimestamp_ = 0;
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index c2230199fed7..58b1179c4294 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -202,6 +202,7 @@ public:
void setIspControls(const ControlList &controls);
void setDelayedControls(const ControlList &controls);
void setSensorControls(ControlList &controls);
+ void unicamTimeout();
/* bufferComplete signal handlers. */
void unicamBufferDequeue(FrameBuffer *buffer);
@@ -1032,6 +1033,11 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
}
}
+ /* Set the dequeue timeout to 2x the maximum possible frame duration. */
+ std::chrono::milliseconds msec(startConfig.maxSensorFrameLengthMs * 2);
+ data->unicam_[Unicam::Image].dev()->setDequeueTimeout(msec);
+ LOG(RPI, Debug) << "Setting Unicam timeout to " << msec << " ms.";
+
return 0;
}
@@ -1176,6 +1182,7 @@ int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp, Me
data->isp_[Isp::Stats] = RPi::Stream("ISP Stats", ispCapture3);
/* Wire up all the buffer connections. */
+ data->unicam_[Unicam::Image].dev()->dequeueTimeout.connect(data.get(), &RPiCameraData::unicamTimeout);
data->unicam_[Unicam::Image].dev()->frameStart.connect(data.get(), &RPiCameraData::frameStarted);
data->unicam_[Unicam::Image].dev()->bufferReady.connect(data.get(), &RPiCameraData::unicamBufferDequeue);
data->isp_[Isp::Input].dev()->bufferReady.connect(data.get(), &RPiCameraData::ispInputDequeue);
@@ -1757,6 +1764,14 @@ void RPiCameraData::setSensorControls(ControlList &controls)
sensor_->setControls(&controls);
}
+void RPiCameraData::unicamTimeout()
+{
+ LOG(RPI, Error)
+ << "Unicam has timed out!\n"
+ "Please check that your camera sensor connector is attached securely.\n"
+ "Alternatively, try another cable and/or sensor.";
+}
+
void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer)
{
RPi::Stream *stream = nullptr;
--
2.25.1
More information about the libcamera-devel
mailing list