From patchwork Fri Nov 26 15:35:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 14810 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id C4652BF415 for ; Fri, 26 Nov 2021 15:35:47 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id CAC9060543; Fri, 26 Nov 2021 16:35:46 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="bE9KgCj9"; dkim-atps=neutral Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C01C16011E for ; Fri, 26 Nov 2021 16:35:44 +0100 (CET) Received: by mail-wm1-x32d.google.com with SMTP id p27-20020a05600c1d9b00b0033bf8532855so7061455wms.3 for ; Fri, 26 Nov 2021 07:35:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=tAd/+FWYTaYdnufy3EhXNrXYjVtOl7fyDxFM3h6YwaA=; b=bE9KgCj9WS9qM5x5MQdHimkwp2b/jVaxX/XF/vAiU+up2TYd04NDL7eEPNy7bz/27U pfZFcvU/tCyitfblaU8+r8yESsFc+aUE1kXNmx+VuNzSOexsXg4ju6p4jTNUZiZIdzZx pTJvxugzj5ijtbg/U1sNDxNeRTDTlRpya2LHQvlrFJ0PunrqyZhzmvAOD8g6pPclFQbL 8P7PhUAtO4cUQN+cs3X4pN4bBSYyFwYBqff5GOwmN/qZvJfKP4u6brFgnqRhqZqhBa+r K2v2YuadGkSzgl9BDzbU8VHbieIC25Wh9XDnBf0qQGqthPuGeqSxm4Jlcb84iMcK0lKS XEBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=tAd/+FWYTaYdnufy3EhXNrXYjVtOl7fyDxFM3h6YwaA=; b=zUN4EXaa7N0JhxmC7bHVL0/PMgQnXExv+4DhRhKAWQXCt6dsK6zSy3YRmbo+/0osb4 rToZb1SoQ2dNv1blN5Q5HrZ+pKFfeUY1bjGdXjNjHsqFQR28J9V5JYpwivbcw0BURJ4H ku3DQ75I7B/7YNTwtqcyERHGqdz2BvFspUnlcpTsTZ0h7x4V6t73OZwQxOwJTJsMCVk8 wKN/9gUYypIA3iWFsX/n99tatCv1R/Ws2zLW+W3b/Tk1ZJt/IMAVZjzKyxRiANuACQGQ ZEkK9Xw9PmXqoBnRfGb8T5Np43Y9MWhyx+Jiy3NK37qNV2yu+PHj0hstngT2s38MYkQk yJMA== X-Gm-Message-State: AOAM530LV00NjK76MdPNt67ZMvwWB/XG3m/YhJRSiiHLD9r+33lSBF36 h1g7Q8HJT7W4yTDMBIUT815qLAZdfoFh51zE X-Google-Smtp-Source: ABdhPJxPtzomvQuWWLRFIJX3yzxEbMtqTwqf2PFQdBqsdMkwazVwDGp6pLJR9VvYl6RsZiCH6LWPWA== X-Received: by 2002:a1c:9d03:: with SMTP id g3mr15716526wme.143.1637940944130; Fri, 26 Nov 2021 07:35:44 -0800 (PST) Received: from naush-laptop.pitowers.org ([2a00:1098:3142:14:89da:d0c:9f56:bbfc]) by smtp.gmail.com with ESMTPSA id p14sm10591272wms.29.2021.11.26.07.35.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Nov 2021 07:35:43 -0800 (PST) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Nov 2021 15:35:37 +0000 Message-Id: <20211126153538.2594702-1-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 1/2] pipeline: raspberrypi: Split out device enumeration and camera registration X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Split out PipelineHandlerRPi::match() so that media device enumeration and acquisition is separated from camera registration. The former logic remains in PipelineHandlerRPi::match(), whereas the latter logic is moved into a new PipelineHandlerRPi::registerCamera() member function. Signed-off-by: Naushir Patuck Reviewed-by: Laurent Pinchart Reviewed-by: Kieran Bingham --- src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index ad526a8be6a2..5a6dfa4e8b2a 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -314,6 +314,7 @@ private: return static_cast(camera->_d()); } + bool registerCamera(); int queueAllBuffers(Camera *camera); int prepareBuffers(Camera *camera); void freeBuffers(Camera *camera); @@ -1013,6 +1014,11 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator) if (!isp_) return false; + return registerCamera(); +} + +bool PipelineHandlerRPi::registerCamera() +{ std::unique_ptr data = std::make_unique(this); if (!data->dmaHeap_.isValid()) return false; @@ -1173,7 +1179,7 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator) const std::string &id = data->sensor_->id(); std::shared_ptr camera = Camera::create(std::move(data), id, streams); - registerCamera(std::move(camera)); + PipelineHandler::registerCamera(std::move(camera)); return true; } From patchwork Fri Nov 26 15:35:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 14811 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 05923BF415 for ; Fri, 26 Nov 2021 15:35:50 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B319760559; Fri, 26 Nov 2021 16:35:49 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="r7PFpsO0"; dkim-atps=neutral Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C60286011E for ; Fri, 26 Nov 2021 16:35:45 +0100 (CET) Received: by mail-wm1-x32d.google.com with SMTP id k37-20020a05600c1ca500b00330cb84834fso11003862wms.2 for ; Fri, 26 Nov 2021 07:35:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=9UvufzJ/yJE+8hSE0cgIFM2u970E24snpZO91WK9W18=; b=r7PFpsO0yT5D4cekfMSGLJvj/GttQCdpDayiqA4wsFutQnTV3x6BjUY0CrokfVNrjC 19VGZHFWMIGKx+ECbHi0JKfwJWUr/bpVhnYIyTVunw9DgtlRRRc1AMNm4LZsr5uVje5G hRSmwCxDn6o+PT41ex9QkL36vsgUaPg2g9ZsVVwMUXaqMwJpxReDP0Trg+P1SGMdM63O AY260ZDQevsCCPcGaM8oFK8n6m7dmHpMXhTnAHk1fRNKtnaUBueWMZrZe2mCLwQn4SBy aHo83bPML7giq2fnOWzGwjvdTLXOGGkXoEdMnDJCn1VtEZMJV7LK+f/+sIIgUEjsGDfp 7NrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=9UvufzJ/yJE+8hSE0cgIFM2u970E24snpZO91WK9W18=; b=Wmk/ckEMSHc3LyK4xMkurXQ6zNzcDdXdmoWaSj0XyIRnn82GUThwvr20n0wRYsrq9D YiRlsdgsxNBqRDV80IdGl//2ILc9xtk163VKoAN716hHvThg1mZpu2pC3xd1Y98HAGBl amj8i2T3zkO4QZHVDToLoB58lzsbeQ6pLkpUrayNTboGPwUdLwMl3rI1ErkuElPHz9aS ox+haEgkID6gSegA9uZzGmxE9qyXjnrgoOIrnnH38WT7O0KrPk9SSwJcAu4kgDyvFFVe Acg08GIuQEb+HBXb24KPRYpaiPi69X2qcl4QnofXRFIQRt0EF5OUbDohQ5lAaXJEbf4x AENA== X-Gm-Message-State: AOAM530f99aAK+tdVsFLlK2OzLEFE4w8Tq2Fs+46okLP0W43OjSdp5Pf Kw1tFU10u/28GBG54Hj4t6cezYYutvC6sK5/ X-Google-Smtp-Source: ABdhPJwfT39Fv4wlyO1Vw7aPUj12B4NQ7OrzyaYRwTdkFDk+kvhGaaK9Yp0NEaI7DgzUl2LCk9b59w== X-Received: by 2002:a1c:98ca:: with SMTP id a193mr16192526wme.162.1637940945149; Fri, 26 Nov 2021 07:35:45 -0800 (PST) Received: from naush-laptop.pitowers.org ([2a00:1098:3142:14:89da:d0c:9f56:bbfc]) by smtp.gmail.com with ESMTPSA id p14sm10591272wms.29.2021.11.26.07.35.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Nov 2021 07:35:44 -0800 (PST) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Nov 2021 15:35:38 +0000 Message-Id: <20211126153538.2594702-2-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211126153538.2594702-1-naush@raspberrypi.com> References: <20211126153538.2594702-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 2/2] pipeline: raspberrypi: Tidy the camera enumeration and registration logic X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" When acquiring the media device, it is not necessary to match all entity names, so remove it. Aditionally, we do not need to keep the MediaEntity pointers for the Unicam and ISP devices stored within the PipelineHandlerRPi class. Instead these can be stored locally in PipelineHandlerRPi::match(). PipelineHandlerRPi::registerCamera() now returns an int error code instead of a boolean for pass/fail. Signed-off-by: Naushir Patuck Reviewed-by: Laurent Pinchart Reviewed-by: Kieran Bingham --- .../pipeline/raspberrypi/raspberrypi.cpp | 89 +++++++++++-------- 1 file changed, 52 insertions(+), 37 deletions(-) diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index 5a6dfa4e8b2a..e31fa3b23859 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -314,14 +314,11 @@ private: return static_cast(camera->_d()); } - bool registerCamera(); + int registerCamera(MediaDevice *unicam, MediaDevice *isp); int queueAllBuffers(Camera *camera); int prepareBuffers(Camera *camera); void freeBuffers(Camera *camera); void mapBuffers(Camera *camera, const RPi::BufferMap &buffers, unsigned int mask); - - MediaDevice *unicam_; - MediaDevice *isp_; }; RPiCameraConfiguration::RPiCameraConfiguration(const RPiCameraData *data) @@ -512,7 +509,7 @@ CameraConfiguration::Status RPiCameraConfiguration::validate() } PipelineHandlerRPi::PipelineHandlerRPi(CameraManager *manager) - : PipelineHandler(manager), unicam_(nullptr), isp_(nullptr) + : PipelineHandler(manager) { } @@ -997,48 +994,62 @@ int PipelineHandlerRPi::queueRequestDevice(Camera *camera, Request *request) bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator) { DeviceMatch unicam("unicam"); - DeviceMatch isp("bcm2835-isp"); + MediaDevice *unicamDevice = acquireMediaDevice(enumerator, unicam); - unicam.add("unicam-image"); + if (!unicamDevice) { + LOG(RPI, Debug) << "Unable to acquire a Unicam instance"; + return false; + } - isp.add("bcm2835-isp0-output0"); /* Input */ - isp.add("bcm2835-isp0-capture1"); /* Output 0 */ - isp.add("bcm2835-isp0-capture2"); /* Output 1 */ - isp.add("bcm2835-isp0-capture3"); /* Stats */ + DeviceMatch isp("bcm2835-isp"); + MediaDevice *ispDevice = acquireMediaDevice(enumerator, isp); - unicam_ = acquireMediaDevice(enumerator, unicam); - if (!unicam_) + if (!ispDevice) { + LOG(RPI, Debug) << "Unable to acquire ISP instance"; return false; + } - isp_ = acquireMediaDevice(enumerator, isp); - if (!isp_) + int ret = registerCamera(unicamDevice, ispDevice); + if (ret) { + LOG(RPI, Error) << "Failed to register camera: " << ret; return false; + } - return registerCamera(); + return true; } -bool PipelineHandlerRPi::registerCamera() +int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp) { std::unique_ptr data = std::make_unique(this); + if (!data->dmaHeap_.isValid()) - return false; + return -ENOMEM; + + MediaEntity *unicamImage = unicam->getEntityByName("unicam-image"); + MediaEntity *ispOutput0 = isp->getEntityByName("bcm2835-isp0-output0"); + MediaEntity *ispCapture1 = isp->getEntityByName("bcm2835-isp0-capture1"); + MediaEntity *ispCapture2 = isp->getEntityByName("bcm2835-isp0-capture2"); + MediaEntity *ispCapture3 = isp->getEntityByName("bcm2835-isp0-capture3"); + + if (!unicamImage || !ispOutput0 || !ispCapture1 || !ispCapture2 || !ispCapture3) + return -ENOENT; /* Locate and open the unicam video streams. */ - data->unicam_[Unicam::Image] = RPi::Stream("Unicam Image", unicam_->getEntityByName("unicam-image")); + data->unicam_[Unicam::Image] = RPi::Stream("Unicam Image", unicamImage); /* An embedded data node will not be present if the sensor does not support it. */ - MediaEntity *embeddedEntity = unicam_->getEntityByName("unicam-embedded"); - if (embeddedEntity) { - data->unicam_[Unicam::Embedded] = RPi::Stream("Unicam Embedded", embeddedEntity); + MediaEntity *unicamEmbedded = unicam->getEntityByName("unicam-embedded"); + if (unicamEmbedded) { + data->unicam_[Unicam::Embedded] = RPi::Stream("Unicam Embedded", unicamEmbedded); data->unicam_[Unicam::Embedded].dev()->bufferReady.connect(data.get(), &RPiCameraData::unicamBufferDequeue); } /* Tag the ISP input stream as an import stream. */ - data->isp_[Isp::Input] = RPi::Stream("ISP Input", isp_->getEntityByName("bcm2835-isp0-output0"), true); - data->isp_[Isp::Output0] = RPi::Stream("ISP Output0", isp_->getEntityByName("bcm2835-isp0-capture1")); - data->isp_[Isp::Output1] = RPi::Stream("ISP Output1", isp_->getEntityByName("bcm2835-isp0-capture2")); - data->isp_[Isp::Stats] = RPi::Stream("ISP Stats", isp_->getEntityByName("bcm2835-isp0-capture3")); + data->isp_[Isp::Input] = RPi::Stream("ISP Input", ispOutput0, true); + data->isp_[Isp::Output0] = RPi::Stream("ISP Output0", ispCapture1); + data->isp_[Isp::Output1] = RPi::Stream("ISP Output1", ispCapture2); + data->isp_[Isp::Stats] = RPi::Stream("ISP Stats", ispCapture3); /* Wire up all the buffer connections. */ data->unicam_[Unicam::Image].dev()->frameStart.connect(data.get(), &RPiCameraData::frameStarted); @@ -1049,7 +1060,7 @@ bool PipelineHandlerRPi::registerCamera() data->isp_[Isp::Stats].dev()->bufferReady.connect(data.get(), &RPiCameraData::ispOutputDequeue); /* Identify the sensor. */ - for (MediaEntity *entity : unicam_->entities()) { + for (MediaEntity *entity : unicam->entities()) { if (entity->function() == MEDIA_ENT_F_CAM_SENSOR) { data->sensor_ = std::make_unique(entity); break; @@ -1057,23 +1068,23 @@ bool PipelineHandlerRPi::registerCamera() } if (!data->sensor_) - return false; + return -EINVAL; if (data->sensor_->init()) - return false; + return -EINVAL; data->sensorFormats_ = populateSensorFormats(data->sensor_); ipa::RPi::SensorConfig sensorConfig; if (data->loadIPA(&sensorConfig)) { LOG(RPI, Error) << "Failed to load a suitable IPA library"; - return false; + return -EINVAL; } - if (sensorConfig.sensorMetadata ^ !!embeddedEntity) { + if (sensorConfig.sensorMetadata ^ !!unicamEmbedded) { LOG(RPI, Warning) << "Mismatch between Unicam and CamHelper for embedded data usage!"; sensorConfig.sensorMetadata = false; - if (embeddedEntity) + if (unicamEmbedded) data->unicam_[Unicam::Embedded].dev()->bufferReady.disconnect(); } @@ -1093,13 +1104,14 @@ bool PipelineHandlerRPi::registerCamera() data->streams_.push_back(&stream); for (auto stream : data->streams_) { - if (stream->dev()->open()) - return false; + int ret = stream->dev()->open(); + if (ret) + return ret; } if (!data->unicam_[Unicam::Image].dev()->caps().hasMediaController()) { LOG(RPI, Error) << "Unicam driver does not use the MediaController, please update your kernel!"; - return false; + return -EINVAL; } /* @@ -1161,7 +1173,7 @@ bool PipelineHandlerRPi::registerCamera() if (!bayerFormat.isValid()) { LOG(RPI, Error) << "No Bayer format found"; - return false; + return -EINVAL; } data->nativeBayerOrder_ = bayerFormat.order; @@ -1181,7 +1193,10 @@ bool PipelineHandlerRPi::registerCamera() Camera::create(std::move(data), id, streams); PipelineHandler::registerCamera(std::move(camera)); - return true; + LOG(RPI, Info) << "Registered camera " << id + << " to Unicam device " << unicam->deviceNode() + << " and ISP device " << isp->deviceNode(); + return 0; } int PipelineHandlerRPi::queueAllBuffers(Camera *camera)