[libcamera-devel] [PATCH v4 03/31] libcamera: ipu3: Make sure sensor provides a compatible format
Jacopo Mondi
jacopo at jmondi.org
Wed Mar 20 17:30:27 CET 2019
When creating a camera, make sure a the image sensor provides images in
a format compatible with IPU3 CIO2 unit requirements.
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
src/libcamera/pipeline/ipu3/ipu3.cpp | 43 ++++++++++++++++++++++++++--
1 file changed, 41 insertions(+), 2 deletions(-)
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 55489c31df2d..2602f89617a3 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -8,6 +8,8 @@
#include <memory>
#include <vector>
+#include <linux/media-bus-format.h>
+
#include <libcamera/camera.h>
#include <libcamera/request.h>
#include <libcamera/stream.h>
@@ -78,6 +80,8 @@ private:
PipelineHandler::cameraData(camera));
}
+ int mediaBusToCIO2Format(unsigned int code);
+
void registerCameras();
std::shared_ptr<MediaDevice> cio2_;
@@ -327,6 +331,22 @@ bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator)
return true;
}
+int PipelineHandlerIPU3::mediaBusToCIO2Format(unsigned int code)
+{
+ switch (code) {
+ case MEDIA_BUS_FMT_SBGGR10_1X10:
+ return V4L2_PIX_FMT_IPU3_SBGGR10;
+ case MEDIA_BUS_FMT_SGBRG10_1X10:
+ return V4L2_PIX_FMT_IPU3_SGBRG10;
+ case MEDIA_BUS_FMT_SGRBG10_1X10:
+ return V4L2_PIX_FMT_IPU3_SGRBG10;
+ case MEDIA_BUS_FMT_SRGGB10_1X10:
+ return V4L2_PIX_FMT_IPU3_SRGGB10;
+ default:
+ return -EINVAL;
+ }
+}
+
/*
* Cameras are created associating an image sensor (represented by a
* media entity with function MEDIA_ENT_F_CAM_SENSOR) to one of the four
@@ -404,18 +424,37 @@ void PipelineHandlerIPU3::registerCameras()
if (ret)
continue;
- data->cio2_->bufferReady.connect(data.get(), &IPU3CameraData::bufferReady);
-
+ /*
+ * Make sure the sensor produces at least one image format
+ * compatible with IPU3 CIO2 requirements.
+ */
data->sensor_ = new V4L2Subdevice(sensor);
ret = data->sensor_->open();
if (ret)
continue;
+ const FormatEnum formats = data->sensor_->formats(0);
+ auto it = formats.begin();
+ for (; it != formats.end(); ++it) {
+ if (mediaBusToCIO2Format(it->first) != -EINVAL)
+ break;
+ }
+ if (it == formats.end()) {
+ LOG(IPU3, Info)
+ << "Sensor '" << data->sensor_->deviceName()
+ << "' detected, but no supported image format "
+ << " found: skip camera creation";
+ continue;
+ }
+
data->csi2_ = new V4L2Subdevice(csi2);
ret = data->csi2_->open();
if (ret)
continue;
+ data->cio2_->bufferReady.connect(data.get(),
+ &IPU3CameraData::bufferReady);
+
registerCamera(std::move(camera), std::move(data));
LOG(IPU3, Info)
--
2.21.0
More information about the libcamera-devel
mailing list