From patchwork Tue Sep 22 13:35:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 9731 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 87DB5BF01C for ; Tue, 22 Sep 2020 13:39:04 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 54E3962FD6; Tue, 22 Sep 2020 15:39:04 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="TfJLTHy1"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id EEEE760576 for ; Tue, 22 Sep 2020 15:39:02 +0200 (CEST) Received: from pyrite.rasen.tech (unknown [IPv6:2400:4051:61:600:2c71:1b79:d06d:5032]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A9E6F2D7; Tue, 22 Sep 2020 15:38:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1600781938; bh=o82ssDhJbSHJCEIxtLwqPv+vJyHfuHIZeMEXXT2WbJA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TfJLTHy1zpjPmU8W9dr+/+UsSzArJHZ+pFrgQ3bkB5H/Sv8wL7IRxQwBsZr+fF9Xo OLh+OZR0v7t9Fo3a5YIzAD+DxmmUxGPjFoNEQqYnvtpkYZYR2cHED1TiVGobBprMAQ cihn+0XNKjm0CidcnezDIkIVE0hqp1BWezxLKpfI= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Tue, 22 Sep 2020 22:35:26 +0900 Message-Id: <20200922133537.258098-28-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200922133537.258098-1-paul.elder@ideasonboard.com> References: <20200922133537.258098-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 27/38] ipa: raspberrypi: Add mojom data definition file 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" Add a mojom data definition for raspberrypi pipeline handler's IPAs. This is a direct translation of what the raspberrypi pipeline handler and IPA was using before with IPAOperationData. Also move the enums from raspberrypi.h to raspberrypi.mojom Signed-off-by: Paul Elder --- Changes in v2: - rebased on "libcamera: pipeline: ipa: raspberrypi: Rework drop frame signalling" - add license - move generic documentation to core.mojom - move documentation from IPA interface - customize the RPi IPA interface to make the pipeline and IPA code cleaner --- include/libcamera/ipa/meson.build | 4 +- include/libcamera/ipa/raspberrypi.h | 18 --- include/libcamera/ipa/raspberrypi.mojom | 157 ++++++++++++++++++++++++ 3 files changed, 160 insertions(+), 19 deletions(-) create mode 100644 include/libcamera/ipa/raspberrypi.mojom diff --git a/include/libcamera/ipa/meson.build b/include/libcamera/ipa/meson.build index 9ec38198..0b74bc10 100644 --- a/include/libcamera/ipa/meson.build +++ b/include/libcamera/ipa/meson.build @@ -23,7 +23,9 @@ ipa_mojom_core = custom_target(core_mojom_file.split('.')[0] + '_mojom_module', '--mojoms', '@INPUT@' ]) -ipa_mojom_files = [] +ipa_mojom_files = [ + 'raspberrypi.mojom', +] ipa_mojoms = [] diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h index dd6ebeac..4e38d009 100644 --- a/include/libcamera/ipa/raspberrypi.h +++ b/include/libcamera/ipa/raspberrypi.h @@ -10,24 +10,6 @@ #include #include -enum RPiConfigParameters { - RPI_IPA_CONFIG_LS_TABLE = (1 << 0), - RPI_IPA_CONFIG_STAGGERED_WRITE = (1 << 1), - RPI_IPA_CONFIG_SENSOR = (1 << 2), - RPI_IPA_CONFIG_DROP_FRAMES = (1 << 3), -}; - -enum RPiOperations { - RPI_IPA_ACTION_V4L2_SET_STAGGERED = 1, - RPI_IPA_ACTION_V4L2_SET_ISP, - RPI_IPA_ACTION_STATS_METADATA_COMPLETE, - RPI_IPA_ACTION_RUN_ISP, - RPI_IPA_ACTION_EMBEDDED_COMPLETE, - RPI_IPA_EVENT_SIGNAL_STAT_READY, - RPI_IPA_EVENT_SIGNAL_ISP_PREPARE, - RPI_IPA_EVENT_QUEUE_REQUEST, -}; - enum RPiBufferMask { ID = 0x00ffff, STATS = 0x010000, diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom new file mode 100644 index 00000000..1573f818 --- /dev/null +++ b/include/libcamera/ipa/raspberrypi.mojom @@ -0,0 +1,157 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +import "include/libcamera/ipa/core.mojom"; + +interface IPARPiInterface { +/** + * \fn init() + * \brief Initialise the IPAInterface + * \param[in] settings The IPA initialization settings + * + * This function initializes the IPA interface. It shall be called before any + * other function of the IPAInterface. The \a settings carry initialization + * parameters that are valid for the whole life time of the IPA interface. + */ + init(IPASettings settings) => (int32 ret); + +/** + * \fn start() + * \brief Start the IPA + * + * This method informs the IPA module that the camera is about to be started. + * The IPA module shall prepare any resources it needs to operate. + * + * \return 0 on success or a negative error code otherwise + */ + start() => (int32 ret); + +/** + * \fn stop() + * \brief Stop the IPA + * + * This method informs the IPA module that the camera is stopped. The IPA module + * shall release resources prepared in start(). + */ + stop(); + +/** + * \fn configure() + * \brief Configure the IPA stream and sensor settings + * \param[in] sensorInfo Camera sensor information + * \param[in] streamConfig Configuration of all active streams + * \param[in] entityControls Controls provided by the pipeline entities + * \param[in] ipaConfig Pipeline-handler-specific configuration data + * \param[out] result Pipeline-handler-specific configuration result + * + * This method shall be called when the camera is started to inform the IPA of + * the camera's streams and the sensor settings. The meaning of the numerical + * keys in the \a streamConfig and \a entityControls maps is defined by the IPA + * protocol. + * + * The \a sensorInfo conveys information about the camera sensor settings that + * the pipeline handler has selected for the configuration. The IPA may use + * that information to tune its algorithms. + * + * The \a ipaConfig and \a result parameters carry custom data passed by the + * pipeline handler to the IPA and back. The pipeline handler may set the \a + * result parameter to null if the IPA protocol doesn't need to pass a result + * back through the configure() function. + */ + configure(CameraSensorInfo sensorInfo, + map streamConfig, + map entityControls, + RPiConfigInput ipaConfig) + => (RPiConfigOutput results); + + // arrays get turned into vectors + +/** + * \fn mapBuffers() + * \brief Map buffers shared between the pipeline handler and the IPA + * \param[in] buffers List of buffers to map + * + * This method informs the IPA module of memory buffers set up by the pipeline + * handler that the IPA needs to access. It provides dmabuf file handles for + * each buffer, and associates the buffers with unique numerical IDs. + * + * IPAs shall map the dmabuf file handles to their address space and keep a + * cache of the mappings, indexed by the buffer numerical IDs. The IDs are used + * in all other IPA interface methods to refer to buffers, including the + * unmapBuffers() method. + * + * All buffers that the pipeline handler wishes to share with an IPA shall be + * mapped with this method. Buffers may be mapped all at once with a single + * call, or mapped and unmapped dynamically at runtime, depending on the IPA + * protocol. Regardless of the protocol, all buffers mapped at a given time + * shall have unique numerical IDs. + * + * The numerical IDs have no meaning defined by the IPA interface, and IPA + * protocols shall not give them any specific meaning either. They should be + * treated as opaque handles by IPAs, with the only exception that ID zero is + * invalid. + * + * \sa unmapBuffers() + * + * \todo Provide a generic implementation of mapBuffers and unmapBuffers for + * IPAs + */ + mapBuffers(array buffers); + +/** + * \fn unmapBuffers() + * \brief Unmap buffers shared by the pipeline to the IPA + * \param[in] ids List of buffer IDs to unmap + * + * This method removes mappings set up with mapBuffers(). Buffers may be + * unmapped all at once with a single call, or selectively at runtime, depending + * on the IPA protocol. Numerical IDs of unmapped buffers may be reused when + * mapping new buffers. + * + * \sa mapBuffers() + */ + unmapBuffers(array ids); + + [async] signalStatReady(uint32 bufferId); + [async] signalQueueRequest(ControlList controls); + [async] signalIspPrepare(RPiIspPreparePayload data); +}; + +interface IPARPiCallbackInterface { + statsMetadataComplete(uint32 bufferId, ControlList controls); + runIsp(uint32 bufferId); + embeddedComplete(uint32 bufferId); + setIsp(ControlList controls); + setStaggered(ControlList controls); +}; + + +enum RPiConfigParameters { + RPI_IPA_CONFIG_LS_TABLE = 0x01, + RPI_IPA_CONFIG_STAGGERED_WRITE = 0x02, + RPI_IPA_CONFIG_SENSOR = 0x04, + RPI_IPA_CONFIG_DROP_FRAMES = 0x08, +}; + +struct RPiStaggeredWritePayload { + uint32 gainDelay; + uint32 exposureDelay; + uint32 sensorMetadata; +}; + +struct RPiIspPreparePayload { + uint32 embeddedbufferId; + uint32 bayerbufferId; +}; + +struct RPiConfigInput { + uint32 op; + FileDescriptor lsTableHandle; + int32 lsTableHandleStatic = -1; +}; + +struct RPiConfigOutput { + uint32 op; + RPiStaggeredWritePayload staggeredWriteResult; + ControlList controls; + int32 dropFrameCount; +};