| /* SPDX-License-Identifier: LGPL-2.1-or-later */ | |
| /* | |
| * Copyright (C) 2021, Google Inc. | |
| * | |
| * camera_lens.cpp - A camera lens | |
| */ | |
| #include "libcamera/internal/camera_lens.h" | |
| #include <libcamera/base/utils.h> | |
| #include "libcamera/internal/v4l2_subdevice.h" | |
| /** | |
| * \file camera_lens.h | |
| * \brief A camera lens controller | |
| */ | |
| namespace libcamera { | |
| LOG_DEFINE_CATEGORY(CameraLens) | |
| /** | |
| * \class CameraLens | |
| * \brief A camera lens based on V4L2 subdevices | |
| * | |
| * The CameraLens class eases handling of lens for pipeline handlers by | |
| * hiding the details of the V4L2 subdevice kernel API and caching lens | |
| * information. | |
| */ | |
| /** | |
| * \brief Construct a CameraLens | |
| * \param[in] entity The media entity backing the camera lens controller | |
| * | |
| * Once constructed the instance must be initialized with init(). | |
| */ | |
| CameraLens::CameraLens(const MediaEntity *entity) | |
| : entity_(entity) | |
| { | |
| } | |
| /** | |
| * \brief Destroy a CameraLens | |
| */ | |
| CameraLens::~CameraLens() = default; | |
| /** | |
| * \brief Initialize the camera lens instance | |
| * | |
| * This function performs the initialisation steps of the CameraLens that may | |
| * fail. It shall be called once and only once after constructing the instance. | |
| * | |
| * \return 0 on success or a negative error code otherwise | |
| */ | |
| int CameraLens::init() | |
| { | |
| if (entity_->function() != MEDIA_ENT_F_LENS) { | |
| LOG(CameraLens, Error) | |
| << "Invalid lens function " | |
| << utils::hex(entity_->function()); | |
| return -EINVAL; | |
| } | |
| /* Create and open the subdev. */ | |
| subdev_ = std::make_unique<V4L2Subdevice>(entity_); | |
| int ret = subdev_->open(); | |
| if (ret < 0) | |
| return ret; | |
| ret = validateLensDriver(); | |
| if (ret) | |
| return ret; | |
| model_ = subdev_->model(); | |
| return 0; | |
| } | |
| int CameraLens::open() | |
| { | |
| return subdev_->open(); | |
| } | |
| int CameraLens::close() | |
| { | |
| subdev_->close(); | |
| return 0; | |
| } | |
| /** | |
| * \brief This function sets the focal point of the lens to a specific position. | |
| * \param[in] position The focal point of the lens | |
| * | |
| * This function sets the value of focal point of the lens as in \a position. | |
| * | |
| * \return 0 on success or -EINVAL otherwise | |
| */ | |
| int CameraLens::setFocusPosition(int32_t position) | |
| { | |
| ControlList lensCtrls(subdev_->controls()); | |
| lensCtrls.set(V4L2_CID_FOCUS_ABSOLUTE, static_cast<int32_t>(position)); | |
| if (subdev_->setControls(&lensCtrls)) | |
| return -EINVAL; | |
| return 0; | |
| } | |
| int CameraLens::validateLensDriver() | |
| { | |
| int ret = 0; | |
| static constexpr uint32_t mandatoryControls[] = { | |
| V4L2_CID_FOCUS_ABSOLUTE, | |
| }; | |
| const ControlInfoMap &controls = subdev_->controls(); | |
| for (uint32_t ctrl : mandatoryControls) { | |
| if (!controls.count(ctrl)) { | |
| LOG(CameraLens, Error) | |
| << "Mandatory V4L2 control " << utils::hex(ctrl) | |
| << " not available"; | |
| ret = -EINVAL; | |
| } | |
| } | |
| if (ret) { | |
| LOG(CameraLens, Error) | |
| << "The lens kernel driver needs to be fixed"; | |
| LOG(CameraLens, Error) | |
| << "See Documentation/lens_driver_requirements.rst in" | |
| << " the libcamera sources for more information"; | |
| return ret; | |
| } | |
| return ret; | |
| } | |
| /** | |
| * \fn CameraLens::model() | |
| * \brief Retrieve the lens model name | |
| * | |
| * The lens model name is a free-formed string that uniquely identifies the | |
| * lens model. | |
| * | |
| * \return The lens model name | |
| */ | |
| std::string CameraLens::logPrefix() const | |
| { | |
| return "'" + entity_->name() + "'"; | |
| } | |
| /** | |
| * \fn CameraLens::controls() | |
| * \brief Retrieve the V4L2 controls of the lens' subdev | |
| * | |
| * \return A map of the V4L2 controls supported by the lens' driver | |
| */ | |
| const ControlInfoMap &CameraLens::controls() const | |
| { | |
| return subdev_->controls(); | |
| } | |
| } /* namespace libcamera */ |