From d3f18625bcc3d69eeb6c951ee8872f99b6077dd3 Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Thu, 24 Jan 2019 11:34:34 +0100 Subject: libcamera: ipu3: Create CIO2 V4L2 devices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create V4L2 devices for the CIO2 capture video nodes and associate them with the camera they are part of. Reviewed-by: Niklas Söderlund Signed-off-by: Jacopo Mondi --- src/libcamera/pipeline/ipu3/ipu3.cpp | 48 ++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 3161e714..d74655d0 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -14,6 +14,8 @@ #include "log.h" #include "media_device.h" #include "pipeline_handler.h" +#include "utils.h" +#include "v4l2_device.h" namespace libcamera { @@ -28,9 +30,19 @@ public: bool match(DeviceEnumerator *enumerator); private: + class IPU3CameraData : public CameraData + { + public: + IPU3CameraData() + : dev_(nullptr) {} + ~IPU3CameraData() { delete dev_; } + V4L2Device *dev_; + }; + std::shared_ptr cio2_; std::shared_ptr imgu_; + V4L2Device *createVideoDevice(unsigned int id); void registerCameras(); }; @@ -118,6 +130,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 @@ -168,6 +198,24 @@ void PipelineHandlerIPU3::registerCameras() std::string cameraName = sensor->name() + " " + std::to_string(id); std::shared_ptr camera = Camera::create(this, cameraName); + + /* + * If V4L2 device creation fails, the Camera instance won't be + * registered. The 'camera' shared pointer goes out of scope + * and deletes the Camera it manages. + */ + V4L2Device *videoDev = createVideoDevice(id); + if (!videoDev) { + LOG(IPU3, Error) + << "Failed to register camera[" + << numCameras << "] \"" << cameraName << "\""; + continue; + } + + IPU3CameraData *data = new IPU3CameraData(); + data->dev_ = videoDev; + setCameraData(camera.get(), + std::move(std::unique_ptr(data))); registerCamera(std::move(camera)); LOG(IPU3, Info) -- cgit v1.2.1