Message ID | 20231204091053.22807-3-jacopo.mondi@ideasonboard.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Jacopo On Mon, 4 Dec 2023 at 09:11, Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org> wrote: > > Support the OV64A40 sensor with a camera helper to manage the gain > model, light sensitivity, and control delays. > > Signed-off-by: Lee Jackson <lee.jackson@arducam.com> > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > Reviewed-by: Naushir Patuck <naush@raspberrypi.com> > --- > src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp | 73 +++++++++++++++++++ > src/ipa/rpi/cam_helper/meson.build | 1 + > 2 files changed, 74 insertions(+) > create mode 100644 src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp > > diff --git a/src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp b/src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp > new file mode 100644 > index 000000000000..041c32dd9222 > --- /dev/null > +++ b/src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp > @@ -0,0 +1,73 @@ > +/* SPDX-License-Identifier: BSD-2-Clause */ > +/* > + * Copyright (C) 2021, Raspberry Pi Ltd > + * > + * cam_helper_ov64a40.cpp - camera information for ov64a40 sensor > + */ > + > +#include <assert.h> > + > +#include "cam_helper.h" > + > +using namespace RPiController; > + > +class CamHelperOv64a40 : public CamHelper > +{ > +public: > + CamHelperOv64a40(); > + uint32_t gainCode(double gain) const override; > + double gain(uint32_t gainCode) const override; > + void getDelays(int &exposureDelay, int &gainDelay, > + int &vblankDelay, int &hblankDelay) const override; > + double getModeSensitivity(const CameraMode &mode) const override; > + > +private: > + /* > + * Smallest difference between the frame length and integration time, > + * in units of lines. > + */ > + static constexpr int frameIntegrationDiff = 4; Just noticing this in passing. Your driver PR has #define OV64A40_EXPOSURE_MARGIN 32 yet this defines the difference to be 4. AIUI they are the same parameter, so presumably one of them is wrong. Dave > +}; > + > +CamHelperOv64a40::CamHelperOv64a40() > + : CamHelper({}, frameIntegrationDiff) > +{ > +} > + > +uint32_t CamHelperOv64a40::gainCode(double gain) const > +{ > + return static_cast<uint32_t>(gain * 128.0); > +} > + > +double CamHelperOv64a40::gain(uint32_t gainCode) const > +{ > + return static_cast<double>(gainCode) / 128.0; > +} > + > +void CamHelperOv64a40::getDelays(int &exposureDelay, int &gainDelay, > + int &vblankDelay, int &hblankDelay) const > +{ > + /* The driver appears to behave as follows: */ > + exposureDelay = 2; > + gainDelay = 2; > + vblankDelay = 2; > + hblankDelay = 2; > +} > + > +double CamHelperOv64a40::getModeSensitivity(const CameraMode &mode) const > +{ > + if (mode.binX >= 2 && mode.scaleX >= 4) { > + return 4.0; > + } else if (mode.binX >= 2 && mode.scaleX >= 2) { > + return 2.0; > + } else { > + return 1.0; > + } > +} > + > +static CamHelper *create() > +{ > + return new CamHelperOv64a40(); > +} > + > +static RegisterCamHelper reg("ov64a40", &create); > diff --git a/src/ipa/rpi/cam_helper/meson.build b/src/ipa/rpi/cam_helper/meson.build > index bdf2db8eb742..7262505742f3 100644 > --- a/src/ipa/rpi/cam_helper/meson.build > +++ b/src/ipa/rpi/cam_helper/meson.build > @@ -9,6 +9,7 @@ rpi_ipa_cam_helper_sources = files([ > 'cam_helper_imx477.cpp', > 'cam_helper_imx519.cpp', > 'cam_helper_imx708.cpp', > + 'cam_helper_ov64a40.cpp', > 'cam_helper_ov9281.cpp', > 'md_parser_smia.cpp', > ]) > -- > 2.41.0 >
Hi Dave, On Mon, Dec 04, 2023 at 03:44:21PM +0000, Dave Stevenson via libcamera-devel wrote: > Hi Jacopo > > On Mon, 4 Dec 2023 at 09:11, Jacopo Mondi via libcamera-devel > <libcamera-devel@lists.libcamera.org> wrote: > > > > Support the OV64A40 sensor with a camera helper to manage the gain > > model, light sensitivity, and control delays. > > > > Signed-off-by: Lee Jackson <lee.jackson@arducam.com> > > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > Reviewed-by: Naushir Patuck <naush@raspberrypi.com> > > --- > > src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp | 73 +++++++++++++++++++ > > src/ipa/rpi/cam_helper/meson.build | 1 + > > 2 files changed, 74 insertions(+) > > create mode 100644 src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp > > > > diff --git a/src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp b/src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp > > new file mode 100644 > > index 000000000000..041c32dd9222 > > --- /dev/null > > +++ b/src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp > > @@ -0,0 +1,73 @@ > > +/* SPDX-License-Identifier: BSD-2-Clause */ > > +/* > > + * Copyright (C) 2021, Raspberry Pi Ltd > > + * > > + * cam_helper_ov64a40.cpp - camera information for ov64a40 sensor > > + */ > > + > > +#include <assert.h> > > + > > +#include "cam_helper.h" > > + > > +using namespace RPiController; > > + > > +class CamHelperOv64a40 : public CamHelper > > +{ > > +public: > > + CamHelperOv64a40(); > > + uint32_t gainCode(double gain) const override; > > + double gain(uint32_t gainCode) const override; > > + void getDelays(int &exposureDelay, int &gainDelay, > > + int &vblankDelay, int &hblankDelay) const override; > > + double getModeSensitivity(const CameraMode &mode) const override; > > + > > +private: > > + /* > > + * Smallest difference between the frame length and integration time, > > + * in units of lines. > > + */ > > + static constexpr int frameIntegrationDiff = 4; > > Just noticing this in passing. Your driver PR has > #define OV64A40_EXPOSURE_MARGIN 32 > yet this defines the difference to be 4. AIUI they are the same > parameter, so presumably one of them is wrong. You're right! thanks for spotting. The correct value to use is 32, I'll update this one! > > Dave > > > +}; > > + > > +CamHelperOv64a40::CamHelperOv64a40() > > + : CamHelper({}, frameIntegrationDiff) > > +{ > > +} > > + > > +uint32_t CamHelperOv64a40::gainCode(double gain) const > > +{ > > + return static_cast<uint32_t>(gain * 128.0); > > +} > > + > > +double CamHelperOv64a40::gain(uint32_t gainCode) const > > +{ > > + return static_cast<double>(gainCode) / 128.0; > > +} > > + > > +void CamHelperOv64a40::getDelays(int &exposureDelay, int &gainDelay, > > + int &vblankDelay, int &hblankDelay) const > > +{ > > + /* The driver appears to behave as follows: */ > > + exposureDelay = 2; > > + gainDelay = 2; > > + vblankDelay = 2; > > + hblankDelay = 2; > > +} > > + > > +double CamHelperOv64a40::getModeSensitivity(const CameraMode &mode) const > > +{ > > + if (mode.binX >= 2 && mode.scaleX >= 4) { > > + return 4.0; > > + } else if (mode.binX >= 2 && mode.scaleX >= 2) { > > + return 2.0; > > + } else { > > + return 1.0; > > + } > > +} > > + > > +static CamHelper *create() > > +{ > > + return new CamHelperOv64a40(); > > +} > > + > > +static RegisterCamHelper reg("ov64a40", &create); > > diff --git a/src/ipa/rpi/cam_helper/meson.build b/src/ipa/rpi/cam_helper/meson.build > > index bdf2db8eb742..7262505742f3 100644 > > --- a/src/ipa/rpi/cam_helper/meson.build > > +++ b/src/ipa/rpi/cam_helper/meson.build > > @@ -9,6 +9,7 @@ rpi_ipa_cam_helper_sources = files([ > > 'cam_helper_imx477.cpp', > > 'cam_helper_imx519.cpp', > > 'cam_helper_imx708.cpp', > > + 'cam_helper_ov64a40.cpp', > > 'cam_helper_ov9281.cpp', > > 'md_parser_smia.cpp', > > ]) > > -- > > 2.41.0 > >
diff --git a/src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp b/src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp new file mode 100644 index 000000000000..041c32dd9222 --- /dev/null +++ b/src/ipa/rpi/cam_helper/cam_helper_ov64a40.cpp @@ -0,0 +1,73 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2021, Raspberry Pi Ltd + * + * cam_helper_ov64a40.cpp - camera information for ov64a40 sensor + */ + +#include <assert.h> + +#include "cam_helper.h" + +using namespace RPiController; + +class CamHelperOv64a40 : public CamHelper +{ +public: + CamHelperOv64a40(); + uint32_t gainCode(double gain) const override; + double gain(uint32_t gainCode) const override; + void getDelays(int &exposureDelay, int &gainDelay, + int &vblankDelay, int &hblankDelay) const override; + double getModeSensitivity(const CameraMode &mode) const override; + +private: + /* + * Smallest difference between the frame length and integration time, + * in units of lines. + */ + static constexpr int frameIntegrationDiff = 4; +}; + +CamHelperOv64a40::CamHelperOv64a40() + : CamHelper({}, frameIntegrationDiff) +{ +} + +uint32_t CamHelperOv64a40::gainCode(double gain) const +{ + return static_cast<uint32_t>(gain * 128.0); +} + +double CamHelperOv64a40::gain(uint32_t gainCode) const +{ + return static_cast<double>(gainCode) / 128.0; +} + +void CamHelperOv64a40::getDelays(int &exposureDelay, int &gainDelay, + int &vblankDelay, int &hblankDelay) const +{ + /* The driver appears to behave as follows: */ + exposureDelay = 2; + gainDelay = 2; + vblankDelay = 2; + hblankDelay = 2; +} + +double CamHelperOv64a40::getModeSensitivity(const CameraMode &mode) const +{ + if (mode.binX >= 2 && mode.scaleX >= 4) { + return 4.0; + } else if (mode.binX >= 2 && mode.scaleX >= 2) { + return 2.0; + } else { + return 1.0; + } +} + +static CamHelper *create() +{ + return new CamHelperOv64a40(); +} + +static RegisterCamHelper reg("ov64a40", &create); diff --git a/src/ipa/rpi/cam_helper/meson.build b/src/ipa/rpi/cam_helper/meson.build index bdf2db8eb742..7262505742f3 100644 --- a/src/ipa/rpi/cam_helper/meson.build +++ b/src/ipa/rpi/cam_helper/meson.build @@ -9,6 +9,7 @@ rpi_ipa_cam_helper_sources = files([ 'cam_helper_imx477.cpp', 'cam_helper_imx519.cpp', 'cam_helper_imx708.cpp', + 'cam_helper_ov64a40.cpp', 'cam_helper_ov9281.cpp', 'md_parser_smia.cpp', ])