From patchwork Tue Jan 22 18:12:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 327 Return-Path: Received: from relay11.mail.gandi.net (relay11.mail.gandi.net [217.70.178.231]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4539B60C65 for ; Tue, 22 Jan 2019 19:12:24 +0100 (CET) Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay11.mail.gandi.net (Postfix) with ESMTPSA id CE9F8100008; Tue, 22 Jan 2019 18:12:23 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Tue, 22 Jan 2019 19:12:25 +0100 Message-Id: <20190122181225.12922-3-jacopo@jmondi.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122181225.12922-1-jacopo@jmondi.org> References: <20190122181225.12922-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC 2/2] libcamera: ipu3: Create CIO2 V4L2 devices X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Jan 2019 18:12:24 -0000 Create V4L2 devices for the CIO2 capture video nodes. Signed-off-by: Jacopo Mondi --- 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::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)