multimedia/device/mpp/include/hi_mipi.h

257 lines
7.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef __HI_MIPI__
#define __HI_MIPI__
#include "hi_type.h"
typedef unsigned int MIPI_PHY;
typedef unsigned int COMBO_LINK;
#define LVDS_MIN_WIDTH 32
#define LVDS_MIN_HEIGHT 32
#define COMBO_MAX_LINK_NUM 2 /* hi3518ev200 has 1 links, For compatibility of Hi3516A, use 2 */
#define COMBO_MAX_LANE_NUM 8
#define LANE_NUM_PER_LINK 4 /* one link has 4 lanes */
#define MIPI_LANE_NUM COMBO_MAX_LANE_NUM /* hi3518ev200 support 1 link mipi only, For compatibility of Hi3516A, use 2*/
#define LVDS_LANE_NUM COMBO_MAX_LANE_NUM /* hi3518ev200 has 1 links, so has 4 lanes. For compatibility of Hi3516A, use 8 */
#define WDR_VC_NUM 4
#define SYNC_CODE_NUM 4
/* int mask */
#define COMBO_LINK_INT_DEF (0x00200000)
#define COMBO_LINK_INT_MASK (0x300000)
//~(COMBO_LINK_INT_DEF) /* 0: enable int */
#define MIPI_INT1_INT_DEF (0x1000fff0)
//#define MIPI_INT1_MASK ~(MIPI_INT1_INT_DEF) /* 0: enable int */
#define MIPI_INT2_INT_DEF (0xf000)
//#define MIPI_INT2_MASK ~(MIPI_INT2_INT_DEF) /* 0: enable int */
#define MIPI_INT_MASK 0x0
//#define HI_MIPI_REG_DEBUG
//#define HI_MIPI_DEBUG
#ifdef HI_MIPI_DEBUG
#define HI_MSG(x...) \
do { \
printk("%s->%d: ", __FUNCTION__, __LINE__); \
printk(x); \
printk("\n"); \
} while (0)
#else
#define HI_MSG(args...) do { } while (0)
#endif
#define HI_ERR(x...) \
do { \
printk(KERN_ALERT "%s(%d): ", __FUNCTION__, __LINE__); \
printk(KERN_ALERT x); \
printk(KERN_ALERT "\n"); \
} while (0)
typedef enum
{
MIPI_VC0_NO_MATCH = 0x1 << 4, /*VC0通道的帧起始和帧结束不匹配*/
MIPI_VC1_NO_MATCH = 0x1 << 5, /*VC1通道的帧起始和帧结束不匹配*/
MIPI_VC2_NO_MATCH = 0x1 << 6, /*VC2通道的帧起始和帧结束不匹配*/
MIPI_VC3_NO_MATCH = 0x1 << 7, /*VC3通道的帧起始和帧结束不匹配*/
MIPI_VC0_ORDER_ERR = 0x1 << 8, /*VC0的帧序出错*/
MIPI_VC1_ORDER_ERR = 0x1 << 9, /*VC1的帧序出错*/
MIPI_VC2_ORDER_ERR = 0x1 << 10, /*VC2的帧序出错*/
MIPI_VC3_ORDER_ERR = 0x1 << 11, /*VC3的帧序出错*/
MIPI_VC0_FRAME_CRC = 0x1 << 12, /*最后一帧数据中VC0通道数据至少有一个CRC错误*/
MIPI_VC1_FRAME_CRC = 0x1 << 13, /*最后一帧数据中VC1通道数据至少有一个CRC错误*/
MIPI_VC2_FRAME_CRC = 0x1 << 14, /*最后一帧数据中VC2通道数据至少有一个CRC错误*/
MIPI_VC3_FRAME_CRC = 0x1 << 15, /*最后一帧数据中VC3通道数据至少有一个CRC错误*/
MIPI_HEADER_ERR = 0x1 << 28, /*Header至少2个错误ECC无法纠错*/
}MIPI_INT_ERR;
typedef enum
{
MIPI_VC0_INVALID_DT = 0x1 << 12, /*VC0通道数据类型不支持*/
MIPI_VC1_INVALID_DT = 0x1 << 13, /*VC1通道数据类型不支持*/
MIPI_VC2_INVALID_DT = 0x1 << 14, /*VC2通道数据类型不支持*/
MIPI_VC3_INVALID_DT = 0x1 << 15, /*VC3通道数据类型不支持*/
}MIPI_INT2_ERR;
typedef enum
{
MIPI_ESC_CLK = 0x1 << 0, /*MIPI模式时Link 0 clock lane escape序列中断状态。*/
MIPI_ESC_D0 = 0x1 << 1, /*data lane 0 escape序列中断状态*/
MIPI_ESC_D1 = 0x1 << 2, /*data lane 1 escape序列中断状态*/
MIPI_ESC_D2 = 0x1 << 3, /*data lane 2 escape序列中断状态*/
MIPI_ESC_D3 = 0x1 << 4, /*data lane 3 escape序列中断状态*/
MIPI_TIMEOUT_CLK = 0x1 << 8, /*clock lane FSM timeout 中断状态*/
MIPI_TIMEOUT_D0 = 0x1 << 9, /*data lane 0 FSM timeout 中断状态*/
MIPI_TIMEOUT_D1 = 0x1 << 10, /*data lane 1 FSM timeout 中断状态*/
MIPI_TIMEOUT_D2 = 0x1 << 11, /*data lane 2 FSM timeout 中断状态*/
MIPI_TIMEOUT_D3 = 0x1 << 12, /*data lane 3 FSM timeout 中断状态*/
MIPI_VSYNC_ERR = 0x1 << 21, /* LVDS模式Link 0 各个lane 帧同步信号vsync有效不同步中断状态。*/
}LINK_INT_STAT;
typedef enum
{
LANE0_SYNC_ERR = 0x1,
LANE1_SYNC_ERR = 0x2,
LANE2_SYNC_ERR = 0x4,
LANE3_SYNC_ERR = 0x8,
LANE4_SYNC_ERR = 0x10,
LANE5_SYNC_ERR = 0x20,
LANE6_SYNC_ERR = 0x40,
LANE7_SYNC_ERR = 0x80,
PHY0_LINE_SYNC_ERR = 0x100,
PHY0_FRAME_SYNC_ERR = 0x200,
PHY1_LINE_SYNC_ERR = 0x400,
PHY1_FRAME_SYNC_ERR = 0x800,
LINK_SYNC_ERR = 0x3F0000, /* link的行/帧结束信号无法正常检测中断状态如果有此中断则要重启link。*/
}LVDS_SYNC_INTR_ERR;
typedef enum
{
OUTPUT_DATA_WIDTH_2BIT=0,
OUTPUT_DATA_WIDTH_4BIT,
OUTPUT_DATA_WIDTH_8BIT,
OUTPUT_DATA_WIDTH_BUTT
}output_data_width;
typedef enum
{
CLK_UP_EDGE=0,
CLK_DOWN_EDGE,
CLK_EDGE_BUTT
}clk_edge;
typedef enum
{
OUTPUT_NORM_MSB=0,
OUTPUT_REVERSE_MSB,
OUTPUT_MSB_BUTT
}output_msb;
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_CMOS_18V = 0x4, /* CMOS 1.8V */
INPUT_MODE_CMOS_33V = 0x5, /* CMOS 3.3V */
INPUT_MODE_BT1120 = 0x6, /* CMOS 3.3V */
INPUT_MODE_BYPASS = 0x7, /* MIPI Bypass */
INPUT_MODE_BUTT
}input_mode_t;
typedef enum
{
WORK_MODE_LVDS = 0x0,
WORK_MODE_MIPI = 0x1,
WORK_MODE_CMOS_18V = 0x2,
WORK_MODE_CMOS_33V = 0x4,
WORK_MODE_BT1120 = 0x4,
WORK_MODE_BUTT
}work_mode_t;
typedef struct
{
unsigned int width;
unsigned int height;
}img_size_t;
typedef enum
{
HI_WDR_MODE_NONE = 0x0,
HI_WDR_MODE_2F = 0x1,
HI_WDR_MODE_3F = 0x2,
HI_WDR_MODE_4F = 0x3,
HI_WDR_MODE_DOL_2F = 0x4,
HI_WDR_MODE_DOL_3F = 0x5,
HI_WDR_MODE_DOL_4F = 0x6,
HI_WDR_MODE_BUTT
}wdr_mode_e;
typedef enum
{
LVDS_ENDIAN_LITTLE = 0x0,
LVDS_ENDIAN_BIG = 0x1,
LVDS_ENDIAN_BUTT
}lvds_bit_endian;
typedef enum
{
LVDS_SYNC_MODE_SOL = 0, /* sensor SOL, EOL, SOF, EOF */
LVDS_SYNC_MODE_SAV, /* SAV, EAV */
LVDS_SYNC_MODE_BUTT
}lvds_sync_mode_e;
typedef enum
{
RAW_DATA_8BIT = 1,
RAW_DATA_10BIT,
RAW_DATA_12BIT,
RAW_DATA_14BIT,
RAW_DATA_BUTT
}raw_data_type_e;
typedef struct
{
img_size_t img_size; /* oringnal sensor input image size */
wdr_mode_e wdr_mode; /* WDR mode */
lvds_sync_mode_e sync_mode; /* sync mode: SOL, SAV */
raw_data_type_e raw_data_type; /* raw data type: 8/10/12/14 bit */
lvds_bit_endian data_endian; /* data endian: little/big */
lvds_bit_endian 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_SOL: SOL, EOL, SOF, EOF
sync_mode is SYNC_MODE_SAV: valid sav, valid eav, invalid sav, invalid eav */
unsigned short sync_code[LVDS_LANE_NUM][WDR_VC_NUM][SYNC_CODE_NUM];
}lvds_dev_attr_t;
typedef struct
{
raw_data_type_e raw_data_type; /* raw data type: 8/10/12/14 bit */
short lane_id[MIPI_LANE_NUM]; /* lane_id: -1 - disable */
}mipi_dev_attr_t;
typedef struct
{
input_mode_t input_mode; /* input mode: MIPI/LVDS/SUBLVDS/HISPI/DC */
union
{
mipi_dev_attr_t mipi_attr;
lvds_dev_attr_t lvds_attr;
};
}combo_dev_attr_t;
#define HI_MIPI_IOC_MAGIC 'm'
/* init data lane, input mode, data type */
#define HI_MIPI_SET_DEV_ATTR _IOW(HI_MIPI_IOC_MAGIC, 0x01, combo_dev_attr_t)
/* output clk edge */
#define HI_MIPI_SET_OUTPUT_CLK_EDGE _IOW(HI_MIPI_IOC_MAGIC, 0x02, HI_BOOL)
/* output data msb */
#define HI_MIPI_SET_OUTPUT_MSB _IOW(HI_MIPI_IOC_MAGIC, 0x03, HI_BOOL)
#endif