summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2022-04-06 13:35:53 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-04-06 15:44:37 +0300
commit04faa8477abdaf1dafad3fdbe9dc58326e9126d2 (patch)
tree5156202457848cd980343f570ae3bc1b89646d4c
parent16f3d2de50ffa35295240e247d8cc4cffabf1a53 (diff)
pipeline: raspberrypi: Add a Unicam dequeue timeout
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 an 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@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--include/libcamera/ipa/raspberrypi.mojom1
-rw-r--r--src/ipa/raspberrypi/raspberrypi.cpp2
-rw-r--r--src/libcamera/pipeline/raspberrypi/raspberrypi.cpp19
3 files changed, 22 insertions, 0 deletions
diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom
index acd3cafe..5a228b75 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 1bf4e270..89767a9d 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 8fd79be6..d6148724 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -45,6 +45,8 @@
#include "dma_heaps.h"
#include "rpi_stream.h"
+using namespace std::chrono_literals;
+
namespace libcamera {
LOG_DEFINE_CATEGORY(RPI)
@@ -208,6 +210,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);
@@ -1050,6 +1053,14 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
}
}
+ /*
+ * Set the dequeue timeout to the larger of 2x the maximum possible
+ * frame duration or 1 second.
+ */
+ utils::Duration timeout =
+ std::max<utils::Duration>(1s, 2 * startConfig.maxSensorFrameLengthMs * 1ms);
+ data->unicam_[Unicam::Image].dev()->setDequeueTimeout(timeout);
+
return 0;
}
@@ -1192,6 +1203,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);
@@ -1773,6 +1785,13 @@ void RPiCameraData::setSensorControls(ControlList &controls)
sensor_->setControls(&controls);
}
+void RPiCameraData::unicamTimeout()
+{
+ LOG(RPI, Error) << "Unicam has timed out!";
+ LOG(RPI, Error) << "Please check that your camera sensor connector is attached securely.";
+ LOG(RPI, Error) << "Alternatively, try another cable and/or sensor.";
+}
+
void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer)
{
RPi::Stream *stream = nullptr;