ss928_framework/ss928sdk/include/ot_mipi_rx.h
2024-12-16 13:31:45 +08:00

272 lines
7.8 KiB
C
Executable File

/*
Copyright (c), 2001-2022, Shenshu Tech. Co., Ltd.
*/
#ifndef OT_MIPI_RX_H
#define OT_MIPI_RX_H
#include "osal_ioctl.h"
#ifdef __cplusplus
extern "C"{
#endif /* __cplusplus */
typedef unsigned int combo_dev_t;
typedef unsigned int sns_rst_source_t;
typedef unsigned int sns_clk_source_t;
#define MIPI_LANE_NUM 8
#define LVDS_LANE_NUM 8
#define WDR_VC_NUM 4
#define SYNC_CODE_NUM 4
#define MIPI_RX_MAX_DEV_NUM 4
#define SNS_MAX_CLK_SOURCE_NUM 4
#define SNS_MAX_RST_SOURCE_NUM 4
#define MAX_EXT_DATA_TYPE_NUM 3
#ifdef OT_MIPI_DEBUG
#define ot_msg(x...) \
do { \
osal_printk("%s->%d: ", __FUNCTION__, __LINE__); \
osal_printk(x); \
osal_printk("\n"); \
} while (0)
#else
#define ot_msg(args...) \
do { \
} while (0)
#endif
#define ot_err(x...) \
do { \
osal_printk("%s(%d): ", __FUNCTION__, __LINE__); \
osal_printk(x); \
} while (0)
#define mipi_rx_unused(x) ((void)x)
typedef enum {
LANE_DIVIDE_MODE_0 = 0, /* 8lane */
LANE_DIVIDE_MODE_1 = 1, /* 4lane + 4lane */
LANE_DIVIDE_MODE_2 = 2, /* 4lane + 2lane +2lane */
LANE_DIVIDE_MODE_3 = 3, /* 2lane + 2lane + 2lane + 2lane */
LANE_DIVIDE_MODE_BUTT
} lane_divide_mode_t;
typedef enum {
WORK_MODE_LVDS = 0x0,
WORK_MODE_MIPI = 0x1,
WORK_MODE_CMOS = 0x2,
WORK_MODE_BT1120 = 0x3,
WORK_MODE_SLVS = 0x4,
WORK_MODE_BUTT
} work_mode_t;
typedef enum {
INPUT_MODE_MIPI = 0x0, /* mipi */
INPUT_MODE_SUBLVDS = 0x1, /* SUB_LVDS */
INPUT_MODE_LVDS = 0x2, /* LVDS */
INPUT_MODE_HISPI = 0x3, /* HISPI */
INPUT_MODE_BUTT
} input_mode_t;
typedef enum {
MIPI_DATA_RATE_X1 = 0, /* output 1 pixel per clock */
MIPI_DATA_RATE_X2 = 1, /* output 2 pixel per clock */
MIPI_DATA_RATE_BUTT
} mipi_data_rate_t;
typedef struct {
int x;
int y;
unsigned int width;
unsigned int height;
} img_rect_t;
typedef struct {
unsigned int width;
unsigned int height;
} img_size_t;
typedef enum {
DATA_TYPE_RAW_8BIT = 0,
DATA_TYPE_RAW_10BIT,
DATA_TYPE_RAW_12BIT,
DATA_TYPE_RAW_14BIT,
DATA_TYPE_RAW_16BIT,
DATA_TYPE_YUV420_8BIT_NORMAL,
DATA_TYPE_YUV420_8BIT_LEGACY,
DATA_TYPE_YUV422_8BIT,
DATA_TYPE_YUV422_PACKED, /* yuv422 8bit transform user define 16bit raw */
DATA_TYPE_BUTT
} data_type_t;
typedef struct {
combo_dev_t devno;
unsigned int num;
unsigned int ext_data_bit_width[MAX_EXT_DATA_TYPE_NUM];
unsigned int ext_data_type[MAX_EXT_DATA_TYPE_NUM];
} ext_data_type_t;
/* MIPI D_PHY WDR MODE defines */
typedef enum {
OT_MIPI_WDR_MODE_NONE = 0x0,
OT_MIPI_WDR_MODE_VC = 0x1, /* Virtual Channel */
OT_MIPI_WDR_MODE_DT = 0x2, /* Data Type */
OT_MIPI_WDR_MODE_DOL = 0x3, /* DOL Mode */
OT_MIPI_WDR_MODE_BUTT
} mipi_wdr_mode_t;
typedef struct {
data_type_t input_data_type; /* data type: 8/10/12/14/16 bit */
mipi_wdr_mode_t wdr_mode; /* MIPI WDR mode */
short lane_id[MIPI_LANE_NUM]; /* lane_id: -1 - disable */
union {
short data_type[WDR_VC_NUM]; /* attribute of MIPI WDR mode. AUTO:mipi_wdr_mode_t:OT_MIPI_WDR_MODE_DT; */
};
} mipi_dev_attr_t;
typedef enum {
OT_LVDS_WDR_MODE_NONE = 0x0,
OT_LVDS_WDR_MODE_2F = 0x1,
OT_LVDS_WDR_MODE_3F = 0x2,
OT_LVDS_WDR_MODE_4F = 0x3,
OT_LVDS_WDR_MODE_DOL_2F = 0x4,
OT_LVDS_WDR_MODE_DOL_3F = 0x5,
OT_LVDS_WDR_MODE_DOL_4F = 0x6,
OT_LVDS_WDR_MODE_BUTT
} lvds_wdr_mode_t;
typedef enum {
LVDS_SYNC_MODE_SOF = 0, /* sensor SOL, EOL, SOF, EOF */
LVDS_SYNC_MODE_SAV, /* SAV, EAV */
LVDS_SYNC_MODE_BUTT
} lvds_sync_mode_t;
typedef enum {
LVDS_VSYNC_NORMAL = 0x00,
LVDS_VSYNC_SHARE = 0x01,
LVDS_VSYNC_HCONNECT = 0x02,
LVDS_VSYNC_BUTT
} lvds_vsync_type_t;
typedef struct {
lvds_vsync_type_t sync_type;
/* hconnect vsync blanking len, valid when the sync_type is LVDS_VSYNC_HCONNECT */
unsigned short hblank1;
unsigned short hblank2;
} lvds_vsync_attr_t;
typedef enum {
LVDS_FID_NONE = 0x00,
LVDS_FID_IN_SAV = 0x01, /* frame identification id in SAV 4th */
LVDS_FID_IN_DATA = 0x02, /* frame identification id in first data */
LVDS_FID_BUTT
} lvds_fid_type_t;
typedef struct {
lvds_fid_type_t fid_type;
/* Sony DOL has the Frame Information Line, in DOL H-Connection mode,
should configure this flag as false to disable output the Frame Information Line */
unsigned char output_fil;
} lvds_fid_attr_t;
typedef enum {
LVDS_ENDIAN_LITTLE = 0x0,
LVDS_ENDIAN_BIG = 0x1,
LVDS_ENDIAN_BUTT
} lvds_bit_endian_t;
typedef struct {
data_type_t input_data_type; /* data type: 8/10/12/14 bit */
lvds_wdr_mode_t wdr_mode; /* WDR mode */
lvds_sync_mode_t sync_mode; /* sync mode: SOF, SAV */
lvds_vsync_attr_t vsync_attr; /* normal, share, hconnect */
lvds_fid_attr_t fid_attr; /* frame identification code */
lvds_bit_endian_t data_endian; /* data endian: little/big */
lvds_bit_endian_t sync_code_endian; /* sync code endian: little/big */
short lane_id[LVDS_LANE_NUM]; /* lane_id: -1 - disable */
/* each vc has 4 params, sync_code[i]:
sync_mode is SYNC_MODE_SOF: SOF, EOF, SOL, EOL
sync_mode is SYNC_MODE_SAV: invalid sav, invalid eav, valid sav, valid eav */
unsigned short sync_code[LVDS_LANE_NUM][WDR_VC_NUM][SYNC_CODE_NUM];
} lvds_dev_attr_t;
typedef struct {
combo_dev_t devno; /* device number */
input_mode_t input_mode; /* input mode: MIPI/LVDS/SUBLVDS/HISPI/DC */
mipi_data_rate_t data_rate;
img_rect_t img_rect; /* MIPI Rx device crop area (corresponding to the original sensor input image size) */
union {
mipi_dev_attr_t mipi_attr; /* attribute of MIPI interface. AUTO:input_mode_t:INPUT_MODE_MIPI; */
lvds_dev_attr_t lvds_attr; /* attribute of MIPI interface. AUTO:input_mode_t:INPUT_MODE_LVDS; */
};
} combo_dev_attr_t;
typedef enum {
PHY_CMV_GE1200MV = 0x00,
PHY_CMV_LT1200MV = 0x01,
PHY_CMV_BUTT
} phy_cmv_mode_t;
typedef struct {
combo_dev_t devno;
phy_cmv_mode_t cmv_mode;
} phy_cmv_t;
#define OT_MIPI_IOC_MAGIC 'm'
/* init data lane, input mode, data type */
#define OT_MIPI_SET_DEV_ATTR _IOW(OT_MIPI_IOC_MAGIC, 0x01, combo_dev_attr_t)
/* set phy common mode voltage mode */
#define OT_MIPI_SET_PHY_CMVMODE _IOW(OT_MIPI_IOC_MAGIC, 0x04, phy_cmv_t)
/* reset sensor */
#define OT_MIPI_RESET_SENSOR _IOW(OT_MIPI_IOC_MAGIC, 0x05, sns_rst_source_t)
/* unreset sensor */
#define OT_MIPI_UNRESET_SENSOR _IOW(OT_MIPI_IOC_MAGIC, 0x06, sns_rst_source_t)
/* reset mipi */
#define OT_MIPI_RESET_MIPI _IOW(OT_MIPI_IOC_MAGIC, 0x07, combo_dev_t)
/* unreset mipi */
#define OT_MIPI_UNRESET_MIPI _IOW(OT_MIPI_IOC_MAGIC, 0x08, combo_dev_t)
/* set mipi hs_mode */
#define OT_MIPI_SET_HS_MODE _IOW(OT_MIPI_IOC_MAGIC, 0x0b, lane_divide_mode_t)
/* enable mipi clock */
#define OT_MIPI_ENABLE_MIPI_CLOCK _IOW(OT_MIPI_IOC_MAGIC, 0x0c, combo_dev_t)
/* disable mipi clock */
#define OT_MIPI_DISABLE_MIPI_CLOCK _IOW(OT_MIPI_IOC_MAGIC, 0x0d, combo_dev_t)
/* enable sensor clock */
#define OT_MIPI_ENABLE_SENSOR_CLOCK _IOW(OT_MIPI_IOC_MAGIC, 0x10, sns_clk_source_t)
/* disable sensor clock */
#define OT_MIPI_DISABLE_SENSOR_CLOCK _IOW(OT_MIPI_IOC_MAGIC, 0x11, sns_clk_source_t)
#define OT_MIPI_SET_EXT_DATA_TYPE _IOW(OT_MIPI_IOC_MAGIC, 0x12, ext_data_type_t)
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* OT_MIPI_RX_H */