[libcamera-devel] [PATCH 2/2] libcamera: ipu3: Create CIO2 V4L2 devices

Niklas Söderlund niklas.soderlund at ragnatech.se
Thu Jan 24 20:06:30 CET 2019


Hi Jacopo,

Thanks for your work.

On 2019-01-24 12:30:20 +0100, Jacopo Mondi wrote:
> Create V4L2 devices for the CIO2 capture video nodes and associate them
> with the camera they are part of.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 50 ++++++++++++++++++++++++++++
>  1 file changed, 50 insertions(+)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 8cbc10a..9f5a40f 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -15,6 +15,8 @@
>  #include "log.h"
>  #include "media_device.h"
>  #include "pipeline_handler.h"
> +#include "utils.h"
> +#include "v4l2_device.h"
>  
>  namespace libcamera {
>  
> @@ -29,9 +31,19 @@ public:
>  	bool match(CameraManager *manager, DeviceEnumerator *enumerator);
>  
>  private:
> +	class IPU3CameraData : public CameraData
> +	{
> +	public:
> +		IPU3CameraData()
> +			: dev_(nullptr) { }
> +		~IPU3CameraData() { delete dev_; }
> +		V4L2Device *dev_;
> +	};
> +
>  	MediaDevice *cio2_;
>  	MediaDevice *imgu_;
>  
> +	V4L2Device *createVideoDevice(unsigned int id);
>  	void registerCameras(CameraManager *manager);
>  };
>  
> @@ -122,6 +134,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 +202,26 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)
>  
>  		std::string cameraName = sensor->name() + " " + std::to_string(id);
>  		std::shared_ptr<Camera> camera = Camera::create(cameraName);
> +
> +		setCameraData(camera.get(),
> +			      std::move(utils::make_unique<IPU3CameraData>()));
> +		IPU3CameraData *data =
> +			reinterpret_cast<IPU3CameraData *>(cameraData(camera.get()));

I'm not saying this is not needed, only that it looks a bit complex to 
my feeble mind. Could you educate me why the following would not work?

    IPU3CameraData *data = new IPU3CameraData();
    data->dev_ = videoDev;

    setCameraData(camera.get(), data);

Apart from this I think this commit looks good.

> +
> +		/*
> +		 * If V4L2 device creation fails, the Camera instance won't be
> +		 * registered. The 'camera' shared pointer goes out of scope
> +		 * and deletes the Camera it manages.
> +		 */
> +		V4L2Device *videoDev = createVideoDevice(id);
> +		if (!videoDev) {
> +			LOG(IPU3, Error)
> +				<< "Failed to register camera["
> +				<< numCameras << "] \"" << cameraName << "\"";
> +			continue;
> +		}
> +
> +		data->dev_ = videoDev;
>  		manager->addCamera(std::move(camera));
>  
>  		LOG(IPU3, Info)
> -- 
> 2.20.1
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list