From patchwork Mon Sep 30 05:35:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 2069 X-Patchwork-Delegate: paul.elder@ideasonboard.com Return-Path: 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 4D6F96101D for ; Mon, 30 Sep 2019 07:35:36 +0200 (CEST) Received: from neptunite.amanokami.net (unknown [96.44.9.94]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 724B4311; Mon, 30 Sep 2019 07:35:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1569821735; bh=/x5C6zWhUrqEDK1L/f8m6FH6A+YSTtWIQuSEdo0uw04=; h=From:To:Cc:Subject:Date:From; b=QEUyAr3o16HuDVCr/l2Oj5lF38sxVBM89+UrNvSRsR/2EKP64V8uJOCmw8UahxbOV W2oMnBm1dEPGUIEiB2dRsyNCDkBHi6LOi9rjv1fJ3apBoBLg/Fw8qj0dfkgV1gQdra ukQf5cozjFdgY8NXmBTYU0G55eXw4rz2/mdYLgro= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Mon, 30 Sep 2019 01:35:18 -0400 Message-Id: <20190930053520.2711-1-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 1/3] libcamera: pipeline: Add device IDs 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: , X-List-Received-Date: Mon, 30 Sep 2019 05:35:36 -0000 Allow pipeline handlers to declare a list of camera device IDs that they support. This list will eventually be used to check against the list of camera devices that the system has, but have yet to be initialized by the kernel or by udev. PipelineHandlerFactory exposes a static method to retrieve the list of all such camera device IDs from all pipeline handlers. Signed-off-by: Paul Elder --- src/libcamera/include/pipeline_handler.h | 58 +++++++++++++++++++++++- src/libcamera/pipeline/ipu3/ipu3.cpp | 4 +- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 2 +- src/libcamera/pipeline/uvcvideo.cpp | 2 +- src/libcamera/pipeline/vimc.cpp | 2 +- src/libcamera/pipeline_handler.cpp | 16 +++++++ 6 files changed, 79 insertions(+), 5 deletions(-) diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h index 1fdef9ce..f16f37ab 100644 --- a/src/libcamera/include/pipeline_handler.h +++ b/src/libcamera/include/pipeline_handler.h @@ -30,6 +30,48 @@ class MediaDevice; class PipelineHandler; class Request; +class DeviceID +{ +public: + DeviceID(std::string type) + : type_(type){}; + ~DeviceID(){}; + + template + bool compare(const DeviceID &id) const + { + return this->type_.compare(id.type_) || + static_cast(this)->compare(static_cast(id)); + } + + const std::string type_; +}; + +class PCIDeviceID : public DeviceID +{ +public: + PCIDeviceID(uint16_t vendor, uint16_t device) + : DeviceID("pci"), vendor_(vendor), device_(device){}; + ~PCIDeviceID(){}; + + bool compare(const PCIDeviceID &pci) const + { + uint32_t thisID = (vendor_ << 16) + device_; + uint32_t otherID = (pci.vendor_ << 16) + pci.device_; + + return thisID < otherID; + } + + const uint16_t vendor_; + const uint16_t device_; +}; + +template +bool compareDevices(const DeviceID &id1, const DeviceID &id2) +{ + return id1.compare(id2); +} + class CameraData { public: @@ -117,6 +159,10 @@ public: static void registerType(PipelineHandlerFactory *factory); static std::vector &factories(); + static std::vector> &getDeviceIDs(); + +protected: + virtual std::vector &deviceIDs() = 0; private: virtual PipelineHandler *createInstance(CameraManager *manager) = 0; @@ -124,12 +170,22 @@ private: std::string name_; }; -#define REGISTER_PIPELINE_HANDLER(handler) \ +#define P99_PROTECT(...) __VA_ARGS__ + +#define REGISTER_PIPELINE_HANDLER(handler, cameras) \ class handler##Factory final : public PipelineHandlerFactory \ { \ public: \ handler##Factory() : PipelineHandlerFactory(#handler) {} \ \ +protected: \ + std::vector &deviceIDs() \ + { \ + static std::vector handler##Cameras = \ + std::vector(cameras); \ + return handler##Cameras; \ + } \ + \ private: \ PipelineHandler *createInstance(CameraManager *manager) \ { \ diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 827906d5..562ee9fb 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -1504,6 +1504,8 @@ int CIO2Device::mediaBusToFormat(unsigned int code) } } -REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3); +REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3, + P99_PROTECT({ PCIDeviceID(0x8086, 0x1919), + PCIDeviceID(0x8086, 0x9D32) })); } /* namespace libcamera */ diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index de4ab523..85225f9b 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -513,6 +513,6 @@ void PipelineHandlerRkISP1::bufferReady(Buffer *buffer) completeRequest(activeCamera_, request); } -REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1); +REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1, {}); } /* namespace libcamera */ diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp index 89652105..376eb92a 100644 --- a/src/libcamera/pipeline/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo.cpp @@ -390,6 +390,6 @@ void UVCCameraData::bufferReady(Buffer *buffer) pipe_->completeRequest(camera_, request); } -REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC); +REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC, {}); } /* namespace libcamera */ diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp index f26a91f8..75d0236f 100644 --- a/src/libcamera/pipeline/vimc.cpp +++ b/src/libcamera/pipeline/vimc.cpp @@ -459,6 +459,6 @@ void VimcCameraData::bufferReady(Buffer *buffer) pipe_->completeRequest(camera_, request); } -REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc); +REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc, {}); } /* namespace libcamera */ diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 3e54aa23..9113bf18 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -593,6 +593,22 @@ std::vector &PipelineHandlerFactory::factories() return factories; } +std::vector> &PipelineHandlerFactory::getDeviceIDs() +{ + static std::vector> devices; + if (!devices.empty()) + return devices; + + std::vector &factories = PipelineHandlerFactory::factories(); + + for (PipelineHandlerFactory *factory : factories) { + std::vector &factoryDevices = factory->deviceIDs(); + devices.insert(devices.end(), factoryDevices.begin(), factoryDevices.end()); + } + + return devices; +} + /** * \fn PipelineHandlerFactory::createInstance() * \brief Create an instance of the PipelineHandler corresponding to the factory