[libcamera-devel] [RFC 2/2] libcamera: ipu3: Create CIO2 V4L2 devices

Jacopo Mondi jacopo at jmondi.org
Tue Jan 22 19:12:25 CET 2019


Create V4L2 devices for the CIO2 capture video nodes.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 42 ++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 8cbc10a..58053ea 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -15,11 +15,25 @@
 #include "log.h"
 #include "media_device.h"
 #include "pipeline_handler.h"
+#include "v4l2_device.h"
 
 namespace libcamera {
 
 LOG_DEFINE_CATEGORY(IPU3)
 
+class IPU3CameraData : public CameraData
+{
+public:
+	IPU3CameraData() : dev_(nullptr) { }
+	~IPU3CameraData() { delete dev_; }
+
+	void setV4L2Device(V4L2Device *dev) { dev_ = dev; }
+	V4L2Device *device() const { return dev_; }
+
+private:
+	V4L2Device *dev_;
+};
+
 class PipelineHandlerIPU3 : public PipelineHandler
 {
 public:
@@ -32,6 +46,7 @@ private:
 	MediaDevice *cio2_;
 	MediaDevice *imgu_;
 
+	V4L2Device *createVideoDevice(unsigned int id);
 	void registerCameras(CameraManager *manager);
 };
 
@@ -122,6 +137,24 @@ error_release_mdev:
 	return false;
 }
 
+/* Create video devices for the CIO2 unit associated with a camera. */
+V4L2Device *PipelineHandlerIPU3::createVideoDevice(unsigned int id)
+{
+	std::string cio2Name = "ipu3-cio2 " + std::to_string(id);
+	MediaEntity *cio2 = cio2_->getEntityByName(cio2Name);
+	if (!cio2)
+		return nullptr;
+
+	V4L2Device *dev = new V4L2Device(*cio2);
+	if (dev->open()) {
+		delete dev;
+		return nullptr;
+	}
+	dev->close();
+
+	return dev;
+}
+
 /*
  * Cameras are created associating an image sensor (represented by a
  * media entity with function MEDIA_ENT_F_CAM_SENSOR) to one of the four
@@ -172,6 +205,15 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)
 
 		std::string cameraName = sensor->name() + " " + std::to_string(id);
 		std::shared_ptr<Camera> camera = Camera::create(cameraName);
+
+		/* Store pipeline private data in the Camera object. */
+		V4L2Device *videoDev = createVideoDevice(id);
+		if (videoDev) {
+			IPU3CameraData *ipu3Data = new IPU3CameraData();
+			ipu3Data->setV4L2Device(videoDev);
+			camera->setCameraData(ipu3Data);
+		}
+
 		manager->addCamera(std::move(camera));
 
 		LOG(IPU3, Info)
-- 
2.20.1



More information about the libcamera-devel mailing list