Message ID | 20231206114307.94241-2-jacopo.mondi@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Quoting Jacopo Mondi (2023-12-06 11:43:05) > 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..4575cc4e11d7 > --- /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 Could probably be refreshed, or updated. Could be done while applying I expect. Otherwise, Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > + * > + * 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 = 32; > +}; > + > +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..4575cc4e11d7 --- /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 = 32; +}; + +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', ])