Patch Detail
Show a patch.
GET /api/patches/18306/?format=api
{ "id": 18306, "url": "https://patchwork.libcamera.org/api/patches/18306/?format=api", "web_url": "https://patchwork.libcamera.org/patch/18306/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<mailman.19.1677223831.25031.libcamera-devel@lists.libcamera.org>", "date": "2023-02-24T07:30:23", "name": "[libcamera-devel] pipeline: raspberrypi: Iterate over all Unicam instances in match()", "commit_ref": "2a261d911f50d925be7b8921c1af58cde8a7f545", "pull_url": null, "state": "accepted", "archived": false, "hash": "c5484a7a7fa111ba020f46c63eb2db22f9c1fdd4", "submitter": { "id": 34, "url": "https://patchwork.libcamera.org/api/people/34/?format=api", "name": "Naushir Patuck", "email": "naush@raspberrypi.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/18306/mbox/", "series": [ { "id": 3767, "url": "https://patchwork.libcamera.org/api/series/3767/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3767", "date": "2023-02-24T07:30:23", "name": "[libcamera-devel] pipeline: raspberrypi: Iterate over all Unicam instances in match()", "version": 1, "mbox": "https://patchwork.libcamera.org/series/3767/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/18306/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/18306/checks/", "tags": {}, "headers": { "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>", "X-Original-To": "parsemail@patchwork.libcamera.org", "Delivered-To": "parsemail@patchwork.libcamera.org", "Received": [ "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 591B6BDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Feb 2023 07:30:33 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C1DC76261A;\n\tFri, 24 Feb 2023 08:30:32 +0100 (CET)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1677223832;\n\tbh=/Igy0YN7Y2TAwXL2qhQQmGdqzCAivCVVQ0paQVWnQNY=;\n\th=To:Date:List-Id:List-Post:From:List-Subscribe:List-Unsubscribe:\n\tList-Archive:Reply-To:List-Help:Subject:From;\n\tb=TCFD00IurRWgJlgcYHClE6er4LgDw5Azo4D1NmhiIg13NBBCKXO4vFOistFz62RX6\n\tQ09OJF4m31BQtfdmKKUSh6xERFzTEuWwDbkKDiKFQQ4OE8m1CRtMDdGrEBsuVavb9W\n\tQs5CIgsP/AVOh3FZ8H7gHQgwakbKasbzTCGv4lrO0PvkQHiqsrGvNRExl1IEWA9If8\n\t0pTUMKOMHbf5zzm/UhgUDaSVxAdy7vapd/3pwp8fz+ywwYz3nt0lMCtFTlPY2yS+4n\n\t1DY75ioxhSChyFzbyZkncII1rGpTM6Hi6VXIlFPDZJeKjHbZItRXXUA0peWLz3V+k+\n\tvs4enh37Xp7zw==", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 24 Feb 2023 07:30:23 +0000", "MIME-Version": "1.0", "Message-ID": "<mailman.19.1677223831.25031.libcamera-devel@lists.libcamera.org>", "List-Id": "<libcamera-devel.lists.libcamera.org>", "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>", "From": "Naushir Patuck via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>", "Precedence": "list", "X-Mailman-Version": "2.1.29", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>", "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>", "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>", "Reply-To": "Naushir Patuck <naush@raspberrypi.com>", "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>", "Subject": "[libcamera-devel] [PATCH] pipeline: raspberrypi: Iterate over all\n\tUnicam instances in match()", "Content-Type": "message/rfc822", "Content-Disposition": "inline", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "On Raspberry Pi Compute Module platforms, it is possible to attach a\nsingle camera device only to the secondary Unicam port. The current\nlogic of PipelineHandlerRPi::match() will return a failure during\nenumeration of the first Unicam media device (due to no sensor attached,\nor sensor failure) and thus the second Unicam media device will never be\nenumerated.\n\nFix this by looping over all Unicam instances in PipelineHandlerRPi::match()\nuntil a camera is correctly registered, or return a failure otherwise.\n\nReported-on: https://github.com/raspberrypi/libcamera/issues/44\nSigned-off-by: Naushir Patuck <naush@raspberrypi.com>\n---\n .../pipeline/raspberrypi/raspberrypi.cpp | 67 +++++++++++--------\n 1 file changed, 40 insertions(+), 27 deletions(-)", "diff": "diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\nindex 841209548350..ef01b7e166ba 100644\n--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n@@ -1246,41 +1246,54 @@ int PipelineHandlerRPi::queueRequestDevice(Camera *camera, Request *request)\n \n bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator)\n {\n-\tDeviceMatch unicam(\"unicam\");\n-\tMediaDevice *unicamDevice = acquireMediaDevice(enumerator, unicam);\n+\tconstexpr unsigned int numUnicamDevices = 2;\n \n-\tif (!unicamDevice) {\n-\t\tLOG(RPI, Debug) << \"Unable to acquire a Unicam instance\";\n-\t\treturn false;\n-\t}\n+\t/*\n+\t * Loop over all Unicam instances, but return out once a match is found.\n+\t * This is to ensure we correctly enumrate the camera when an instance\n+\t * of Unicam has registered with media controller, but has not registered\n+\t * device nodes due to a sensor subdevice failure.\n+\t */\n+\tfor (unsigned int i = 0; i < numUnicamDevices; i++) {\n+\t\tDeviceMatch unicam(\"unicam\");\n+\t\tMediaDevice *unicamDevice = acquireMediaDevice(enumerator, unicam);\n \n-\tDeviceMatch isp(\"bcm2835-isp\");\n-\tMediaDevice *ispDevice = acquireMediaDevice(enumerator, isp);\n+\t\tif (!unicamDevice) {\n+\t\t\tLOG(RPI, Debug) << \"Unable to acquire a Unicam instance\";\n+\t\t\tcontinue;\n+\t\t}\n \n-\tif (!ispDevice) {\n-\t\tLOG(RPI, Debug) << \"Unable to acquire ISP instance\";\n-\t\treturn false;\n-\t}\n+\t\tDeviceMatch isp(\"bcm2835-isp\");\n+\t\tMediaDevice *ispDevice = acquireMediaDevice(enumerator, isp);\n \n-\t/*\n-\t * The loop below is used to register multiple cameras behind one or more\n-\t * video mux devices that are attached to a particular Unicam instance.\n-\t * Obviously these cameras cannot be used simultaneously.\n-\t */\n-\tunsigned int numCameras = 0;\n-\tfor (MediaEntity *entity : unicamDevice->entities()) {\n-\t\tif (entity->function() != MEDIA_ENT_F_CAM_SENSOR)\n+\t\tif (!ispDevice) {\n+\t\t\tLOG(RPI, Debug) << \"Unable to acquire ISP instance\";\n \t\t\tcontinue;\n+\t\t}\n \n-\t\tint ret = registerCamera(unicamDevice, ispDevice, entity);\n-\t\tif (ret)\n-\t\t\tLOG(RPI, Error) << \"Failed to register camera \"\n-\t\t\t\t\t<< entity->name() << \": \" << ret;\n-\t\telse\n-\t\t\tnumCameras++;\n+\t\t/*\n+\t\t * The loop below is used to register multiple cameras behind one or more\n+\t\t * video mux devices that are attached to a particular Unicam instance.\n+\t\t * Obviously these cameras cannot be used simultaneously.\n+\t\t */\n+\t\tunsigned int numCameras = 0;\n+\t\tfor (MediaEntity *entity : unicamDevice->entities()) {\n+\t\t\tif (entity->function() != MEDIA_ENT_F_CAM_SENSOR)\n+\t\t\t\tcontinue;\n+\n+\t\t\tint ret = registerCamera(unicamDevice, ispDevice, entity);\n+\t\t\tif (ret)\n+\t\t\t\tLOG(RPI, Error) << \"Failed to register camera \"\n+\t\t\t\t\t\t<< entity->name() << \": \" << ret;\n+\t\t\telse\n+\t\t\t\tnumCameras++;\n+\t\t}\n+\n+\t\tif (numCameras)\n+\t\t\treturn true;\n \t}\n \n-\treturn !!numCameras;\n+\treturn false;\n }\n \n void PipelineHandlerRPi::releaseDevice(Camera *camera)\n", "prefixes": [ "libcamera-devel" ] }