summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUmang Jain <umang.jain@ideasonboard.com>2021-05-10 23:40:28 +0530
committerUmang Jain <umang.jain@ideasonboard.com>2021-06-28 17:54:08 +0530
commit3e6709e214045205790df311f5ee3b003a6f8b3e (patch)
tree8c67b8334cec54847f23b256cbca793d0eb11681
parent809edb381ccdd367e2b425dd5f186322968de015 (diff)
aic: Import IPU3ISPPipe
Import and construct the IPU3ISPPipe to provide the callback hooks required by the ia_imaging libraries. We need to set 'MACRO_KBL_AIC' for rgbir_2500_config aic config parameter since it's wrapped in #ifdefs directives. Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
-rw-r--r--aic/ipu3_isp_pipe.cpp231
-rw-r--r--aic/ipu3_isp_pipe.h51
-rw-r--r--aic/meson.build1
-rw-r--r--meson.build2
4 files changed, 285 insertions, 0 deletions
diff --git a/aic/ipu3_isp_pipe.cpp b/aic/ipu3_isp_pipe.cpp
new file mode 100644
index 0000000..8141894
--- /dev/null
+++ b/aic/ipu3_isp_pipe.cpp
@@ -0,0 +1,231 @@
+/* SPDX-License-Identifier: Apache-2.0 */
+/*
+ * IPU3ISPPipe: Derived class from ISPPipe storing the AIC config
+ */
+
+#include <string.h>
+
+#include "ipu3_isp_pipe.h"
+
+#include <libcamera/base/log.h>
+
+namespace libcamera::ipa::ipu3::aic {
+
+LOG_DEFINE_CATEGORY(IPU3ISPPipe)
+
+#define CLEAR(x) memset(&(x), 0, sizeof(x))
+
+IPU3ISPPipe::IPU3ISPPipe()
+{
+ CLEAR(AicOutput);
+ CLEAR(AicConfig);
+}
+
+void IPU3ISPPipe::SetPipeConfig(const aic_output_t pipe_config)
+{
+ AicOutput = pipe_config;
+
+ if (AicOutput.lin_2500_config)
+ AicConfig.lin_2500_config = *AicOutput.lin_2500_config;
+ if (AicOutput.obgrid_2500_config)
+ AicConfig.obgrid_2500_config = *AicOutput.obgrid_2500_config;
+ if (AicOutput.bnr_2500_config)
+ AicConfig.bnr_2500_config = *AicOutput.bnr_2500_config;
+ if (AicOutput.shd_2500_config)
+ AicConfig.shd_2500_config = *AicOutput.shd_2500_config;
+ if (AicOutput.dm_2500_config)
+ AicConfig.dm_2500_config = *AicOutput.dm_2500_config;
+ if (AicOutput.rgbpp_2500_config)
+ AicConfig.rgbpp_2500_config = *AicOutput.rgbpp_2500_config;
+ if (AicOutput.yuvp1_2500_config)
+ AicConfig.yuvp1_2500_config = *AicOutput.yuvp1_2500_config;
+ if (AicOutput.yuvp1_c0_2500_config)
+ AicConfig.yuvp1_c0_2500_config = *AicOutput.yuvp1_c0_2500_config;
+ if (AicOutput.yuvp2_2500_config)
+ AicConfig.yuvp2_2500_config = *AicOutput.yuvp2_2500_config;
+ if (AicOutput.tnr3_2500_config)
+ AicConfig.tnr3_2500_config = *AicOutput.tnr3_2500_config;
+ if (AicOutput.dpc_2500_config)
+ AicConfig.dpc_2500_config = *AicOutput.dpc_2500_config;
+ if (AicOutput.awb_2500_config)
+ AicConfig.awb_2500_config = *AicOutput.awb_2500_config;
+ if (AicOutput.awb_fr_2500_config)
+ AicConfig.awb_fr_2500_config = *AicOutput.awb_fr_2500_config;
+ if (AicOutput.anr_2500_config)
+ AicConfig.anr_2500_config = *AicOutput.anr_2500_config;
+ if (AicOutput.af_2500_config)
+ AicConfig.af_2500_config = *AicOutput.af_2500_config;
+ if (AicOutput.ae_2500_config)
+ AicConfig.ae_2500_config = *AicOutput.ae_2500_config;
+ if (AicOutput.xnr_2500_config)
+ AicConfig.xnr_2500_config = *AicOutput.xnr_2500_config;
+ if (AicOutput.rgbir_2500_config)
+ AicConfig.rgbir_2500_config = *AicOutput.rgbir_2500_config;
+}
+
+void IPU3ISPPipe::dump()
+{
+ if (AicOutput.ae_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.ae_2500_config->ae.ae_grid_config.ae_en: "
+ << (int)AicOutput.ae_2500_config->ae.ae_grid_config.ae_en;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.ae_2500_config->ae.ae_grid_config.block_height: "
+ << (int)AicOutput.ae_2500_config->ae.ae_grid_config.block_height;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.ae_2500_config->ae.ae_grid_config.block_width: "
+ << (int)AicOutput.ae_2500_config->ae.ae_grid_config.block_width;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.ae_2500_config->ae.ae_grid_config.x_start: "
+ << AicOutput.ae_2500_config->ae.ae_grid_config.x_start;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.ae_2500_config->ae.ae_grid_config.y_start: "
+ << AicOutput.ae_2500_config->ae.ae_grid_config.y_start;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.ae_2500_config->ae.ae_grid_config.grid_height: "
+ << (int)AicOutput.ae_2500_config->ae.ae_grid_config.grid_height;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.ae_2500_config->ae.ae_grid_config.grid_width: "
+ << (int)AicOutput.ae_2500_config->ae.ae_grid_config.grid_width;
+ }
+
+ if (AicOutput.af_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.af_2500_config->af.grid.grid_height: "
+ << (int)AicOutput.af_2500_config->af.grid.grid_height;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.af_2500_config->af.grid.grid_width: "
+ << (int)AicOutput.af_2500_config->af.grid.grid_width;
+ }
+
+ if (AicOutput.anr_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.anr_2500_config: "
+ << AicOutput.anr_2500_config;
+ }
+
+ if (AicOutput.awb_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.awb_2500_config->awb.grid.grid_block_height: "
+ << (int)AicOutput.awb_2500_config->awb.grid.grid_block_height;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.awb_2500_config->awb.grid.grid_block_width: "
+ << (int)AicOutput.awb_2500_config->awb.grid.grid_block_width;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.awb_2500_config->awb.grid.grid_height: "
+ << (int)AicOutput.awb_2500_config->awb.grid.grid_height;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.awb_2500_config->awb.grid.grid_width: "
+ << (int)AicOutput.awb_2500_config->awb.grid.grid_width;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.awb_2500_config->awb.grid.grid_x_start: "
+ << AicOutput.awb_2500_config->awb.grid.grid_x_start;
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.awb_2500_config->awb.grid.grid_y_start: "
+ << AicOutput.awb_2500_config->awb.grid.grid_y_start;
+ }
+
+ if (AicOutput.awb_fr_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.awb_fr_2500_config: "
+ << AicOutput.awb_fr_2500_config;
+ }
+ if (AicOutput.bnr_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.bnr_2500_config: "
+ << AicOutput.bnr_2500_config;
+ }
+
+ if (AicOutput.dm_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.dm_2500_config: "
+ << AicOutput.dm_2500_config;
+ }
+
+ if (AicOutput.dpc_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.dpc_2500_config: " << AicOutput.dpc_2500_config;
+ }
+
+ if (AicOutput.lin_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.lin_2500_config: " << AicOutput.lin_2500_config;
+ }
+
+ if (AicOutput.obgrid_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.obgrid_2500_config: "
+ << AicOutput.obgrid_2500_config;
+ }
+
+ if (AicOutput.rgbir_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.rgbir_2500_config: "
+ << AicOutput.rgbir_2500_config;
+ }
+
+ if (AicOutput.rgbpp_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.rgbpp_2500_config: "
+ << AicOutput.rgbpp_2500_config;
+ }
+
+ if (AicOutput.shd_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.shd_2500_config: "
+ << AicOutput.shd_2500_config;
+ }
+
+ if (AicOutput.tnr3_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.tnr3_2500_config: "
+ << AicOutput.tnr3_2500_config;
+ }
+
+ if (AicOutput.xnr_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.xnr_2500_config: "
+ << AicOutput.xnr_2500_config;
+ }
+
+ if (AicOutput.yuvp1_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.yuvp1_2500_config: "
+ << AicOutput.yuvp1_2500_config;
+ }
+
+ if (AicOutput.yuvp1_c0_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.yuvp1_c0_2500_config: "
+ << AicOutput.yuvp1_c0_2500_config;
+ }
+
+ if (AicOutput.yuvp2_2500_config) {
+ LOG(IPU3ISPPipe, Debug)
+ << "AicOutput.yuvp2_2500_config: "
+ << AicOutput.yuvp2_2500_config;
+ }
+}
+
+const ia_aiq_rgbs_grid *IPU3ISPPipe::GetAWBStats()
+{
+ return nullptr;
+}
+
+const ia_aiq_af_grid *IPU3ISPPipe::GetAFStats()
+{
+ return nullptr;
+}
+
+const ia_aiq_histogram *IPU3ISPPipe::GetAEStats()
+{
+ return nullptr;
+}
+
+aic_config *IPU3ISPPipe::GetAicConfig()
+{
+ return &AicConfig;
+}
+
+} /* namespace libcamera::ipa::ipu3::aic */
+
diff --git a/aic/ipu3_isp_pipe.h b/aic/ipu3_isp_pipe.h
new file mode 100644
index 0000000..95540ab
--- /dev/null
+++ b/aic/ipu3_isp_pipe.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: Apache-2.0 */
+/*
+ * IPU3ISPPipe: Derived class from ISPPipe storing the AIC config
+ */
+
+#ifndef IPU3ISPPIPE_H
+#define IPU3ISPPIPE_H
+
+/* Included first to bring in our type wrapper */
+#include "kbl_aic.h"
+
+#include "IPU3AICCommon.h"
+#include "Pipe.h"
+
+namespace libcamera::ipa::ipu3::aic {
+
+#define NUM_ISP_PIPES 1
+
+typedef enum AicMode {
+ AIC_MODE_STILL = 0,
+ AIC_MODE_VIDEO,
+ AIC_MODE_MAX,
+} AicMode;
+
+class IPU3ISPPipe : public ISPPipe
+{
+public:
+ IPU3ISPPipe();
+
+public:
+ // This function configures the HW/FW pipe via CSS interface
+ virtual void SetPipeConfig(const aic_output_t pipe_config);
+
+ virtual pipe_ver GetPipeVer() { return Czero; }
+
+ virtual const ia_aiq_rgbs_grid *GetAWBStats();
+ virtual const ia_aiq_af_grid *GetAFStats();
+ virtual const ia_aiq_histogram *GetAEStats();
+ virtual aic_config *GetAicConfig();
+
+ virtual void dump();
+
+private:
+ aic_output_t AicOutput;
+
+ aic_config AicConfig; /* Config to driver */
+};
+
+} /* namespace libcamera::ipa::ipu3::aic */
+
+#endif /* IPU3ISPPIPE_H */
diff --git a/aic/meson.build b/aic/meson.build
index c3a8201..361d8b2 100644
--- a/aic/meson.build
+++ b/aic/meson.build
@@ -1,5 +1,6 @@
# SPDX-License-Identifier: CC0-1.0
ipu3_ipa_files += files([
+ 'ipu3_isp_pipe.cpp',
'parameter_encoder.cpp',
])
diff --git a/meson.build b/meson.build
index bcb2c7c..e7d6c6b 100644
--- a/meson.build
+++ b/meson.build
@@ -40,6 +40,8 @@ if cc.has_header_symbol('stdlib.h', 'secure_getenv', prefix : '#define _GNU_SOUR
config_h.set('HAVE_SECURE_GETENV', 1)
endif
+config_h.set('MACRO_KBL_AIC', 1)
+
configure_file(output : 'config.h', configuration : config_h)
common_arguments = [
'-DLIBCAMERA_BASE_PRIVATE',