blob: 31905d30cea6f6353feae102ad0e3e924b1bd070 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <hwreg/bitfields.h>
#include <zircon/types.h>
namespace camera {
class Id_Api : public hwreg::RegisterBase<Id_Api, uint32_t> {
public:
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<Id_Api>(0x0);
}
};
class Id_Product : public hwreg::RegisterBase<Id_Product, uint32_t> {
public:
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<Id_Product>(0x4);
}
};
class Id_Version : public hwreg::RegisterBase<Id_Version, uint32_t> {
public:
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<Id_Version>(0x8);
}
};
class Id_Revision : public hwreg::RegisterBase<Id_Revision, uint32_t> {
public:
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<Id_Revision>(0xc);
}
};
class IspGlobal_Config0 : public hwreg::RegisterBase<IspGlobal_Config0, uint32_t> {
public:
// [0] : check bid
// [1] : check rid
// The following signals are diagnostic signals which helps
// identifying some of the AXI interface
// error cases. This must be used only as debug signals. You should
// follow these sequence
// - Mask the dma error interrupt
// - clear DMA interrupt if there is an active interrupt
// - Write appropriate values to these registers
// - Clear DMA alarms to clear the existing alarm
// - unmask the DMA error interrpt
// [2] : frame_write_cancel/frame_read_cancel
// [10:3] : awmaxwait_limit/armaxwait_limit
// [18:11]: wmaxwait_limit
// [26:19]: waxct_ostand_limit/rxnfr_ostand_limit
DEF_FIELD(30, 4, dma_global_config);
// 1 = synchronous reset of FSMs in design (faster recovery after
// broken frame)
// when the MCU detects a broken frame or any other abnormal
// condition, the global_fsm_rest is
// expected to be used.
// MCU needs to follow a certain sequence for the same
// 1. Read the status register to know the exact source of
// the error interrupt.
// 2. Read the details of the error status register.
// 3. Mask all the interrupts.
// 4. Configure the input port register ISP_COMMON:input
// port: mode request to safe_stop mode.
// 5. Read back the ISP_COMMON:input port: mode status
// register to see the status of mode request.
// And wait until it shows the correct status.
// 6. Wait for the ISP_COMMON:isp global monitor: fr
// pipeline busy signal to become low.
// 7. Assert the global fsm reset.
// 8. Clear the global fsm reset.
// 9. Reconfigure the ISP configuration space.
// 10. Unmask the necessary interrupt sources. 11. Configure
// the input port in safe_start mode.
DEF_BIT(0, global_fsm_reset);
// 1 = synchronous reset of FSMs in scaler design
DEF_BIT(1, scaler_fsm_reset);
static auto Get() {
return hwreg::RegisterAddr<IspGlobal_Config0>(0x10);
}
};
class IspGlobal_Config1 : public hwreg::RegisterBase<IspGlobal_Config1, uint32_t> {
public:
// Horizontal blanking interval during regeneration (0=measured
// input interval)
DEF_FIELD(15, 0, flush_hblank);
// 0=linearised data after linearised cluster, MSB aligned.
// {data[19:0], 16'd0}, 1=static DPC output, MSB aligned.
// {data[15:0], 20'd0}, 2=Output of CA correction, MSB aligned.
// {data[15:0], 20'd0}, 3=CNR output, {B[11:0], G[11:0],
// R[11:0]}, 4=output forces to 0, 5=Reserved 5, 6=Reserved 6,
// 7=Reserved 7
DEF_FIELD(18, 16, isp_monitor_select);
static auto Get() {
return hwreg::RegisterAddr<IspGlobal_Config1>(0x14);
}
};
class IspGlobal_Config2 : public hwreg::RegisterBase<IspGlobal_Config2, uint32_t> {
public:
// Minimun H-blank. The frame monitor will checke the frame geometry
// against this value
DEF_FIELD(15, 0, interline_blanks_min);
// Minimun V-blank. The frame monitor will checke the frame geometry
// against this value
DEF_FIELD(31, 16, interframe_blanks_min);
static auto Get() {
return hwreg::RegisterAddr<IspGlobal_Config2>(0x18);
}
};
class IspGlobal_WatchdogTimerMaxCount :
public hwreg::RegisterBase<IspGlobal_WatchdogTimerMaxCount, uint32_t> {
public:
// Max count after which watchdog timer should give an interrupt.
// this count is between frame start and frame end
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<IspGlobal_WatchdogTimerMaxCount>(0x1c);
}
};
class IspGlobal_Config3 : public hwreg::RegisterBase<IspGlobal_Config3, uint32_t> {
public:
// mcu override config select. When this bit is set, MCU takes
// control of the ISP ping-pong config swap.
// when is signal is set to 1, ISP core works in slave mode and
// selects configuration space based on MCU instruction.
DEF_BIT(0, mcu_override_config_select);
// This signal is valid when Mcu_override_config_select is set to 1.
// when mcu takes control of the config select, this signal
// indicated whether to use ping and pong config space
// If this signal is changed during active active frame, the
// hardware makes sure that the config space is changed
// in the next vertical blanking (0=Use pong address space, 1=Use
// Ping address space)
DEF_BIT(1, mcu_ping_pong_config_select);
// Multi-context control mode (0=default mode, this is for single
// context, 1=multi-context mode)
DEF_BIT(8, multi_context_mode);
IspGlobal_Config3& select_config_ping() {
set_mcu_ping_pong_config_select(1);
return *this;
}
IspGlobal_Config3& select_config_pong() {
set_mcu_ping_pong_config_select(0);
return *this;
}
static auto Get() {
return hwreg::RegisterAddr<IspGlobal_Config3>(0x20);
}
};
class IspGlobal_Config4 : public hwreg::RegisterBase<IspGlobal_Config4, uint32_t> {
public:
// context swap status. when a address space is locked, all write to
// that address space will be rejected internally
// This signal is set when the 1st pixel comes out of input
// port and gets cleared when the last pixel comes out of ISp
// in streaming channels
// 1: ping locked
// 0: ping free
DEF_BIT(0, ping_locked);
// context swap status. when a address space is locked, all write to
// that address space will be rejected internally.
// This signal is set when the 1st pixel comes out of input
// port and gets cleared when the last pixel comes out of ISp
// in streaming channels
// 1: pong locked
// 0: pong free
DEF_BIT(1, pong_locked);
// this signal indicates which of the PING/PONG config is being used
// by ISP. when MCU takes control of the config management through
// Mcu_override_config_select signal, then this signal is just a
// reflection of what MCU has instructed through
// Mcu_ping_pong_config_select
// signal.
// This signal is a good point to synchronize with hardware.
// MCU should read this signal in a regular interval to
// synchronize with its
// internal state.
// This signal is changed when the 1st pixel comes in. So this
// signal must be sampled at the frame_start interrupt.
// 0: pong in use by ISP
// 1: ping in use by ISP
DEF_BIT(2, ping_pong_config_select);
bool is_ping() const {
return ping_pong_config_select() == 1;
}
bool is_pong() const {
return ping_pong_config_select() == 0;
}
static auto Get() {
return hwreg::RegisterAddr<IspGlobal_Config4>(0x24);
}
};
class IspGlobalMeteringBaseAddr :
public hwreg::RegisterBase<IspGlobalMeteringBaseAddr, uint32_t> {
public:
// base address for AWB stats. Value is set for 33x33 max zones
DEF_FIELD(15, 0, awb);
// base address for AF stats. Value is set for 33x33 max zones
DEF_FIELD(31, 16, af);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalMeteringBaseAddr>(0x28);
}
};
class IspGlobalMeteringBaseAddr_MaxAddr :
public hwreg::RegisterBase<IspGlobalMeteringBaseAddr_MaxAddr, uint32_t> {
public:
// max address for metering stats mem. Value is set for 33x33 max zones
DEF_FIELD(15, 0, value);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalMeteringBaseAddr_MaxAddr>(0x2c);
}
};
class IspGlobalInterrupt_MaskVector :
public hwreg::RegisterBase<IspGlobalInterrupt_MaskVector, uint32_t> {
public:
DEF_BIT(0, isp_start);
DEF_BIT(1, isp_done);
DEF_BIT(2, ctx_management_error);
DEF_BIT(3, broken_frame_error);
DEF_BIT(4, metering_af_done);
DEF_BIT(5, metering_aexp_done);
DEF_BIT(6, metering_awb_done);
DEF_BIT(7, metering_aexp_1024_bin_hist_done);
DEF_BIT(8, metering_antifog_hist_done);
DEF_BIT(9, lut_init_done);
DEF_BIT(11, fr_y_dma_write_done);
DEF_BIT(12, fr_uv_dma_write_done);
DEF_BIT(13, ds_y_dma_write_done);
DEF_BIT(14, linearization_done);
DEF_BIT(15, static_dpc_done);
DEF_BIT(16, ca_correction_done);
DEF_BIT(17, iridix_done);
DEF_BIT(18, three_d_liut_done);
DEF_BIT(19, wdg_timer_timed_out);
DEF_BIT(20, frame_collision_error);
DEF_BIT(21, luma_variance_done);
DEF_BIT(22, dma_error_interrupt);
DEF_BIT(23, input_port_safely_stopped);
IspGlobalInterrupt_MaskVector& mask_all() {
set_isp_start(1);
set_isp_done(1);
set_ctx_management_error(1);
set_broken_frame_error(1);
set_metering_af_done(1);
set_metering_aexp_done(1);
set_metering_awb_done(1);
set_metering_aexp_1024_bin_hist_done(1);
set_metering_antifog_hist_done(1);
set_lut_init_done(1);
set_fr_y_dma_write_done(1);
set_fr_uv_dma_write_done(1);
set_ds_y_dma_write_done(1);
set_linearization_done(1);
set_static_dpc_done(1);
set_ca_correction_done(1);
set_iridix_done(1);
set_three_d_liut_done(1);
set_wdg_timer_timed_out(1);
set_frame_collision_error(1);
set_luma_variance_done(1);
set_dma_error_interrupt(1);
set_input_port_safely_stopped(1);
return *this;
}
static auto Get() {
return hwreg::RegisterAddr<IspGlobalInterrupt_MaskVector>(0x30);
}
};
class IspGlobalInterrupt_ClearVector :
public hwreg::RegisterBase<IspGlobalInterrupt_ClearVector, uint32_t> {
public:
DEF_BIT(0, isp_start);
DEF_BIT(1, isp_done);
DEF_BIT(2, ctx_management_error);
DEF_BIT(3, broken_frame_error);
DEF_BIT(4, metering_af_done);
DEF_BIT(5, metering_aexp_done);
DEF_BIT(6, metering_awb_done);
DEF_BIT(7, metering_aexp_1024_bin_hist_done);
DEF_BIT(8, metering_antifog_hist_done);
DEF_BIT(9, lut_init_done);
DEF_BIT(11, fr_y_dma_write_done);
DEF_BIT(12, fr_uv_dma_write_done);
DEF_BIT(13, ds_y_dma_write_done);
DEF_BIT(14, linearization_done);
DEF_BIT(15, static_dpc_done);
DEF_BIT(16, ca_correction_done);
DEF_BIT(17, iridix_done);
DEF_BIT(18, three_d_liut_done);
DEF_BIT(19, wdg_timer_timed_out);
DEF_BIT(20, frame_collision_error);
DEF_BIT(21, luma_variance_done);
DEF_BIT(22, dma_error_interrupt);
DEF_BIT(23, input_port_safely_stopped);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalInterrupt_ClearVector>(0x34);
}
};
class IspGlobalInterrupt_ShadowDisableVector :
public hwreg::RegisterBase<IspGlobalInterrupt_ShadowDisableVector, uint32_t> {
public:
DEF_BIT(0, isp_start);
DEF_BIT(1, isp_done);
DEF_BIT(2, ctx_management_error);
DEF_BIT(3, broken_frame_error);
DEF_BIT(4, metering_af_done);
DEF_BIT(5, metering_aexp_done);
DEF_BIT(6, metering_awb_done);
DEF_BIT(7, metering_aexp_1024_bin_hist_done);
DEF_BIT(8, metering_antifog_hist_done);
DEF_BIT(9, lut_init_done);
DEF_BIT(11, fr_y_dma_write_done);
DEF_BIT(12, fr_uv_dma_write_done);
DEF_BIT(13, ds_y_dma_write_done);
DEF_BIT(14, linearization_done);
DEF_BIT(15, static_dpc_done);
DEF_BIT(16, ca_correction_done);
DEF_BIT(17, iridix_done);
DEF_BIT(18, three_d_liut_done);
DEF_BIT(19, wdg_timer_timed_out);
DEF_BIT(20, frame_collision_error);
DEF_BIT(21, luma_variance_done);
DEF_BIT(22, dma_error_interrupt);
DEF_BIT(23, input_port_safely_stopped);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalInterrupt_ShadowDisableVector>(0x38);
}
};
class IspGlobalInterrupt_PulseMode :
public hwreg::RegisterBase<IspGlobalInterrupt_PulseMode, uint32_t> {
public:
// When set to 1, the output interrupt will be a pulse. Otherwise it
// should be level.
DEF_BIT(0, value);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalInterrupt_PulseMode>(0x3c);
}
};
class IspGlobalInterrupt_Clear :
public hwreg::RegisterBase<IspGlobalInterrupt_Clear, uint32_t> {
public:
// Interrupt clear vector register qualifier. First the vector must
// be written. Then this bit must be set to 1 and then cleared
DEF_BIT(0, value);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalInterrupt_Clear>(0x40);
}
};
class IspGlobalInterrupt_StatusVector :
public hwreg::RegisterBase<IspGlobalInterrupt_StatusVector, uint32_t> {
public:
DEF_BIT(0, isp_start);
DEF_BIT(1, isp_done);
DEF_BIT(2, ctx_management_error);
DEF_BIT(3, broken_frame_error);
DEF_BIT(4, metering_af_done);
DEF_BIT(5, metering_aexp_done);
DEF_BIT(6, metering_awb_done);
DEF_BIT(7, metering_aexp_1024_bin_hist_done);
DEF_BIT(8, metering_antifog_hist_done);
DEF_BIT(9, lut_init_done);
DEF_BIT(11, fr_y_dma_write_done);
DEF_BIT(12, fr_uv_dma_write_done);
DEF_BIT(13, ds_y_dma_write_done);
DEF_BIT(14, linearization_done);
DEF_BIT(15, static_dpc_done);
DEF_BIT(16, ca_correction_done);
DEF_BIT(17, iridix_done);
DEF_BIT(18, three_d_liut_done);
DEF_BIT(19, wdg_timer_timed_out);
DEF_BIT(20, frame_collision_error);
DEF_BIT(21, luma_variance_done);
DEF_BIT(22, dma_error_interrupt);
DEF_BIT(23, input_port_safely_stopped);
bool has_errors() const {
return (broken_frame_error() || frame_collision_error() || dma_error_interrupt() ||
ctx_management_error() || wdg_timer_timed_out());
}
static auto Get() {
return hwreg::RegisterAddr<IspGlobalInterrupt_StatusVector>(0x44);
}
};
class IspGlobalLp_ClockDisable :
public hwreg::RegisterBase<IspGlobalLp_ClockDisable, uint32_t> {
public:
// When set, the output Y/RGB/YUV DMA writer in FR channel will be
// clock gated. This is applicable
// to Y channel of the semi-planner mode and all other
// non-planner modes. This must be used only when the DMA
// writer is not used and SOC
// environment uses the streaming outputs from ISP
DEF_BIT(0, clk_dis_fr_y_dma_writer);
// When set, the output UV DMA writer in FR channel will be clock
// gated. This is applicable
// to UV channel of the semi-planner mode . This must be used
// only when the DMA writer is not used and SOC
// environment uses the streaming outputs from ISP, or format is
// NOT semi-planner
DEF_BIT(1, clk_dis_fr_uv_dma_writer);
// When set, the output Y/RGB/YUV DMA writer in DS channel will be
// clock gated. This is applicable
// to Y channel of the semi-planner mode and all other
// non-planner modes. This must be used only when the DMA
// writer is not used and SOC
// environment uses the streaming outputs from ISP
DEF_BIT(2, clk_dis_ds_y_dma_writer);
// When set, the output UV DMA writer in DS channel will be clock
// gated. This is applicable
// to UV channel of the semi-planner mode . This must be used
// only when the DMA writer is not used and SOC
// environment uses the streaming outputs from ISP, or format is
// NOT semi-planner
DEF_BIT(3, clk_dis_ds_uv_dma_writer);
// This signal gates the clock for all temper write and read dma.
// This should be used only when Temper is not used.
DEF_BIT(4, clk_dis_temper_dma);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalLp_ClockDisable>(0x48);
}
};
class IspGlobalLp_ClockGateDisable :
public hwreg::RegisterBase<IspGlobalLp_ClockGateDisable, uint32_t> {
public:
// when set, this will disable V-blank Clock gating for WDR path channels.
DEF_BIT(0, cg_dis_frame_stitch);
// when set, this will disable V-blank Clock gating for raw frontend.
DEF_BIT(1, cg_dis_raw_frontend);
// when set, this will disable V-blank Clock gating for defect pixel.
DEF_BIT(2, cg_dis_defect_pixel);
// when set, this will disable V-blank Clock gating for Sinter.
DEF_BIT(3, cg_dis_sinter);
// when set, this will disable V-blank Clock gating for Temper.
DEF_BIT(4, cg_dis_temper);
// when set, this will disable V-blank Clock gating for CA correction.
DEF_BIT(5, cg_dis_ca_correction);
// when set, this will disable V-blank Clock gating for radial shading.
DEF_BIT(6, cg_dis_radial_shading);
// when set, this will disable V-blank Clock gating for mesh shading.
DEF_BIT(7, cg_dis_mesh_shading);
// when set, this will disable V-blank Clock gating for Iridix.
DEF_BIT(8, cg_dis_iridix);
// when set, this will disable V-blank Clock gating for Demosaic RGGB.
DEF_BIT(9, cg_dis_demosaic_rggb);
// when set, this will disable V-blank Clock gating for Demosaic RGBIr.
DEF_BIT(10, cg_dis_demosaic_rgbir);
// when set, this will disable V-blank Clock gating for PF correction.
DEF_BIT(11, cg_dis_pf_correction);
// when set, this will disable V-blank Clock gating for CNR and
// pre-square root and post-square.
DEF_BIT(12, cg_dis_cnr);
// when set, this will disable V-blank Clock gating for 3D LUT.
DEF_BIT(13, cg_dis_3d_lut);
// when set, this will disable V-blank Clock gating for RGB scaler.
DEF_BIT(14, cg_dis_rgb_scaler);
// when set, this will disable V-blank Clock gating for RGB gamma in
// FR pipeline.
DEF_BIT(15, cg_dis_rgb_gamma_fr);
// when set, this will disable V-blank Clock gating for RGB gamma in
// DS pipeline.
DEF_BIT(16, cg_dis_rgb_gamma_ds);
// when set, this will disable V-blank Clock gating for sharpen in
// FR pipeline.
DEF_BIT(17, cg_dis_sharpen_fr);
// when set, this will disable V-blank Clock gating for sharpen in
// DS pipeline.
DEF_BIT(18, cg_dis_sharpen_ds);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalLp_ClockGateDisable>(0x4c);
}
};
class IspGlobalMonitor_Status :
public hwreg::RegisterBase<IspGlobalMonitor_Status, uint32_t> {
public:
// bit[0] : active width mismatch
// bit[1] : active_height mismatch
// bit[2] : minimum v-blank violated
// bit[3] : minimum h-blank violated
DEF_FIELD(3, 0, broken_frame_status);
// This signal indicates if ISP pipeline is busy or Not, This signal
// doesnt include the metereing modules.
// This information is expected to be used when a broken frame
// is detected and global_fsm_reset needs to be asserted
// global_fsm_reset must be set when this busy signal is low.
// 0: ISP main pipeline (excluding metering) is free
// 1: ISP main pipeline (excluding metering) is busy
DEF_BIT(16, fr_pipeline_busy);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalMonitor_Status>(0x50);
}
};
class IspGlobalMonitor_Failures :
public hwreg::RegisterBase<IspGlobalMonitor_Failures, uint32_t> {
public:
// [0] : temper_dma_lsb_wtr_axi_alarm
// [1] : temper_dma_lsb_rdr_axi_alarm
// [2] : temper_dma_msb_wtr_axi_alarm
// [3] : temper_dma_msb_rdr_axi_alarm
// [4] : FR UV dma axi alarm
// [5] : FR dma axi alarm
// [6] : DS UV dma axi alarm
// [7] : DS dma axi alarm
// [8] : Temper LSB dma frame dropped
// [9] : Temper MSB dma frame dropped
// [10]: FR UV-DMA frame dropped
// [11]: FR Y-DMA frame dropped
// [12]: DS UV-DMA frame dropped
// [13]: DS Y-DMA frame dropped
DEF_FIELD(29, 16, dma_alarms);
DEF_BIT(0, fr_y_dma_wfifo_fail_full);
DEF_BIT(1, fr_y_dma_wfifo_fail_empty);
DEF_BIT(2, fr_uv_dma_wfifo_fail_full);
DEF_BIT(3, fr_uv_dma_wfifo_fail_empty);
DEF_BIT(4, ds_y_dma_wfifo_fail_full);
DEF_BIT(5, ds_y_dma_wfifo_fail_empty);
DEF_BIT(6, ds_uv_dma_wfifo_fail_full);
DEF_BIT(7, ds_uv_dma_wfifo_fail_empty);
DEF_BIT(8, temper_dma_wfifo_fail_empty);
DEF_BIT(9, temper_dma_wfifo_fail_full);
DEF_BIT(10, temper_dma_rfifo_fail_empty);
DEF_BIT(11, temper_dma_rfifo_fail_full);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalMonitor_Failures>(0x54);
}
};
class IspGlobalMonitor_ClearError :
public hwreg::RegisterBase<IspGlobalMonitor_ClearError, uint32_t> {
public:
// This signal must be asserted when the MCu gets broken frame interrupt.
// this signal must be 0->1->0 pulse. The duration of the pulse
// is not relevant. This rising edge will clear the
// broken frame error status signal
DEF_BIT(0, broken_frame_error_clear);
// This signal must be asserted when the MCU gets the context error
// interrupt.
// this signal must be 0->1->0 pulse. The duration of the pulse
// is not relevant. This rising edge will clear the
// context error status signal
DEF_BIT(1, context_error_clr);
// This signal must be asserted when the MCU gets the DMA error interrupt.
// This signal will clear all DMA error status signals for all
// the output DMA writers (Y/UV DMAs in both of the output
// channels)
// MCU must follow the following sequance to clear the alarms
// step-1: set this bit to 1
// step-2: Read back the alarm signals
// step-3: If the alarms are cleared, then clear the clr_alarm
// signal back to 0.
DEF_BIT(2, output_dma_clr_alarm);
// This signal must be asserted when the MCU gets the DMA error interrupt.
// This signal will clear all DMA error status signals for all
// the Temper DMA writers/readers
// MCU must follow the following sequance to clear the alarms
// step-1: set this bit to 1
// step-2: Read back the alarm signals
DEF_BIT(3, temper_dma_clr_alarm);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalMonitor_ClearError>(0x58);
}
};
class IspGlobalMonitor_MaxAddressDelayLine :
public hwreg::RegisterBase<IspGlobalMonitor_MaxAddressDelayLine, uint32_t> {
public:
// Delay line max address value for the full resolution ISP set outside ISP
DEF_FIELD(15, 0, max_address_delay_line_fr);
// Delay line max address value for the DS pipeline set outside ISP
DEF_FIELD(31, 16, max_address_delay_line_ds);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalMonitor_MaxAddressDelayLine>(0x60);
}
};
class IspGlobalChickenBit : public hwreg::RegisterBase<IspGlobalChickenBit, uint32_t> {
public:
// 0: Only ISP main pipeline, ds pipeline and iridix filtering is
// used to generate the frame_done interrupt
// None of the metering done signals are considered here
// 1: all metering done is taken into account to generate the frame
// done interrupt
DEF_BIT(0, frame_end_select);
// 0: temper dma reader will start reading based on the frame start
// 1: temper dma reader will start reading based on linetick of the
// dma reader
DEF_BIT(1, rd_start_sel);
// 0=LSB aligned
// 1=MSB aligned
DEF_BIT(2, input_alignment);
// 0=Watch dog timer enabled
// 1=watch dog timer disabled
DEF_BIT(3, watchdog_timer_dis);
// 0 = When this chicken bit is et to 0, the soft reset (SW or HW
// generated) will be stretched by 1024 cycles
// so that it is asserted till the the pipeline delay of
// internal acl signals.
// 1 = When thiss set to 1, the soft reset will not be stretched
// internally. The SW must make sure its
// kept high enough.
DEF_BIT(4, soft_rst_apply_immediately);
// 0=timeout enabled. At the end of the frame, if the last data is
// not drained out from DMA writer within 4000
// AXI clock, cycle, DMA will flush the FIFO and ignore the
// remainign data.
// 1=timeout is disabled. If the last data is not drained out and
// the next frame starts coming in, DMA will drop the next frame
// and
// give an interrupt.
// If the timeout is disabled, its S/W responsibility to cancel
// the frame in all dma engines if frame drop interrupt comes.
DEF_BIT(5, dma_writer_timeout_disable);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalChickenBit>(0x64);
}
};
class IspGlobalParameterStatus :
public hwreg::RegisterBase<IspGlobalParameterStatus, uint32_t> {
public:
// 0: Demosaic RGBIr is present in the design
// 1: Demodaic RGBIr is statically removed from the ISP.
// S/W must not access the ISP_CONFIG_PING:demosaic rgbir
// and the ISP_CONFIG_PONG:demosaic rgbir registers
DEF_BIT(0, dmsc_rgbir);
// 0: CA Correction is present in the design
// 1: CA Correction is statically removed from the ISP.
// S/W must not access the ISP_CONFIG_PING:ca correction and the
// ISP_CONFIG_PONG:ca correction registers
// Also SW must not access the following memories
// - CA_CORRECTION_FILTER_PING_MEM
// - CA_CORRECTION_FILTER_PONG_MEM
// - CA_CORRECTION_MESH_PING_MEM
// - CA_CORRECTION_MESH_PONG_MEM
DEF_BIT(1, cac);
// 0: DS pipeline is present in the design
// 1: DS pipeline is statically removed from ISP.
// S/W must not access the following register spaces
// - ISP_CONFIG_PING:ds crop and ISP_CONFIG_PONG:ds crop
// - ISP_CONFIG_PING:ds scaler and ISP_CONFIG_PONG:ds scaler
// - ISP_CONFIG_PING:ds gamma rgb and ISP_CONFIG_PONG:ds gamma rgb
// - ISP_CONFIG_PING:ds sharpen and ISP_CONFIG_PONG:ds sharpen
// - ISP_CONFIG_PING:ds cs conv and ISP_CONFIG_PONG:ds cs conv
// - ISP_CONFIG_PING:ds dma writer and ISP_CONFIG_PONG:ds dma writer
// - ISP_CONFIG_PING:ds uv dma writer and ISP_CONFIG_PONG:ds
// uv dma writer
// Also the S/W must not access the following memories
// - DS_SCALER_HFILT_COEFMEM
// - DS_SCALER_VFILT_COEFMEM
// - DS_GAMMA_RGB_PING_MEM
// - DS_GAMMA_RGB_PONG_MEM
DEF_BIT(2, ds_pipe);
// 0: sRGB gamma and 3D LUT is present in the design
// 1: sRGB gamma and 3D LUT is statically removed from ISP.
// The S/W must not accees the following register spaces
// - ISP_CONFIG_PING:nonequ gamma and ISP_CONFIG_PING:
// nonequ gamma and
// Also, the S/W must not access the following memories
// - LUT3D_MEM
DEF_BIT(3, lut_3d);
// 0: SINTER2.5 used
// 1: SINTER3 used
DEF_BIT(4, sinter_version);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalParameterStatus>(0x68);
}
};
class IspGlobalDbg : public hwreg::RegisterBase<IspGlobalDbg, uint32_t> {
public:
// 0: debug signals are disabled
// 1: debug signals are valid
DEF_BIT(0, mode_en);
// must be 0->1->0 to clear the debug counters
DEF_BIT(8, clear_frame_cnt);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalDbg>(0x6c);
}
};
class IspGlobalDbg_FrameCntCtx0 :
public hwreg::RegisterBase<IspGlobalDbg_FrameCntCtx0, uint32_t> {
public:
// when debug mode is enabled, this register will show the frame
// count in context-0
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalDbg_FrameCntCtx0>(0x70);
}
};
class IspGlobalDbg_FrameCntCtx1 :
public hwreg::RegisterBase<IspGlobalDbg_FrameCntCtx1, uint32_t> {
public:
// when debug mode is enabled, this register will show the frame
// count in context-1
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalDbg_FrameCntCtx1>(0x74);
}
};
class IspGlobalDbg_FrameCntCtx2 :
public hwreg::RegisterBase<IspGlobalDbg_FrameCntCtx2, uint32_t> {
public:
// when debug mode is enabled, this register will show the frame
// count in context-2
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalDbg_FrameCntCtx2>(0x78);
}
};
class IspGlobalDbg_FrameCntCtx3 :
public hwreg::RegisterBase<IspGlobalDbg_FrameCntCtx3, uint32_t> {
public:
// when debug mode is enabled, this register will show the frame
// count in context-3
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<IspGlobalDbg_FrameCntCtx3>(0x7c);
}
};
class InputPort_Config0 : public hwreg::RegisterBase<InputPort_Config0, uint32_t> {
public:
// Allows selection of various input port presets for standard
// sensor inputs. See ISP Guide for details of available presets.
// 2: preset mode 2, check ISP guide for details
// 6: preset mode 6, check ISP guide for details others: reserved
DEF_FIELD(3, 0, preset);
// 0=use vsync_i port for vertical sync, 1=use field_i port for
// vertical sync
DEF_BIT(8, vs_use_field);
// 0=vsync is pulse-type, 1=vsync is toggle-type (field signal)
DEF_BIT(9, vs_toggle);
// 0=horizontal counter reset on rising edge, 1=horizontal counter
// reset on falling edge
DEF_BIT(10, vs_polarity);
// 0=don't invert polarity for ACL gate, 1=invert polarity for ACL gate
DEF_BIT(11, vs_polarity_acl);
// 0=use hsync_i port for active-line, 1=use acl_i port for active-line
DEF_BIT(12, hs_use_acl);
// 0=vertical counter counts on hs, 1=vertical counter counts on
// horizontal counter overflow or reset
DEF_BIT(14, vc_c_select);
// 0=vertical counter is reset on edge of vs, 1=vertical counter is
// reset after timeout on hs
DEF_BIT(15, vc_r_select);
// 0=normal mode, 1=hvalid = hsync XOR vsync
DEF_BIT(16, hs_xor_vs);
// 0=don't invert polarity of HS for ACL gate, 1=invert polarity of
// HS for ACL gate
DEF_BIT(17, hs_polarity);
// 0=don't invert polarity of HS for HS gate, 1=invert polarity of
// HS for HS gate
DEF_BIT(18, hs_polarity_acl);
// 0=horizontal counter is reset on rising edge of hs, 1=horizontal
// counter is reset on vsync (e.g. when hsync is not available)
DEF_BIT(19, hs_polarity_hs);
// 0=vertical counter increments on rising edge of HS, 1=vertical
// counter increments on falling edge of HS
DEF_BIT(20, hs_polarity_vc);
// 0=vertical counter is reset on rising edge of hs, 1=vertical
// counter is reset on rising edge of vs
DEF_BIT(23, hc_r_select);
// 0=don't invert acl_i for acl gate, 1=invert acl_i for acl gate
DEF_BIT(24, acl_polarity);
static auto Get() {
return hwreg::RegisterAddr<InputPort_Config0>(0x80);
}
};
class InputPort_Config1 : public hwreg::RegisterBase<InputPort_Config1, uint32_t> {
public:
// 0=don't invert field_i for field gate, 1=invert field_i for field gate
DEF_BIT(0, field_polarity);
// 0=field is pulse-type, 1=field is toggle-type
DEF_BIT(1, field_toggle);
// 0=exclude window0 signal in ACL gate, 1=include window0 signal in
// ACL gate
DEF_BIT(8, aclg_window0);
// 0=exclude hsync signal in ACL gate, 1=include hsync signal in ACL gate
DEF_BIT(9, aclg_hsync);
// 0=exclude window2 signal in ACL gate, 1=include window2 signal in
// ACL gate
DEF_BIT(10, aclg_window2);
// 0=exclude acl_i signal in ACL gate, 1=include acl_i signal in ACL gate
DEF_BIT(11, aclg_acl);
// 0=exclude vsync signal in ACL gate, 1=include vsync signal in ACL gate
DEF_BIT(12, aclg_vsync);
// 0=exclude window1 signal in HS gate, 1=include window1 signal in HS gate
DEF_BIT(16, hsg_window1);
// 0=exclude hsync signal in HS gate, 1=include hsync signal in HS gate
DEF_BIT(17, hsg_hsync);
// 0=exclude vsync signal in HS gate, 1=include vsync signal in HS gate
DEF_BIT(18, hsg_vsync);
// 0=exclude window2 signal in HS gate, 1=include window2 signal in
// HS gate (mask out spurious hs during blank)
DEF_BIT(19, hsg_window2);
// 0=exclude vsync signal in Field gate, 1=include vsync signal in
// Field gate
DEF_BIT(24, fieldg_vsync);
// 0=exclude window2 signal in Field gate, 1=include window2 signal
// in Field gate
DEF_BIT(25, fieldg_window2);
// 0=exclude field_i signal in Field gate, 1=include field_i signal
// in Field gate
DEF_BIT(26, fieldg_field);
// 0=pulse field, 1=toggle field
DEF_BIT(27, field_mode);
static auto Get() {
return hwreg::RegisterAddr<InputPort_Config1>(0x84);
}
};
class InputPort_HorizontalCrop0 :
public hwreg::RegisterBase<InputPort_HorizontalCrop0, uint32_t> {
public:
// horizontal counter limit value (counts:
// 0,1,...hc_limit-1,hc_limit,0,1,...)
DEF_FIELD(15, 0, hc_limit);
// window0 start for ACL gate. See ISP guide for further details.
DEF_FIELD(31, 16, hc_start0);
static auto Get() {
return hwreg::RegisterAddr<InputPort_HorizontalCrop0>(0x88);
}
};
class InputPort_HorizontalCrop1 :
public hwreg::RegisterBase<InputPort_HorizontalCrop1, uint32_t> {
public:
// window0 size for ACL gate. See ISP guide for further details.
DEF_FIELD(15, 0, hc_size0);
// window1 start for HS gate. See ISP guide for further details.
DEF_FIELD(31, 16, hc_start1);
static auto Get() {
return hwreg::RegisterAddr<InputPort_HorizontalCrop1>(0x8c);
}
};
class InputPort_VerticalCrop0 :
public hwreg::RegisterBase<InputPort_VerticalCrop0, uint32_t> {
public:
// window1 size for HS gate. See ISP guide for further details.
DEF_FIELD(15, 0, hc_size1);
// vertical counter limit value (counts: 0,1,...vc_limit-1,vc_limit,0,1,...)
DEF_FIELD(31, 16, vc_limit);
static auto Get() {
return hwreg::RegisterAddr<InputPort_VerticalCrop0>(0x90);
}
};
class InputPort_VerticalCrop1 :
public hwreg::RegisterBase<InputPort_VerticalCrop1, uint32_t> {
public:
// window2 start for ACL gate. See ISP guide for further details.
DEF_FIELD(15, 0, vc_start);
// window2 size for ACL gate. See ISP guide for further details.
DEF_FIELD(31, 16, vc_size);
static auto Get() {
return hwreg::RegisterAddr<InputPort_VerticalCrop1>(0x94);
}
};
class InputPort_FrameDim : public hwreg::RegisterBase<InputPort_FrameDim, uint32_t> {
public:
// detected frame width. Read only value.
DEF_FIELD(15, 0, frame_width);
// detected frame height. Read only value.
DEF_FIELD(31, 16, frame_height);
static auto Get() {
return hwreg::RegisterAddr<InputPort_FrameDim>(0x98);
}
};
class InputPort_Config3 : public hwreg::RegisterBase<InputPort_Config3, uint32_t> {
public:
// Used to stop and start input port. See ISP guide for further details.
// Only modes-0 and 1 are used. all other values are reserved
// (0=safe stop, 1=safe start, 2=Reserved 2, 3=Reserved 3,
// 4=Reserved 4, 5=Reserved 5, 6=Reserved 6, 7=Reserved 7)
DEF_FIELD(2, 0, mode_request);
// Used to freeze input port configuration. Used when multiple
// register writes are required to change input port configuration.
// (0=normal operation, 1=hold previous input port config state)
DEF_BIT(7, freeze_config);
static auto Get() {
return hwreg::RegisterAddr<InputPort_Config3>(0x9c);
}
};
class InputPort_ModeStatus : public hwreg::RegisterBase<InputPort_ModeStatus, uint32_t> {
public:
// Used to monitor input port status: bit 0: 1=running,
// 0=stopped, bits 1,2-reserved
DEF_FIELD(2, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPort_ModeStatus>(0xa0);
}
};
class InputPortFrameStats_StatsReset :
public hwreg::RegisterBase<InputPortFrameStats_StatsReset, uint32_t> {
public:
// Resets the frame statistics registers and starts the sampling
// period. Note all the frame statistics saturate at 2^31
DEF_BIT(0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_StatsReset>(0xa4);
}
};
class InputPortFrameStats_StatsHold :
public hwreg::RegisterBase<InputPortFrameStats_StatsHold, uint32_t> {
public:
// Synchronously disables the update of the statistics registers.
// This should be used prior to reading out the register values so
// as to ensure consistent values
DEF_BIT(0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_StatsHold>(0xa8);
}
};
class InputPortFrameStats_ActiveWidthMin :
public hwreg::RegisterBase<InputPortFrameStats_ActiveWidthMin, uint32_t> {
public:
// The minimum number of active pixels observed in a line within the
// sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_ActiveWidthMin>(0xb4);
}
};
class InputPortFrameStats_ActiveWidthMax :
public hwreg::RegisterBase<InputPortFrameStats_ActiveWidthMax, uint32_t> {
public:
// The maximum number of active pixels observed in a line within the
// sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_ActiveWidthMax>(0xb8);
}
};
class InputPortFrameStats_ActiveWidthSum :
public hwreg::RegisterBase<InputPortFrameStats_ActiveWidthSum, uint32_t> {
public:
// The total number of the active pixels values observed in a line
// within the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_ActiveWidthSum>(0xbc);
}
};
class InputPortFrameStats_ActiveWidthNum :
public hwreg::RegisterBase<InputPortFrameStats_ActiveWidthNum, uint32_t> {
public:
// The number of lines observed within the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_ActiveWidthNum>(0xc0);
}
};
class InputPortFrameStats_ActiveHeightMin :
public hwreg::RegisterBase<InputPortFrameStats_ActiveHeightMin, uint32_t> {
public:
// The minimum number of active lines in the frames observed within
// the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_ActiveHeightMin>(0xc4);
}
};
class InputPortFrameStats_ActiveHeightMax :
public hwreg::RegisterBase<InputPortFrameStats_ActiveHeightMax, uint32_t> {
public:
// The maximum number of active lines in the frames observed within
// the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_ActiveHeightMax>(0xc8);
}
};
class InputPortFrameStats_ActiveHeightSum :
public hwreg::RegisterBase<InputPortFrameStats_ActiveHeightSum, uint32_t> {
public:
// The total number of active lines in the frames observed within
// the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_ActiveHeightSum>(0xcc);
}
};
class InputPortFrameStats_ActiveHeightNum :
public hwreg::RegisterBase<InputPortFrameStats_ActiveHeightNum, uint32_t> {
public:
// The total number of frames observed within the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_ActiveHeightNum>(0xd0);
}
};
class InputPortFrameStats_HblankMin :
public hwreg::RegisterBase<InputPortFrameStats_HblankMin, uint32_t> {
public:
// The minimum number of horizontal blanking samples observed within
// the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_HblankMin>(0xd4);
}
};
class InputPortFrameStats_HblankMax :
public hwreg::RegisterBase<InputPortFrameStats_HblankMax, uint32_t> {
public:
// The maximum number of horizontal blanking samples observed within
// the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_HblankMax>(0xd8);
}
};
class InputPortFrameStats_HblankSum :
public hwreg::RegisterBase<InputPortFrameStats_HblankSum, uint32_t> {
public:
// The total number of the horizontal blanking samples observed
// within the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_HblankSum>(0xdc);
}
};
class InputPortFrameStats_HblankNum :
public hwreg::RegisterBase<InputPortFrameStats_HblankNum, uint32_t> {
public:
// The total number of the lines observed within the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_HblankNum>(0xe0);
}
};
class InputPortFrameStats_VblankMin :
public hwreg::RegisterBase<InputPortFrameStats_VblankMin, uint32_t> {
public:
// The minimum number of vertical blanking samples observed within
// the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_VblankMin>(0xe4);
}
};
class InputPortFrameStats_VblankMax :
public hwreg::RegisterBase<InputPortFrameStats_VblankMax, uint32_t> {
public:
// The maximum number of vertical blanking samples observed within
// the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_VblankMax>(0xe8);
}
};
class InputPortFrameStats_VblankSum :
public hwreg::RegisterBase<InputPortFrameStats_VblankSum, uint32_t> {
public:
// The total number of the vertical blanking samples observed within
// the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_VblankSum>(0xec);
}
};
class InputPortFrameStats_VblankNum :
public hwreg::RegisterBase<InputPortFrameStats_VblankNum, uint32_t> {
public:
// The total number of frames observed within the sampling period
DEF_FIELD(31, 0, value);
static auto Get() {
return hwreg::RegisterAddr<InputPortFrameStats_VblankNum>(0xf0);
}
};
} // namespace camera