| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * stf_isp.h |
| * |
| * StarFive Camera Subsystem - ISP Module |
| * |
| * Copyright (C) 2021-2023 StarFive Technology Co., Ltd. |
| */ |
| |
| #ifndef STF_ISP_H |
| #define STF_ISP_H |
| |
| #include <media/v4l2-subdev.h> |
| |
| #include "stf-video.h" |
| |
| #define ISP_RAW_DATA_BITS 12 |
| #define SCALER_RATIO_MAX 1 |
| #define STF_ISP_REG_OFFSET_MAX 0x0fff |
| #define STF_ISP_REG_DELAY_MAX 100 |
| |
| /* isp registers */ |
| #define ISP_REG_CSI_INPUT_EN_AND_STATUS 0x000 |
| #define CSI_SCD_ERR BIT(6) |
| #define CSI_ITU656_ERR BIT(4) |
| #define CSI_ITU656_F BIT(3) |
| #define CSI_SCD_DONE BIT(2) |
| #define CSI_BUSY_S BIT(1) |
| #define CSI_EN_S BIT(0) |
| |
| #define ISP_REG_CSIINTS 0x008 |
| #define CSI_INTS(n) ((n) << 16) |
| #define CSI_SHA_M(n) ((n) << 0) |
| #define CSI_INTS_MASK GENMASK(17, 16) |
| |
| #define ISP_REG_CSI_MODULE_CFG 0x010 |
| #define CSI_DUMP_EN BIT(19) |
| #define CSI_VS_EN BIT(18) |
| #define CSI_SC_EN BIT(17) |
| #define CSI_OBA_EN BIT(16) |
| #define CSI_AWB_EN BIT(7) |
| #define CSI_LCCF_EN BIT(6) |
| #define CSI_OECFHM_EN BIT(5) |
| #define CSI_OECF_EN BIT(4) |
| #define CSI_LCBQ_EN BIT(3) |
| #define CSI_OBC_EN BIT(2) |
| #define CSI_DEC_EN BIT(1) |
| #define CSI_DC_EN BIT(0) |
| |
| #define ISP_REG_SENSOR 0x014 |
| #define DVP_SYNC_POL(n) ((n) << 2) |
| #define ITU656_EN(n) ((n) << 1) |
| #define IMAGER_SEL(n) ((n) << 0) |
| |
| #define ISP_REG_RAW_FORMAT_CFG 0x018 |
| #define SMY13(n) ((n) << 14) |
| #define SMY12(n) ((n) << 12) |
| #define SMY11(n) ((n) << 10) |
| #define SMY10(n) ((n) << 8) |
| #define SMY3(n) ((n) << 6) |
| #define SMY2(n) ((n) << 4) |
| #define SMY1(n) ((n) << 2) |
| #define SMY0(n) ((n) << 0) |
| |
| #define ISP_REG_PIC_CAPTURE_START_CFG 0x01c |
| #define VSTART_CAP(n) ((n) << 16) |
| #define HSTART_CAP(n) ((n) << 0) |
| |
| #define ISP_REG_PIC_CAPTURE_END_CFG 0x020 |
| #define VEND_CAP(n) ((n) << 16) |
| #define HEND_CAP(n) ((n) << 0) |
| |
| #define ISP_REG_DUMP_CFG_0 0x024 |
| #define ISP_REG_DUMP_CFG_1 0x028 |
| #define DUMP_ID(n) ((n) << 24) |
| #define DUMP_SHT(n) ((n) << 20) |
| #define DUMP_BURST_LEN(n) ((n) << 16) |
| #define DUMP_SD(n) ((n) << 0) |
| #define DUMP_BURST_LEN_MASK GENMASK(17, 16) |
| #define DUMP_SD_MASK GENMASK(15, 0) |
| |
| #define ISP_REG_DEC_CFG 0x030 |
| #define DEC_V_KEEP(n) ((n) << 24) |
| #define DEC_V_PERIOD(n) ((n) << 16) |
| #define DEC_H_KEEP(n) ((n) << 8) |
| #define DEC_H_PERIOD(n) ((n) << 0) |
| |
| #define ISP_REG_OBC_CFG 0x034 |
| #define OBC_W_H(y) ((y) << 4) |
| #define OBC_W_W(x) ((x) << 0) |
| |
| #define ISP_REG_DC_CFG_1 0x044 |
| #define DC_AXI_ID(n) ((n) << 0) |
| |
| #define ISP_REG_LCCF_CFG_0 0x050 |
| #define Y_DISTANCE(y) ((y) << 16) |
| #define X_DISTANCE(x) ((x) << 0) |
| |
| #define ISP_REG_LCCF_CFG_1 0x058 |
| #define LCCF_MAX_DIS(n) ((n) << 0) |
| |
| #define ISP_REG_LCBQ_CFG_0 0x074 |
| #define H_LCBQ(y) ((y) << 12) |
| #define W_LCBQ(x) ((x) << 8) |
| |
| #define ISP_REG_LCBQ_CFG_1 0x07c |
| #define Y_COOR(y) ((y) << 16) |
| #define X_COOR(x) ((x) << 0) |
| |
| #define ISP_REG_LCCF_CFG_2 0x0e0 |
| #define ISP_REG_LCCF_CFG_3 0x0e4 |
| #define ISP_REG_LCCF_CFG_4 0x0e8 |
| #define ISP_REG_LCCF_CFG_5 0x0ec |
| #define LCCF_F2_PAR(n) ((n) << 16) |
| #define LCCF_F1_PAR(n) ((n) << 0) |
| |
| #define ISP_REG_OECF_X0_CFG0 0x100 |
| #define ISP_REG_OECF_X0_CFG1 0x104 |
| #define ISP_REG_OECF_X0_CFG2 0x108 |
| #define ISP_REG_OECF_X0_CFG3 0x10c |
| #define ISP_REG_OECF_X0_CFG4 0x110 |
| #define ISP_REG_OECF_X0_CFG5 0x114 |
| #define ISP_REG_OECF_X0_CFG6 0x118 |
| #define ISP_REG_OECF_X0_CFG7 0x11c |
| |
| #define ISP_REG_OECF_Y3_CFG0 0x1e0 |
| #define ISP_REG_OECF_Y3_CFG1 0x1e4 |
| #define ISP_REG_OECF_Y3_CFG2 0x1e8 |
| #define ISP_REG_OECF_Y3_CFG3 0x1ec |
| #define ISP_REG_OECF_Y3_CFG4 0x1f0 |
| #define ISP_REG_OECF_Y3_CFG5 0x1f4 |
| #define ISP_REG_OECF_Y3_CFG6 0x1f8 |
| #define ISP_REG_OECF_Y3_CFG7 0x1fc |
| |
| #define ISP_REG_OECF_S0_CFG0 0x200 |
| #define ISP_REG_OECF_S3_CFG7 0x27c |
| #define OCEF_PAR_H(n) ((n) << 16) |
| #define OCEF_PAR_L(n) ((n) << 0) |
| |
| #define ISP_REG_AWB_X0_CFG_0 0x280 |
| #define ISP_REG_AWB_X0_CFG_1 0x284 |
| #define ISP_REG_AWB_X1_CFG_0 0x288 |
| #define ISP_REG_AWB_X1_CFG_1 0x28c |
| #define ISP_REG_AWB_X2_CFG_0 0x290 |
| #define ISP_REG_AWB_X2_CFG_1 0x294 |
| #define ISP_REG_AWB_X3_CFG_0 0x298 |
| #define ISP_REG_AWB_X3_CFG_1 0x29c |
| #define AWB_X_SYMBOL_H(n) ((n) << 16) |
| #define AWB_X_SYMBOL_L(n) ((n) << 0) |
| |
| #define ISP_REG_AWB_Y0_CFG_0 0x2a0 |
| #define ISP_REG_AWB_Y0_CFG_1 0x2a4 |
| #define ISP_REG_AWB_Y1_CFG_0 0x2a8 |
| #define ISP_REG_AWB_Y1_CFG_1 0x2ac |
| #define ISP_REG_AWB_Y2_CFG_0 0x2b0 |
| #define ISP_REG_AWB_Y2_CFG_1 0x2b4 |
| #define ISP_REG_AWB_Y3_CFG_0 0x2b8 |
| #define ISP_REG_AWB_Y3_CFG_1 0x2bc |
| #define AWB_Y_SYMBOL_H(n) ((n) << 16) |
| #define AWB_Y_SYMBOL_L(n) ((n) << 0) |
| |
| #define ISP_REG_AWB_S0_CFG_0 0x2c0 |
| #define ISP_REG_AWB_S0_CFG_1 0x2c4 |
| #define ISP_REG_AWB_S1_CFG_0 0x2c8 |
| #define ISP_REG_AWB_S1_CFG_1 0x2cc |
| #define ISP_REG_AWB_S2_CFG_0 0x2d0 |
| #define ISP_REG_AWB_S2_CFG_1 0x2d4 |
| #define ISP_REG_AWB_S3_CFG_0 0x2d8 |
| #define ISP_REG_AWB_S3_CFG_1 0x2dc |
| #define AWB_S_SYMBOL_H(n) ((n) << 16) |
| #define AWB_S_SYMBOL_L(n) ((n) << 0) |
| |
| #define ISP_REG_OBCG_CFG_0 0x2e0 |
| #define ISP_REG_OBCG_CFG_1 0x2e4 |
| #define ISP_REG_OBCG_CFG_2 0x2e8 |
| #define ISP_REG_OBCG_CFG_3 0x2ec |
| #define ISP_REG_OBCO_CFG_0 0x2f0 |
| #define ISP_REG_OBCO_CFG_1 0x2f4 |
| #define ISP_REG_OBCO_CFG_2 0x2f8 |
| #define ISP_REG_OBCO_CFG_3 0x2fc |
| #define GAIN_D_POINT(x) ((x) << 24) |
| #define GAIN_C_POINT(x) ((x) << 16) |
| #define GAIN_B_POINT(x) ((x) << 8) |
| #define GAIN_A_POINT(x) ((x) << 0) |
| #define OFFSET_D_POINT(x) ((x) << 24) |
| #define OFFSET_C_POINT(x) ((x) << 16) |
| #define OFFSET_B_POINT(x) ((x) << 8) |
| #define OFFSET_A_POINT(x) ((x) << 0) |
| |
| #define ISP_REG_ISP_CTRL_0 0xa00 |
| #define ISPC_LINE BIT(27) |
| #define ISPC_SC BIT(26) |
| #define ISPC_CSI BIT(25) |
| #define ISPC_ISP BIT(24) |
| #define ISPC_ENUO BIT(20) |
| #define ISPC_ENLS BIT(17) |
| #define ISPC_ENSS1 BIT(12) |
| #define ISPC_ENSS0 BIT(11) |
| #define ISPC_RST BIT(1) |
| #define ISPC_EN BIT(0) |
| #define ISPC_RST_MASK BIT(1) |
| #define ISPC_INT_ALL_MASK GENMASK(27, 24) |
| |
| #define ISP_REG_ISP_CTRL_1 0xa08 |
| #define CTRL_SAT(n) ((n) << 28) |
| #define CTRL_DBC BIT(22) |
| #define CTRL_CTC BIT(21) |
| #define CTRL_YHIST BIT(20) |
| #define CTRL_YCURVE BIT(19) |
| #define CTRL_CTM BIT(18) |
| #define CTRL_BIYUV BIT(17) |
| #define CTRL_SCE BIT(8) |
| #define CTRL_EE BIT(7) |
| #define CTRL_CCE BIT(5) |
| #define CTRL_RGE BIT(4) |
| #define CTRL_CME BIT(3) |
| #define CTRL_AE BIT(2) |
| #define CTRL_CE BIT(1) |
| #define CTRL_SAT_MASK GENMASK(31, 28) |
| |
| #define ISP_REG_PIPELINE_XY_SIZE 0xa0c |
| #define H_ACT_CAP(n) ((n) << 16) |
| #define W_ACT_CAP(n) ((n) << 0) |
| |
| #define ISP_REG_ICTC 0xa10 |
| #define GF_MODE(n) ((n) << 30) |
| #define MAXGT(n) ((n) << 16) |
| #define MINGT(n) ((n) << 0) |
| |
| #define ISP_REG_IDBC 0xa14 |
| #define BADGT(n) ((n) << 16) |
| #define BADXT(n) ((n) << 0) |
| |
| #define ISP_REG_ICFAM 0xa1c |
| #define CROSS_COV(n) ((n) << 4) |
| #define HV_W(n) ((n) << 0) |
| |
| #define ISP_REG_CS_GAIN 0xa30 |
| #define CMAD(n) ((n) << 16) |
| #define CMAB(n) ((n) << 0) |
| |
| #define ISP_REG_CS_THRESHOLD 0xa34 |
| #define CMD(n) ((n) << 16) |
| #define CMB(n) ((n) << 0) |
| |
| #define ISP_REG_CS_OFFSET 0xa38 |
| #define VOFF(n) ((n) << 16) |
| #define UOFF(n) ((n) << 0) |
| |
| #define ISP_REG_CS_HUE_F 0xa3c |
| #define SIN(n) ((n) << 16) |
| #define COS(n) ((n) << 0) |
| |
| #define ISP_REG_CS_SCALE 0xa40 |
| |
| #define ISP_REG_IESHD 0xa50 |
| #define SHAD_UP_M BIT(1) |
| #define SHAD_UP_EN BIT(0) |
| |
| #define ISP_REG_YADJ0 0xa54 |
| #define YOIR(n) ((n) << 16) |
| #define YIMIN(n) ((n) << 0) |
| |
| #define ISP_REG_YADJ1 0xa58 |
| #define YOMAX(n) ((n) << 16) |
| #define YOMIN(n) ((n) << 0) |
| |
| #define ISP_REG_Y_PLANE_START_ADDR 0xa80 |
| #define ISP_REG_UV_PLANE_START_ADDR 0xa84 |
| #define ISP_REG_STRIDE 0xa88 |
| |
| #define ISP_REG_ITIIWSR 0xb20 |
| #define ITI_HSIZE(n) ((n) << 16) |
| #define ITI_WSIZE(n) ((n) << 0) |
| |
| #define ISP_REG_ITIDWLSR 0xb24 |
| #define ISP_REG_ITIPDFR 0xb38 |
| #define ISP_REG_ITIDRLSR 0xb3C |
| |
| #define ISP_REG_DNYUV_YSWR0 0xc00 |
| #define ISP_REG_DNYUV_YSWR1 0xc04 |
| #define ISP_REG_DNYUV_CSWR0 0xc08 |
| #define ISP_REG_DNYUV_CSWR1 0xc0c |
| #define YUVSW5(n) ((n) << 20) |
| #define YUVSW4(n) ((n) << 16) |
| #define YUVSW3(n) ((n) << 12) |
| #define YUVSW2(n) ((n) << 8) |
| #define YUVSW1(n) ((n) << 4) |
| #define YUVSW0(n) ((n) << 0) |
| |
| #define ISP_REG_DNYUV_YDR0 0xc10 |
| #define ISP_REG_DNYUV_YDR1 0xc14 |
| #define ISP_REG_DNYUV_YDR2 0xc18 |
| #define ISP_REG_DNYUV_CDR0 0xc1c |
| #define ISP_REG_DNYUV_CDR1 0xc20 |
| #define ISP_REG_DNYUV_CDR2 0xc24 |
| #define CURVE_D_H(n) ((n) << 16) |
| #define CURVE_D_L(n) ((n) << 0) |
| |
| #define ISP_REG_ICAMD_0 0xc40 |
| #define ISP_REG_ICAMD_12 0xc70 |
| #define ISP_REG_ICAMD_20 0xc90 |
| #define ISP_REG_ICAMD_24 0xca0 |
| #define ISP_REG_ICAMD_25 0xca4 |
| #define DNRM_F(n) ((n) << 16) |
| #define CCM_M_DAT(n) ((n) << 0) |
| |
| #define ISP_REG_GAMMA_VAL0 0xe00 |
| #define ISP_REG_GAMMA_VAL1 0xe04 |
| #define ISP_REG_GAMMA_VAL2 0xe08 |
| #define ISP_REG_GAMMA_VAL3 0xe0c |
| #define ISP_REG_GAMMA_VAL4 0xe10 |
| #define ISP_REG_GAMMA_VAL5 0xe14 |
| #define ISP_REG_GAMMA_VAL6 0xe18 |
| #define ISP_REG_GAMMA_VAL7 0xe1c |
| #define ISP_REG_GAMMA_VAL8 0xe20 |
| #define ISP_REG_GAMMA_VAL9 0xe24 |
| #define ISP_REG_GAMMA_VAL10 0xe28 |
| #define ISP_REG_GAMMA_VAL11 0xe2c |
| #define ISP_REG_GAMMA_VAL12 0xe30 |
| #define ISP_REG_GAMMA_VAL13 0xe34 |
| #define ISP_REG_GAMMA_VAL14 0xe38 |
| #define GAMMA_S_VAL(n) ((n) << 16) |
| #define GAMMA_VAL(n) ((n) << 0) |
| |
| #define ISP_REG_R2Y_0 0xe40 |
| #define ISP_REG_R2Y_1 0xe44 |
| #define ISP_REG_R2Y_2 0xe48 |
| #define ISP_REG_R2Y_3 0xe4c |
| #define ISP_REG_R2Y_4 0xe50 |
| #define ISP_REG_R2Y_5 0xe54 |
| #define ISP_REG_R2Y_6 0xe58 |
| #define ISP_REG_R2Y_7 0xe5c |
| #define ISP_REG_R2Y_8 0xe60 |
| |
| #define ISP_REG_SHARPEN0 0xe80 |
| #define ISP_REG_SHARPEN1 0xe84 |
| #define ISP_REG_SHARPEN2 0xe88 |
| #define ISP_REG_SHARPEN3 0xe8c |
| #define ISP_REG_SHARPEN4 0xe90 |
| #define ISP_REG_SHARPEN5 0xe94 |
| #define ISP_REG_SHARPEN6 0xe98 |
| #define ISP_REG_SHARPEN7 0xe9c |
| #define ISP_REG_SHARPEN8 0xea0 |
| #define ISP_REG_SHARPEN9 0xea4 |
| #define ISP_REG_SHARPEN10 0xea8 |
| #define ISP_REG_SHARPEN11 0xeac |
| #define ISP_REG_SHARPEN12 0xeb0 |
| #define ISP_REG_SHARPEN13 0xeb4 |
| #define ISP_REG_SHARPEN14 0xeb8 |
| #define S_DELTA(n) ((n) << 16) |
| #define S_WEIGHT(n) ((n) << 8) |
| |
| #define ISP_REG_SHARPEN_FS0 0xebc |
| #define ISP_REG_SHARPEN_FS1 0xec0 |
| #define ISP_REG_SHARPEN_FS2 0xec4 |
| #define ISP_REG_SHARPEN_FS3 0xec8 |
| #define ISP_REG_SHARPEN_FS4 0xecc |
| #define ISP_REG_SHARPEN_FS5 0xed0 |
| #define S_FACTOR(n) ((n) << 24) |
| #define S_SLOPE(n) ((n) << 0) |
| |
| #define ISP_REG_SHARPEN_WN 0xed4 |
| #define PDIRF(n) ((n) << 28) |
| #define NDIRF(n) ((n) << 24) |
| #define WSUM(n) ((n) << 0) |
| |
| #define ISP_REG_IUVS1 0xed8 |
| #define UVDIFF2(n) ((n) << 16) |
| #define UVDIFF1(n) ((n) << 0) |
| |
| #define ISP_REG_IUVS2 0xedc |
| #define UVF(n) ((n) << 24) |
| #define UVSLOPE(n) ((n) << 0) |
| |
| #define ISP_REG_IUVCKS1 0xee0 |
| #define UVCKDIFF2(n) ((n) << 16) |
| #define UVCKDIFF1(n) ((n) << 0) |
| |
| #define ISP_REG_IUVCKS2 0xee4 |
| |
| #define ISP_REG_ISHRPET 0xee8 |
| #define TH(n) ((n) << 8) |
| #define EN(n) ((n) << 0) |
| |
| #define ISP_REG_YCURVE_0 0xf00 |
| #define ISP_REG_YCURVE_63 0xffc |
| |
| #define IMAGE_MAX_WIDTH 1920 |
| #define IMAGE_MAX_HEIGH 1080 |
| |
| /* pad id for media framework */ |
| enum stf_isp_pad_id { |
| STF_ISP_PAD_SINK = 0, |
| STF_ISP_PAD_SRC, |
| STF_ISP_PAD_MAX |
| }; |
| |
| struct stf_isp_format { |
| u32 code; |
| u8 bpp; |
| }; |
| |
| struct stf_isp_format_table { |
| const struct stf_isp_format *fmts; |
| int nfmts; |
| }; |
| |
| struct stf_isp_dev { |
| struct stfcamss *stfcamss; |
| struct v4l2_subdev subdev; |
| struct media_pad pads[STF_ISP_PAD_MAX]; |
| const struct stf_isp_format_table *formats; |
| unsigned int nformats; |
| struct v4l2_subdev *source_subdev; |
| const struct stf_isp_format *current_fmt; |
| }; |
| |
| int stf_isp_reset(struct stf_isp_dev *isp_dev); |
| void stf_isp_init_cfg(struct stf_isp_dev *isp_dev); |
| void stf_isp_settings(struct stf_isp_dev *isp_dev, |
| struct v4l2_rect *crop, u32 mcode); |
| void stf_isp_stream_set(struct stf_isp_dev *isp_dev); |
| int stf_isp_init(struct stfcamss *stfcamss); |
| int stf_isp_register(struct stf_isp_dev *isp_dev, struct v4l2_device *v4l2_dev); |
| int stf_isp_unregister(struct stf_isp_dev *isp_dev); |
| |
| #endif /* STF_ISP_H */ |