/* * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. * See the LICENSE file in the root of this repository for complete details. */ /** * @addtogroup MIPI CSI * @{ * * @brief Defines standard MIPI CSI APIs for display driver development. * * This MIPI CSI module abstracts MIPI CSI capabilities of different system platforms to provide stable APIs * for display driver development. You can use this module to obtain/release the MIPI CSI device handle, * initialize the MIPI CSI device, and send/receive commands that interact with display peripherals. * * @since 1.0 */ /** * @file mipi_csi_if.h * * @brief Declares standard MIPI CSI APIs for display driver development. * * * * @since 1.0 */ #ifndef MIPI_CSI_IF_H #define MIPI_CSI_IF_H #include "platform_if.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif /* __cplusplus */ /** * @brief Maximum number of lanes supported by MIPI RX's Mipi device. * * @since 1.0 */ #define MIPI_LANE_NUM 4 /** * @brief The maximum number of lanes supported by the LVDS device of Mipi Rx. * * @since 1.0 */ #define LVDS_LANE_NUM 4 /** * @brief Defines the maximum number of virtual channels supported. * * @since 1.0 */ #define WDR_VC_NUM 4 /** * @brief Define the number of synchronization codes for each virtual channel of LVDS. * * @since 1.0 */ #define SYNC_CODE_NUM 4 /** * @brief Maximum 3 groups of extended data types. * * @since 1.0 */ #define MAX_EXT_DATA_TYPE_NUM 3 /** * @brief Lane distribution of Mipi Rx. * * @since 1.0 */ typedef enum { LANE_DIVIDE_MODE_0 = 0, LANE_DIVIDE_MODE_1 = 1, LANE_DIVIDE_MODE_BUTT } LaneDivideMode; /** * @brief MIPI RX input interface type. * * @since 1.0 */ typedef enum { /** mipi */ INPUT_MODE_MIPI = 0x0, /** SUB_LVDS */ INPUT_MODE_SUBLVDS = 0x1, /** LVDS */ INPUT_MODE_LVDS = 0x2, /* HISPI */ INPUT_MODE_HISPI = 0x3, /** CMOS */ INPUT_MODE_CMOS = 0x4, /** BT601 */ INPUT_MODE_BT601 = 0x5, /** BT656 */ INPUT_MODE_BT656 = 0x6, /** BT1120 */ INPUT_MODE_BT1120 = 0x7, /** MIPI Bypass */ INPUT_MODE_BYPASS = 0x8, INPUT_MODE_BUTT } InputMode; /** * @brief Mipi Rx, SLVS input rate. * * @since 1.0 */ typedef enum { /** output 1 pixel per clock */ MIPI_DATA_RATE_X1 = 0, /** output 2 pixel per clock */ MIPI_DATA_RATE_X2 = 1, MIPI_DATA_RATE_BUTT } MipiDataRate; /** * @brief Mipi crop area properties. * * @since 1.0 */ typedef struct { int x; int y; unsigned int width; unsigned int height; } ImgRect; /** * @brief Type of data transmitted. * * @since 1.0 */ 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, /** yuv422 8bit transform user define 16bit raw */ DATA_TYPE_YUV422_PACKED, DATA_TYPE_BUTT } DataType; /** * @brief Define YUV and RAW data format and bit depth. * * @since 1.0 */ typedef struct { uint8_t devno; unsigned int num; unsigned int extDataBitWidth[MAX_EXT_DATA_TYPE_NUM]; unsigned int extDataType[MAX_EXT_DATA_TYPE_NUM]; } ExtDataType; /** * @brief MIPI D-PHY WDR MODE defines * * @since 1.0 */ typedef enum { HI_MIPI_WDR_MODE_NONE = 0x0, /** Virtual Channel */ HI_MIPI_WDR_MODE_VC = 0x1, /** Data Type */ HI_MIPI_WDR_MODE_DT = 0x2, /** DOL Mode */ HI_MIPI_WDR_MODE_DOL = 0x3, HI_MIPI_WDR_MODE_BUTT } MipiWdrMode; /** * @brief Mipi device properties. * * @since 1.0 */ typedef struct { /** data type: 8/10/12/14/16 bit */ DataType inputDataType; /** MIPI WDR mode */ MipiWdrMode wdrMode; /** laneId: -1 - disable */ short laneId[MIPI_LANE_NUM]; union { /** used by the HI_MIPI_WDR_MODE_DT */ short dataType[WDR_VC_NUM]; }; } MipiDevAttr; /** * @brief LVDS WDR mode. * * @since 1.0 */ 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 } WdrMode; /** * @brief LVDS synchronization mode. * * @since 1.0 */ typedef enum { /** sensor SOL, EOL, SOF, EOF */ LVDS_SYNC_MODE_SOF = 0, /** SAV, EAV */ LVDS_SYNC_MODE_SAV, LVDS_SYNC_MODE_BUTT } LvdsSyncMode; /** * @brief LVDS Vsync type. * * @since 1.0 */ typedef enum { LVDS_VSYNC_NORMAL = 0x00, LVDS_VSYNC_SHARE = 0x01, LVDS_VSYNC_HCONNECT = 0x02, LVDS_VSYNC_BUTT } LvdsVsyncType; /** * @brief LVDS Vsync column synchronization parameters. * * @since 1.0 */ typedef struct { LvdsVsyncType syncType; /* hconnect vsync blanking len, valid when the syncType is LVDS_VSYNC_HCONNECT */ unsigned short hblank1; unsigned short hblank2; } LvdsVsyncAttr; /** * @brief Frame ID type. * * @since 1.0 */ typedef enum { LVDS_FID_NONE = 0x00, /** frame identification id in SAV 4th */ LVDS_FID_IN_SAV = 0x01, /** frame identification id in first data */ LVDS_FID_IN_DATA = 0x02, LVDS_FID_BUTT } LvdsFidType; /** * @brief Frame ID configuration information. * * @since 1.0 */ typedef struct { LvdsFidType fidType; /** 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 outputFil; } LvdsFidAttr; /** * @brief LVDS bit size end mode. * * @since 1.0 */ typedef enum { LVDS_ENDIAN_LITTLE = 0x0, LVDS_ENDIAN_BIG = 0x1, LVDS_ENDIAN_BUTT } LvdsBitEndian; /** * @brief LVDS / SubLVDS / HiSPi device properties. * * @since 1.0 */ typedef struct { /** data type: 8/10/12/14 bit */ DataType inputDataType; /** WDR mode */ WdrMode wdrMode; /** sync mode: SOF, SAV */ LvdsSyncMode syncMode; /** normal, share, hconnect */ LvdsVsyncAttr vsyncAttr; /** frame identification code */ LvdsFidAttr fidAttr; /** data endian: little/big */ LvdsBitEndian dataEndian; /** sync code endian: little/big */ LvdsBitEndian syncCodeEndian; /** laneId: -1 - disable */ short laneId[LVDS_LANE_NUM]; /** each vc has 4 params, syncCode[i]: syncMode is SYNC_MODE_SOF: SOF, EOF, SOL, EOL syncMode is SYNC_MODE_SAV: invalid sav, invalid eav, valid sav, valid eav */ unsigned short syncCode[LVDS_LANE_NUM][WDR_VC_NUM][SYNC_CODE_NUM]; } LvdsDevAttr; /** * @brief The attribute of the combo device. * * Since MIPI RX can interface with CSI-2, LVDS, HiSPi and other timing, Mipi Rx is called a combo device. * * @since 1.0 */ typedef struct { /** device number */ uint8_t devno; /** input mode: MIPI/LVDS/SUBLVDS/HISPI/DC */ InputMode inputMode; MipiDataRate dataRate; /** MIPI Rx device crop area (corresponding to the oringnal sensor input image size) */ ImgRect imgRect; union { MipiDevAttr mipiAttr; LvdsDevAttr lvdsAttr; }; } ComboDevAttr; /** * @brief PHY common mode voltage mode. * * @since 1.0 */ typedef enum { PHY_CMV_GE1200MV = 0x00, PHY_CMV_LT1200MV = 0x01, PHY_CMV_BUTT } PhyCmvMode; /** * @brief Obtains the MIPI CSI device handle with a specified channel ID. * * @param id Indicates the MIPI CSI channel ID. * * @return Returns the MIPI CSI device handle if the operation is successful; returns NULL otherwise. * * @since 1.0 */ DevHandle MipiCsiOpen(uint8_t id); /** * @brief Releases the MIPI CSI device handle. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * * @since 1.0 */ void MipiCsiClose(DevHandle handle); /** * @brief Set the parameters of Mipi, CMOS or LVDS camera to the controller. * * The parameters including working mode, image area, image depth, data rate and physical channel. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param pAttr Indicates the pointer to the attribute. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiSetComboDevAttr(DevHandle handle, ComboDevAttr *pAttr); /** * @brief Set common mode voltage mode. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param devno There are 2 device numbers in total, pointing to 0 or 1. * @param cmvMode Common mode voltage mode parameters. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiSetPhyCmvmode(DevHandle handle, uint8_t devno, PhyCmvMode cmvMode); /** * @brief Reset sensor. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param snsResetSource The reset signal line number of sensor is called the reset source of sensor in software. * sns is the abbreviation of sensor. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiResetSensor(DevHandle handle, uint8_t snsResetSource); /** * @brief Unreset sensor. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param snsResetSource The reset signal line number of sensor is called the reset source of sensor in software. * sns is the abbreviation of sensor. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource); /** * @brief Reset Mipi Rx. * * Different s32WorkingViNum have different enSnsType. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param comboDev MIPI RX or LVDS device type. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiResetRx(DevHandle handle, uint8_t comboDev); /** * @brief Uneset MIPI RX. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param comboDev MIPI RX or LVDS device type. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiUnresetRx(DevHandle handle, uint8_t comboDev); /** * @brief Set the lane distribution of Mipi Rx. * * Select the specific mode according to the form of hardware connection. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param laneDivideMode Lane division mode parameters. * * @since 1.0 */ int32_t MipiCsiSetHsMode(DevHandle handle, LaneDivideMode laneDivideMode); /** * @brief Enable Mipi clock. * * Decide whether to use Mipi or LVDS according to the ensnstype parameter * passed by the upper layer function. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param comboDev MIPI RX or LVDS device type. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiEnableClock(DevHandle handle, uint8_t comboDev); /** * @brief Disable the clock of Mipi device. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param comboDev MIPI RX or LVDS device type. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiDisableClock(DevHandle handle, uint8_t comboDev); /** * @brief Enable the sensor clock on Mipi. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param snsClkSource The clock signal line number of sensor, which is called the clock source of sensor in software. * sns is the abbreviation of sensor. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiEnableSensorClock(DevHandle handle, uint8_t snsClkSource); /** * @brief Disable the sensor clock. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param snsClkSource The clock signal line number of sensor, which is called the clock source of sensor in software. * sns is the abbreviation of sensor. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource); /** * @brief Set YUV and RAW data format and bit depth. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param dataType Pointer to image data format. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType* dataType); /** * @brief Sets additional parameters for a MIPI CSI device. * * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. * @param drvData Indicates the pointer to the additional parameters. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * * @since 1.0 */ int32_t MipiCsiSetDrvData(DevHandle handle, void *drvData); #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */ #endif /* MIPI_CSI_IF_H */