diff --git a/include/platform/mipi_csi_if.h b/include/platform/mipi_csi_if.h
new file mode 100755
index 00000000..85628429
--- /dev/null
+++ b/include/platform/mipi_csi_if.h
@@ -0,0 +1,545 @@
+/*
+ * 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 "hdf_platform.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);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif
+#endif /* __cplusplus */
+
+#endif /* MIPI_CSI_IF_H */
diff --git a/support/platform/include/common/platform_core.h b/support/platform/include/common/platform_core.h
index 08e5770d..bd1203ea 100644
--- a/support/platform/include/common/platform_core.h
+++ b/support/platform/include/common/platform_core.h
@@ -30,6 +30,7 @@ enum PlatformModuleType {
PLATFORM_MODULE_CLOCK,
PLATFORM_MODULE_REGULATOR,
PLATFORM_MODULE_MIPI_DSI,
+ PLATFORM_MODULE_MIPI_CSI,
PLATFORM_MODULE_UART,
PLATFORM_MODULE_SDIO,
PLATFORM_MODULE_MDIO,
diff --git a/support/platform/include/mipi_csi_core.h b/support/platform/include/mipi_csi_core.h
new file mode 100755
index 00000000..54fdba13
--- /dev/null
+++ b/support/platform/include/mipi_csi_core.h
@@ -0,0 +1,612 @@
+/*
+ * 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.
+ */
+
+#ifndef MIPI_CSI_CORE_H
+#define MIPI_CSI_CORE_H
+
+#include "hdf_base.h"
+#include "hdf_device.h"
+#include "hdf_device_desc.h"
+#include "hdf_object.h"
+#include "mipi_csi_if.h"
+#include "osal_mutex.h"
+#include "osal_spinlock.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif
+#endif /* __cplusplus */
+
+
+#define MAX_CNTLR_CNT 2
+#define COMBO_DEV_MAX_NUM 2
+#define MIPI_RX_MAX_DEV_NUM 2
+
+/**
+ * @brief Image size.
+ *
+ * @since 1.0
+ */
+typedef struct {
+ /** Image width */
+ unsigned int width;
+ /** Image height */
+ unsigned int height;
+} ImgSize;
+
+/**
+ * @brief LP, HS and escape mode switching timeout error.
+ *
+ * @since 1.0
+ */
+typedef struct {
+ /** Clock1 Lane switching from LP to HS timeout */
+ unsigned int clk1FsmTimeoutErrCnt;
+ /** Clock0 Lane switching from LP to HS timeout */
+ unsigned int clk0FsmTimeoutErrCnt;
+ /** Data lane0 switching from LP to HS timeout */
+ unsigned int d0FsmTimeoutErrCnt;
+ /** Data lane1 switching from LP to HS timeout */
+ unsigned int d1FsmTimeoutErrCnt;
+ /** Data lane2 switching from LP to HS timeout */
+ unsigned int d2FsmTimeoutErrCnt;
+ /** Data lane3 switching from LP to HS timeout */
+ unsigned int d3FsmTimeoutErrCnt;
+
+ /** Clock1 Lane switching to escape mode timed out */
+ unsigned int clk1FsmEscapeErrCnt;
+ /** Clock0 Lane switching to escape mode timed out */
+ unsigned int clk0FsmEscapeErrCnt;
+ /** Data lane0 switching to escape mode timed out */
+ unsigned int d0FsmEscapeErrCnt;
+ /** Data lane1 switching to escape mode timeout */
+ unsigned int d1FsmEscapeErrCnt;
+ /** Data lane2 switching to escape mode timeout */
+ unsigned int d2FsmEscapeErrCnt;
+ /** Data lane3 switching to escape mode timeout */
+ unsigned int d3FsmEscapeErrCnt;
+} PhyErrIntCnt;
+
+/**
+ * @brief Errors generated during Mipi communication, including data packets,
+ * data frames and read-write control.
+ *
+ * @since 1.0
+ */
+typedef struct {
+ /** Packet err.
+ Header has at least 2 errors and ECC cannot correct them */
+ unsigned int errEccDoubleCnt;
+ /** CRC redundancy check error count for vc3 channel data */
+ unsigned int vc3ErrCrcCnt;
+ /** CRC redundancy check error count for vc2 channel data */
+ unsigned int vc2ErrCrcCnt;
+ /** CRC redundancy check error count for Vc1 channel data */
+ unsigned int vc1ErrCrcCnt;
+ /** CRC redundancy check error count for vc0 channel data */
+ unsigned int vc0ErrCrcCnt;
+ /** ECC corrected error count for vc3 channel header */
+ unsigned int vc3ErrEccCorrectedCnt;
+ /** ECC corrected error count for vc2 channel header */
+ unsigned int vc2ErrEccCorrectedCnt;
+ /** ECC corrected error count for Vc1 channel header */
+ unsigned int vc1ErrEccCorrectedCnt;
+ /** ECC corrected error count for vc0 channel header */
+ unsigned int vc0ErrEccCorrectedCnt;
+ /** Frame sequence error count of vc3 */
+ unsigned int errIdVc3Cnt;
+ /** Frame sequence error count of vc2 */
+ unsigned int errIdVc2Cnt;
+ /** Frame sequence error count of Vc1 */
+ unsigned int errIdVc1Cnt;
+ /** Frame sequence error count or vc0 */
+ unsigned int errIdVc0Cnt;
+
+ /** Frame err.
+ Count of data types not supported by vc3 channel */
+ unsigned int errFrameDataVc3Cnt;
+ /** Count of data types not supported by vc2 channel */
+ unsigned int errFrameDataVc2Cnt;
+ /** Count of data types not supported by Vc1 channel */
+ unsigned int errFrameDataVc1Cnt;
+ /** Count of data types not supported by vc0 channel */
+ unsigned int errFrameDataVc0Cnt;
+ /** Frame sequence error count of vc3 */
+ unsigned int errFSeqVc3Cnt;
+ /** Frame sequence error count of vc2 */
+ unsigned int errFSeqVc2Cnt;
+ /** Frame sequence error count of Vc1 */
+ unsigned int errFSeqVc1Cnt;
+ /** Frame sequence error count or vc0 */
+ unsigned int errFSeqVc0Cnt;
+ /** Mismatch count of frame start and frame end short packets of vc3 channel */
+ unsigned int errFBndryMatchVc3Cnt;
+ /** Mismatch count of frame start and frame end short packets of vc2 channel */
+ unsigned int errFBndryMatchVc2Cnt;
+ /** Mismatch count of frame start and frame end short packets of Vc1 channel */
+ unsigned int errFBndryMatchVc1Cnt;
+ /** Count of mismatch between frame start and frame end short packets of vc0 channel */
+ unsigned int errFBndryMatchVc0Cnt;
+
+ /** Ctrl err.
+ Mipi read data FIFO raw interrupt count */
+ unsigned int dataFifoRderrCnt;
+ /** Mipi read command FIFO raw interrupt count */
+ unsigned int cmdFifoRderrCnt;
+ /** Mipi write data FIFO raw interrupt count */
+ unsigned int dataFifoWrerrCnt;
+ /** Mipi write command FIFO raw interrupt count */
+ unsigned int cmdFifoWrerrCnt;
+} MipiErrIntCnt;
+
+/**
+ * @brief LVDS internal read or write interrupt error.
+ *
+ * @since 1.0
+ */
+typedef struct {
+ /** CMD_ FIFO register read error interrupt count */
+ unsigned int cmdRdErrCnt;
+ /** CMD_ FIFO register write error interrupt count */
+ unsigned int cmdWrErrCnt;
+ /** Read line_ BUF error interrupt count */
+ unsigned int popErrCnt;
+ /** Synchronization error interrupt count of each lane during LVDS */
+ unsigned int lvdsStateErrCnt;
+ /** Link0 read FIFO error interrupt count */
+ unsigned int link0RdErrCnt;
+ /** Link0 write FIFO error interrupt count */
+ unsigned int link0WrErrCnt;
+} LvdsErrIntCnt;
+
+/**
+ * @brief Internal FIFO alignment error.
+ *
+ * @since 1.0
+ */
+typedef struct {
+ /** Lane3 FIFO overflow */
+ unsigned int lane3AlignErrCnt;
+ /** Lane2 FIFO overflow */
+ unsigned int lane2AlignErrCnt;
+ /** Lane1 FIFO overflow */
+ unsigned int lane1AlignErrCnt;
+ /** Lane0 FIFO overflow */
+ unsigned int lane0AlignErrCnt;
+ /** FIFO overflow */
+ unsigned int fifoFullErrCnt;
+} AlignErrIntCnt;
+
+/**
+ * @brief Controller context parameter variable.
+ *
+ * @since 1.0
+ */
+typedef struct {
+ /** Set by {@link MipiCsiSetHsMode} function */
+ LaneDivideMode laneDivideMode;
+ bool hsModeCfged;
+ /** The properties of different types of devices are set through the {@link MipiCsiSetComboDevAttr} function */
+ ComboDevAttr comboDevAttr[COMBO_DEV_MAX_NUM];
+ bool devValid[COMBO_DEV_MAX_NUM];
+ /** Whether the {@link MipiCsiSetComboDevAttr} function is called for parameter setting */
+ bool devCfged[COMBO_DEV_MAX_NUM];
+ unsigned int laneBitmap[COMBO_DEV_MAX_NUM];
+} MipiDevCtx;
+
+/**
+ * @brief Mipi CSI controller attribute and method definition.
+ *
+ * @since 1.0
+ */
+struct MipiCsiCntlr {
+ /** The services provided by this controller are sent out when the driver is bound to the HDF framework */
+ struct IDeviceIoService service;
+ /** The device side pointer is passed in when the driver binds to the HDF frame */
+ struct HdfDeviceObject *device;
+ /** device number */
+ unsigned int devNo;
+ /** All interfaces provided by the controller */
+ struct MipiCsiCntlrMethod *ops;
+ /** For all interfaces debugged by the controller, null is required when the driver is not implemented */
+ struct MipiCsiCntlrDebugMethod *debugs;
+ /** Controller context parameter variable */
+ MipiDevCtx ctx;
+ /** Lock when accessing controller context parameter variables */
+ OsalSpinlock ctxLock;
+ /** Lock when operating controller method */
+ struct OsalMutex lock;
+ /** Anonymous data pointer, used to store struct mipi_csi_device */
+ void *priv;
+};
+
+/**
+ * @brief All interfaces provided by the MIPI-CSI controller.
+ *
+ * Refer to the corresponding interface declaration for function pointer description.
+ *
+ * @since 1.0
+ */
+struct MipiCsiCntlrMethod {
+ int32_t (*setComboDevAttr)(struct MipiCsiCntlr *cntlr, ComboDevAttr *pAttr);
+ int32_t (*setPhyCmvmode)(struct MipiCsiCntlr *cntlr, uint8_t devno, PhyCmvMode cmvMode);
+ int32_t (*setExtDataType)(struct MipiCsiCntlr *cntlr, ExtDataType* dataType);
+ int32_t (*setHsMode)(struct MipiCsiCntlr *cntlr, LaneDivideMode laneDivideMode);
+ int32_t (*enableClock)(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
+ int32_t (*disableClock)(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
+ int32_t (*resetRx)(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
+ int32_t (*unresetRx)(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
+ int32_t (*enableSensorClock)(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource);
+ int32_t (*disableSensorClock)(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource);
+ int32_t (*resetSensor)(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource);
+ int32_t (*unresetSensor)(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource);
+};
+
+/**
+ * @brief For all interfaces debugged by the MIPI-CSI controller, NULL is required when
+ * the driver is not implemented.
+ *
+ * Refer to the corresponding interface declaration for function pointer description.
+ *
+ * @since 1.0
+ */
+struct MipiCsiCntlrDebugMethod {
+ void (*getMipiDevCtx)(struct MipiCsiCntlr *cntlr, MipiDevCtx *ctx);
+ void (*getPhyErrIntCnt)(struct MipiCsiCntlr *cntlr, unsigned int phyId, PhyErrIntCnt *errInfo);
+ void (*getMipiErrInt)(struct MipiCsiCntlr *cntlr, unsigned int phyId, MipiErrIntCnt *errInfo);
+ void (*getLvdsErrIntCnt)(struct MipiCsiCntlr *cntlr, unsigned int phyId, LvdsErrIntCnt *errInfo);
+ void (*getAlignErrIntCnt)(struct MipiCsiCntlr *cntlr, unsigned int phyId, AlignErrIntCnt *errInfo);
+ void (*getPhyData)(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData);
+ void (*getPhyMipiLinkData)(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData);
+ void (*getPhyLvdsLinkData)(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData);
+ void (*getMipiImgsizeStatis)(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize);
+ void (*getLvdsImgsizeStatis)(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize);
+ void (*getLvdsLaneImgsizeStatis)(struct MipiCsiCntlr *cntlr, uint8_t devno, short lane, ImgSize *pSize);
+};
+
+int32_t MipiCsiRegisterCntlr(struct MipiCsiCntlr *cntlr, struct HdfDeviceObject *device);
+void MipiCsiUnregisterCntlr(struct MipiCsiCntlr *cntlr);
+
+/**
+ * @brief Turn HdfDeviceObject to an MipiCsiCntlr.
+ *
+ * @param device Indicates a HdfDeviceObject.
+ *
+ * @return Retrns the pointer of the MipiCsiCntlr on success; returns NULL otherwise.
+ * @since 1.0
+ */
+struct MipiCsiCntlr *MipiCsiCntlrFromDevice(const struct HdfDeviceObject *device);
+
+/**
+ * @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 if the operation is successful; returns NULL otherwise.
+ *
+ * @since 1.0
+ */
+struct MipiCsiCntlr *MipiCsiCntlrGet(uint8_t id);
+
+/**
+ * @brief Releases the MIPI CSI device handle.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ *
+ * @since 1.0
+ */
+void MipiCsiCntlrPut(const struct MipiCsiCntlr *cntlr);
+
+/**
+ * @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 cntlr Indicates the MIPI CSI device 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 MipiCsiCntlrSetComboDevAttr(struct MipiCsiCntlr *cntlr, ComboDevAttr *pAttr);
+
+/**
+ * @brief Set common mode voltage mode.
+ *
+ * @param cntlr Indicates the MIPI CSI device 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 MipiCsiCntlrSetPhyCmvmode(struct MipiCsiCntlr *cntlr, uint8_t devno, PhyCmvMode cmvMode);
+
+/**
+ * @brief Reset sensor.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param snsResetSource The reset signal line number of sensor is called the reset source of sensor in software.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiCntlrResetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource);
+
+/**
+ * @brief Unreset sensor.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param snsResetSource The reset signal line number of sensor is called the reset source of sensor in software.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiCntlrUnresetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource);
+
+/**
+ * @brief Reset Mipi Rx.
+ *
+ * Different s32WorkingViNum have different enSnsType.
+ *
+ * @param cntlr Indicates the MIPI CSI device 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 MipiCsiCntlrResetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
+
+/**
+ * @brief Uneset MIPI RX.
+ *
+ * @param cntlr Indicates the MIPI CSI device 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 MipiCsiCntlrUnresetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
+
+/**
+ * @brief Set the lane distribution of Mipi Rx.
+ *
+ * Select the specific mode according to the form of hardware connection.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param laneDivideMode Lane division mode parameters.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiCntlrSetHsMode(struct MipiCsiCntlr *cntlr, 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 cntlr Indicates the MIPI CSI device 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 MipiCsiCntlrEnableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
+
+/**
+ * @brief Disable the clock of Mipi device.
+ *
+ * @param cntlr Indicates the MIPI CSI device 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 MipiCsiCntlrDisableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
+
+/**
+ * @brief Enable the sensor clock on Mipi.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param snsClkSource The clock signal line number of sensor, which is called the clock source of sensor in software.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiCntlrEnableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource);
+
+/**
+ * @brief Disable the sensor clock.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param snsClkSource The clock signal line number of sensor, which is called the clock source of sensor in software.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiCntlrDisableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource);
+
+/**
+ * @brief Set YUV and RAW data format and bit depth.
+ *
+ * @param cntlr Indicates the MIPI CSI device 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 MipiCsiCntlrSetExtDataType(struct MipiCsiCntlr *cntlr, ExtDataType* dataType);
+
+/**
+ * @brief Get controller context parameter variable for debugging.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param ctx Controller context parameter variable.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiDebugGetMipiDevCtx(struct MipiCsiCntlr *cntlr, MipiDevCtx *ctx);
+
+/**
+ * @brief Get mode switching timeout error for debugging.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param phyId Indicates PHY index.
+ * @param errInfo Indicates mode switching timeout error.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiDebugGetPhyErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, PhyErrIntCnt *errInfo);
+
+/**
+ * @brief Get errors generated during Mipi communication for debugging.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param phyId Indicates PHY index.
+ * @param errInfo Indicates Mipi communication error.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiDebugGetMipiErrInt(struct MipiCsiCntlr *cntlr, unsigned int phyId, MipiErrIntCnt *errInfo);
+
+/**
+ * @brief Get LVDS internal read or write interrupt error for debugging.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param phyId Indicates PHY index.
+ * @param errInfo Indicates LVDS read or write interrupt error.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiDebugGetLvdsErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, LvdsErrIntCnt *errInfo);
+
+/**
+ * @brief Get internal FIFO alignment error for debugging.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param phyId Indicates PHY index.
+ * @param errInfo Indicates FIFO alignment error.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiDebugGetAlignErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, AlignErrIntCnt *errInfo);
+
+/**
+ * @brief Get PHY data for debugging.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param phyId Indicates PHY index.
+ * @param laneId Indicates lane index, and the value range is 0 to COMBO_MAX_LANE_NUM-1.
+ * @param laneData Indicates a single PHY data.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiDebugGetPhyData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData);
+
+/**
+ * @brief Get MIPI data for debugging.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param phyId Indicates PHY index.
+ * @param laneId Indicates lane index, and the value range is 0 to COMBO_MAX_LANE_NUM-1.
+ * @param laneData Indicates a single MIPI data.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiDebugGetPhyMipiLinkData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData);
+
+/**
+ * @brief Get LVDS data for debugging.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param phyId Indicates PHY index.
+ * @param laneId Indicates lane index, and the value range is 0 to COMBO_MAX_LANE_NUM-1.
+ * @param laneData Indicates a single LVDS data.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiDebugGetPhyLvdsLinkData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData);
+
+/**
+ * @brief Get image size of MIPI for debugging.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param devno There are 2 device numbers in total, pointing to 0 or 1.
+ * @param vc Indicates virtual channel subscript.
+ * @param pSize Pointer to image size.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiDebugGetMipiImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize);
+
+/**
+ * @brief Get image size of LVDS for debugging.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param devno There are 2 device numbers in total, pointing to 0 or 1.
+ * @param vc Indicates virtual channel subscript.
+ * @param pSize Pointer to image size.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiDebugGetLvdsImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize);
+
+/**
+ * @brief Get image size of LVDS-Lane for debugging.
+ *
+ * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}.
+ * @param devno There are 2 device numbers in total, pointing to 0 or 1.
+ * @param lane Indicates lane index, and the value range is 0 to COMBO_MAX_LANE_NUM-1.
+ * @param pSize Pointer to image size.
+ *
+ * @return Returns 0 if the operation is successful; returns a negative value otherwise.
+ *
+ * @since 1.0
+ */
+int32_t MipiCsiDebugGetLvdsLaneImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short lane, ImgSize *pSize);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif
+#endif /* __cplusplus */
+
+#endif
diff --git a/support/platform/include/mipi_csi_dev.h b/support/platform/include/mipi_csi_dev.h
new file mode 100755
index 00000000..c0900a52
--- /dev/null
+++ b/support/platform/include/mipi_csi_dev.h
@@ -0,0 +1,83 @@
+/*
+ * 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.
+ */
+
+#ifndef MIPI_CSI_DEV_H
+#define MIPI_CSI_DEV_H
+
+#include "hdf_base.h"
+#include "mipi_csi_if.h"
+
+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
+} WorkMode;
+
+typedef struct {
+ uint8_t devno;
+ PhyCmvMode cmvMode;
+} PhyCmv;
+
+#define CONFIG_HI_PROC_SHOW_SUPPORT
+
+#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, ComboDevAttr)
+
+/* set phy common mode voltage mode */
+#define HI_MIPI_SET_PHY_CMVMODE _IOW(HI_MIPI_IOC_MAGIC, 0x04, PhyCmv)
+
+/* reset sensor */
+#define HI_MIPI_RESET_SENSOR _IOW(HI_MIPI_IOC_MAGIC, 0x05, uint8_t)
+
+/* unreset sensor */
+#define HI_MIPI_UNRESET_SENSOR _IOW(HI_MIPI_IOC_MAGIC, 0x06, uint8_t)
+
+/* reset mipi */
+#define HI_MIPI_RESET_MIPI _IOW(HI_MIPI_IOC_MAGIC, 0x07, uint8_t)
+
+/* unreset mipi */
+#define HI_MIPI_UNRESET_MIPI _IOW(HI_MIPI_IOC_MAGIC, 0x08, uint8_t)
+
+/* reset slvs */
+#define HI_MIPI_RESET_SLVS _IOW(HI_MIPI_IOC_MAGIC, 0x09, uint8_t)
+
+/* unreset slvs */
+#define HI_MIPI_UNRESET_SLVS _IOW(HI_MIPI_IOC_MAGIC, 0x0a, uint8_t)
+
+/* set mipi hs_mode */
+#define HI_MIPI_SET_HS_MODE _IOW(HI_MIPI_IOC_MAGIC, 0x0b, LaneDivideMode)
+
+/* enable mipi clock */
+#define HI_MIPI_ENABLE_MIPI_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x0c, uint8_t)
+
+/* disable mipi clock */
+#define HI_MIPI_DISABLE_MIPI_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x0d, uint8_t)
+
+/* enable slvs clock */
+#define HI_MIPI_ENABLE_SLVS_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x0e, uint8_t)
+
+/* disable slvs clock */
+#define HI_MIPI_DISABLE_SLVS_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x0f, uint8_t)
+
+/* enable sensor clock */
+#define HI_MIPI_ENABLE_SENSOR_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x10, uint8_t)
+
+/* disable sensor clock */
+#define HI_MIPI_DISABLE_SENSOR_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x11, uint8_t)
+
+#define HI_MIPI_SET_EXT_DATA_TYPE _IOW(HI_MIPI_IOC_MAGIC, 0x12, ExtDataType)
+
+int MipiCsiDevModuleInit(uint8_t id);
+void MipiCsiDevModuleExit(uint8_t id);
+
+#endif /* MIPI_CSI_DEV_H */
diff --git a/support/platform/src/common/platform_common.c b/support/platform/src/common/platform_common.c
index 462331a5..774a84bc 100644
--- a/support/platform/src/common/platform_common.c
+++ b/support/platform/src/common/platform_common.c
@@ -53,6 +53,12 @@ static struct PlatformModuleInfo g_platformModules[] = {
.moduleName = "PLATFORM_MODULE_MIPI_DSI",
},
#endif
+#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_MIPI_CSI) || defined(CONFIG_DRIVERS_HDF_PLATFORM_MIPI_CSI)
+ {
+ .moduleType = PLATFORM_MODULE_MIPI_CSI,
+ .moduleName = "PLATFORM_MODULE_MIPI_CSI",
+ },
+#endif
#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_UART) || defined(CONFIG_DRIVERS_HDF_PLATFORM_UART)
{
.moduleType = PLATFORM_MODULE_UART,
diff --git a/support/platform/src/mipi_csi_core.c b/support/platform/src/mipi_csi_core.c
new file mode 100755
index 00000000..53fd28ae
--- /dev/null
+++ b/support/platform/src/mipi_csi_core.c
@@ -0,0 +1,742 @@
+/*
+ * 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.
+ */
+
+#include "mipi_csi_core.h"
+#include "hdf_log.h"
+#include "osal_mem.h"
+#include "osal_time.h"
+
+#define HDF_LOG_TAG mipi_csi_core
+
+struct MipiCsiHandle {
+ struct MipiCsiCntlr *cntlr;
+ struct OsalMutex lock;
+ void *priv;
+};
+
+static struct MipiCsiHandle g_mipiCsihandle[MAX_CNTLR_CNT];
+
+int32_t MipiCsiRegisterCntlr(struct MipiCsiCntlr *cntlr, struct HdfDeviceObject *device)
+{
+ HDF_LOGI("%s: enter!", __func__);
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_ERR_INVALID_PARAM;
+ }
+ if (cntlr->devNo >= MAX_CNTLR_CNT) {
+ HDF_LOGE("%s: cntlr->devNo is error.", __func__);
+ return HDF_ERR_INVALID_PARAM;
+ }
+ if (device == NULL) {
+ HDF_LOGE("%s: device is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ if (g_mipiCsihandle[cntlr->devNo].cntlr == NULL) {
+ (void)OsalMutexInit(&g_mipiCsihandle[cntlr->devNo].lock);
+ (void)OsalMutexInit(&(cntlr->lock));
+
+ g_mipiCsihandle[cntlr->devNo].cntlr = cntlr;
+ g_mipiCsihandle[cntlr->devNo].priv = NULL;
+ cntlr->device = device;
+ device->service = &(cntlr->service);
+ cntlr->priv = NULL;
+ HDF_LOGI("%s: success.", __func__);
+
+ return HDF_SUCCESS;
+ }
+
+ HDF_LOGE("%s: cntlr already exists.", __func__);
+ return HDF_FAILURE;
+}
+
+void MipiCsiUnregisterCntlr(struct MipiCsiCntlr *cntlr)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return;
+ }
+
+ (void)OsalMutexDestroy(&(cntlr->lock));
+ (void)OsalMutexDestroy(&(g_mipiCsihandle[cntlr->devNo].lock));
+
+ HDF_LOGI("%s: success.", __func__);
+ return;
+}
+
+struct MipiCsiCntlr *MipiCsiCntlrFromDevice(const struct HdfDeviceObject *device)
+{
+ return (device == NULL) ? NULL : (struct MipiCsiCntlr *)device->service;
+}
+
+struct MipiCsiCntlr *MipiCsiCntlrGet(uint8_t number)
+{
+ struct MipiCsiCntlr *cntlr = NULL;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if (number >= MAX_CNTLR_CNT) {
+ HDF_LOGE("%s: invalid number.", __func__);
+ return NULL;
+ }
+ if (g_mipiCsihandle[number].cntlr == NULL) {
+ HDF_LOGE("%s: g_mipiCsihandle[number].cntlr is NULL.", __func__);
+ return NULL;
+ }
+
+ (void)OsalMutexLock(&(g_mipiCsihandle[number].lock));
+ g_mipiCsihandle[number].cntlr->devNo = number;
+ cntlr = g_mipiCsihandle[number].cntlr;
+ (void)OsalMutexUnlock(&(g_mipiCsihandle[number].lock));
+
+ return cntlr;
+}
+
+void MipiCsiCntlrPut(const struct MipiCsiCntlr *cntlr)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return;
+ }
+
+ uint8_t number = cntlr->devNo;
+ if (number >= MAX_CNTLR_CNT) {
+ HDF_LOGE("%s: invalid number.", __func__);
+ return;
+ }
+
+ HDF_LOGI("%s: success!", __func__);
+}
+
+int32_t MipiCsiCntlrSetComboDevAttr(struct MipiCsiCntlr *cntlr, ComboDevAttr *pAttr)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (pAttr == NULL) {
+ HDF_LOGE("%s: pAttr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->setComboDevAttr == NULL) {
+ HDF_LOGE("%s: setComboDevAttr is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->setComboDevAttr(cntlr, pAttr);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiCntlrSetPhyCmvmode(struct MipiCsiCntlr *cntlr, uint8_t devno, PhyCmvMode cmvMode)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->setPhyCmvmode == NULL) {
+ HDF_LOGE("%s: setPhyCmvmode is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->setPhyCmvmode(cntlr, devno, cmvMode);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiCntlrSetExtDataType(struct MipiCsiCntlr *cntlr, ExtDataType* dataType)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (dataType == NULL) {
+ HDF_LOGE("%s: dataType is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->setExtDataType == NULL) {
+ HDF_LOGE("%s: setExtDataType is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->setExtDataType(cntlr, dataType);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiCntlrSetHsMode(struct MipiCsiCntlr *cntlr, LaneDivideMode laneDivideMode)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->setHsMode == NULL) {
+ HDF_LOGE("%s: setHsMode is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->setHsMode(cntlr, laneDivideMode);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiCntlrEnableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->enableClock == NULL) {
+ HDF_LOGE("%s: enableClock is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->enableClock(cntlr, comboDev);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiCntlrDisableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->disableClock == NULL) {
+ HDF_LOGE("%s: disableClock is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->disableClock(cntlr, comboDev);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiCntlrResetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->resetRx == NULL) {
+ HDF_LOGE("%s: resetRx is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->resetRx(cntlr, comboDev);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiCntlrUnresetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->unresetRx == NULL) {
+ HDF_LOGE("%s: unresetRx is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->unresetRx(cntlr, comboDev);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiCntlrEnableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->enableSensorClock == NULL) {
+ HDF_LOGE("%s: enableSensorClock is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->enableSensorClock(cntlr, snsClkSource);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiCntlrDisableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->disableSensorClock == NULL) {
+ HDF_LOGE("%s: disableSensorClock is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->disableSensorClock(cntlr, snsClkSource);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiCntlrResetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->resetSensor == NULL) {
+ HDF_LOGE("%s: resetSensor is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->resetSensor(cntlr, snsResetSource);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiCntlrUnresetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource)
+{
+ int32_t ret;
+ HDF_LOGI("%s: enter!", __func__);
+
+ if ((cntlr == NULL) || (cntlr->ops == NULL)) {
+ HDF_LOGE("%s: cntlr or ops is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->ops->unresetSensor == NULL) {
+ HDF_LOGE("%s: unresetSensor is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ ret = cntlr->ops->unresetSensor(cntlr, snsResetSource);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+
+ if (ret == HDF_SUCCESS) {
+ HDF_LOGI("%s: success!", __func__);
+ } else {
+ HDF_LOGE("%s: failed!", __func__);
+ }
+
+ return ret;
+}
+
+int32_t MipiCsiDebugGetMipiDevCtx(struct MipiCsiCntlr *cntlr, MipiDevCtx *ctx)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->debugs == NULL) {
+ HDF_LOGE("%s: debugs is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (cntlr->debugs->getMipiDevCtx == NULL) {
+ HDF_LOGE("%s: getMipiDevCtx is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (ctx == NULL) {
+ HDF_LOGE("%s: ctx is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ cntlr->debugs->getMipiDevCtx(cntlr, ctx);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+ HDF_LOGI("%s: success!", __func__);
+
+ return HDF_SUCCESS;
+}
+
+int32_t MipiCsiDebugGetPhyErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, PhyErrIntCnt *errInfo)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->debugs == NULL) {
+ HDF_LOGE("%s: debugs is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (cntlr->debugs->getPhyErrIntCnt == NULL) {
+ HDF_LOGE("%s: getPhyErrIntCnt is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (errInfo == NULL) {
+ HDF_LOGE("%s: errInfo is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ cntlr->debugs->getPhyErrIntCnt(cntlr, phyId, errInfo);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+ HDF_LOGI("%s: success!", __func__);
+
+ return HDF_SUCCESS;
+}
+
+int32_t MipiCsiDebugGetMipiErrInt(struct MipiCsiCntlr *cntlr, unsigned int phyId, MipiErrIntCnt *errInfo)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->debugs == NULL) {
+ HDF_LOGE("%s: debugs is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (cntlr->debugs->getMipiErrInt == NULL) {
+ HDF_LOGE("%s: getMipiErrInt is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (errInfo == NULL) {
+ HDF_LOGE("%s: errInfo is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ cntlr->debugs->getMipiErrInt(cntlr, phyId, errInfo);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+ HDF_LOGI("%s: success!", __func__);
+
+ return HDF_SUCCESS;
+}
+
+int32_t MipiCsiDebugGetLvdsErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, LvdsErrIntCnt *errInfo)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->debugs == NULL) {
+ HDF_LOGE("%s: debugs is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (cntlr->debugs->getLvdsErrIntCnt == NULL) {
+ HDF_LOGE("%s: getLvdsErrIntCnt is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (errInfo == NULL) {
+ HDF_LOGE("%s: errInfo is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ cntlr->debugs->getLvdsErrIntCnt(cntlr, phyId, errInfo);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+ HDF_LOGI("%s: success!", __func__);
+
+ return HDF_SUCCESS;
+}
+
+int32_t MipiCsiDebugGetAlignErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, AlignErrIntCnt *errInfo)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->debugs == NULL) {
+ HDF_LOGE("%s: debugs is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (cntlr->debugs->getAlignErrIntCnt == NULL) {
+ HDF_LOGE("%s: getAlignErrIntCnt is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (errInfo == NULL) {
+ HDF_LOGE("%s: errInfo is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ cntlr->debugs->getAlignErrIntCnt(cntlr, phyId, errInfo);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+ HDF_LOGI("%s: success!", __func__);
+
+ return HDF_SUCCESS;
+}
+
+int32_t MipiCsiDebugGetPhyData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->debugs == NULL) {
+ HDF_LOGE("%s: debugs is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (cntlr->debugs->getPhyData == NULL) {
+ HDF_LOGE("%s: getPhyData is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (laneData == NULL) {
+ HDF_LOGE("%s: laneData is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ cntlr->debugs->getPhyData(cntlr, phyId, laneId, laneData);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+ HDF_LOGI("%s: success!", __func__);
+
+ return HDF_SUCCESS;
+}
+
+int32_t MipiCsiDebugGetPhyMipiLinkData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->debugs == NULL) {
+ HDF_LOGE("%s: debugs is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (cntlr->debugs->getPhyMipiLinkData == NULL) {
+ HDF_LOGE("%s: getPhyMipiLinkData is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (laneData == NULL) {
+ HDF_LOGE("%s: laneData is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ cntlr->debugs->getPhyMipiLinkData(cntlr, phyId, laneId, laneData);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+ HDF_LOGI("%s: success!", __func__);
+
+ return HDF_SUCCESS;
+}
+
+int32_t MipiCsiDebugGetPhyLvdsLinkData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->debugs == NULL) {
+ HDF_LOGE("%s: debugs is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (cntlr->debugs->getPhyLvdsLinkData == NULL) {
+ HDF_LOGE("%s: getPhyLvdsLinkData is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (laneData == NULL) {
+ HDF_LOGE("%s: laneData is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ cntlr->debugs->getPhyLvdsLinkData(cntlr, phyId, laneId, laneData);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+ HDF_LOGI("%s: success!", __func__);
+
+ return HDF_SUCCESS;
+}
+
+int32_t MipiCsiDebugGetMipiImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->debugs == NULL) {
+ HDF_LOGE("%s: debugs is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (cntlr->debugs->getMipiImgsizeStatis == NULL) {
+ HDF_LOGE("%s: getMipiImgsizeStatis is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (pSize == NULL) {
+ HDF_LOGE("%s: pSize is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ cntlr->debugs->getMipiImgsizeStatis(cntlr, devno, vc, pSize);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+ HDF_LOGI("%s: success!", __func__);
+
+ return HDF_SUCCESS;
+}
+
+int32_t MipiCsiDebugGetLvdsImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->debugs == NULL) {
+ HDF_LOGE("%s: debugs is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (cntlr->debugs->getLvdsImgsizeStatis == NULL) {
+ HDF_LOGE("%s: getLvdsImgsizeStatis is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (pSize == NULL) {
+ HDF_LOGE("%s: pSize is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ cntlr->debugs->getLvdsImgsizeStatis(cntlr, devno, vc, pSize);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+ HDF_LOGI("%s: success!", __func__);
+
+ return HDF_SUCCESS;
+}
+
+int32_t MipiCsiDebugGetLvdsLaneImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short lane, ImgSize *pSize)
+{
+ if (cntlr == NULL) {
+ HDF_LOGE("%s: cntlr is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+ if (cntlr->debugs == NULL) {
+ HDF_LOGE("%s: debugs is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (cntlr->debugs->getLvdsLaneImgsizeStatis == NULL) {
+ HDF_LOGE("%s: getLvdsLaneImgsizeStatis is NULL.", __func__);
+ return HDF_ERR_NOT_SUPPORT;
+ }
+ if (pSize == NULL) {
+ HDF_LOGE("%s: pSize is NULL.", __func__);
+ return HDF_FAILURE;
+ }
+
+ (void)OsalMutexLock(&(cntlr->lock));
+ cntlr->debugs->getLvdsLaneImgsizeStatis(cntlr, devno, lane, pSize);
+ (void)OsalMutexUnlock(&(cntlr->lock));
+ HDF_LOGI("%s: success!", __func__);
+
+ return HDF_SUCCESS;
+}
\ No newline at end of file
diff --git a/support/platform/src/mipi_csi_if.c b/support/platform/src/mipi_csi_if.c
new file mode 100755
index 00000000..c856f1a0
--- /dev/null
+++ b/support/platform/src/mipi_csi_if.c
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ */
+
+#include "mipi_csi_if.h"
+#include "mipi_csi_core.h"
+
+#define HDF_LOG_TAG mipi_csi_if
+
+DevHandle MipiCsiOpen(uint8_t id)
+{
+ return (DevHandle)MipiCsiCntlrGet(id);
+}
+
+void MipiCsiClose(DevHandle handle)
+{
+ MipiCsiCntlrPut((struct MipiCsiCntlr *)handle);
+}
+
+int32_t MipiCsiSetComboDevAttr(DevHandle handle, ComboDevAttr *pAttr)
+{
+ return MipiCsiCntlrSetComboDevAttr((struct MipiCsiCntlr *)handle, pAttr);
+}
+
+int32_t MipiCsiSetPhyCmvmode(DevHandle handle, uint8_t devno, PhyCmvMode cmvMode)
+{
+ return MipiCsiCntlrSetPhyCmvmode((struct MipiCsiCntlr *)handle, devno, cmvMode);
+}
+
+int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType* dataType)
+{
+ return MipiCsiCntlrSetExtDataType((struct MipiCsiCntlr *)handle, dataType);
+}
+
+int32_t MipiCsiSetHsMode(DevHandle handle, LaneDivideMode laneDivideMode)
+{
+ return MipiCsiCntlrSetHsMode((struct MipiCsiCntlr *)handle, laneDivideMode);
+}
+
+int32_t MipiCsiEnableClock(DevHandle handle, uint8_t comboDev)
+{
+ return MipiCsiCntlrEnableClock((struct MipiCsiCntlr *)handle, comboDev);
+}
+
+int32_t MipiCsiDisableClock(DevHandle handle, uint8_t comboDev)
+{
+ return MipiCsiCntlrDisableClock((struct MipiCsiCntlr *)handle, comboDev);
+}
+
+int32_t MipiCsiResetRx(DevHandle handle, uint8_t comboDev)
+{
+ return MipiCsiCntlrResetRx((struct MipiCsiCntlr *)handle, comboDev);
+}
+
+int32_t MipiCsiUnresetRx(DevHandle handle, uint8_t comboDev)
+{
+ return MipiCsiCntlrUnresetRx((struct MipiCsiCntlr *)handle, comboDev);
+}
+
+int32_t MipiCsiEnableSensorClock(DevHandle handle, uint8_t snsClkSource)
+{
+ return MipiCsiCntlrEnableSensorClock((struct MipiCsiCntlr *)handle, snsClkSource);
+}
+
+int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource)
+{
+ return MipiCsiCntlrDisableSensorClock((struct MipiCsiCntlr *)handle, snsClkSource);
+}
+
+int32_t MipiCsiResetSensor(DevHandle handle, uint8_t snsResetSource)
+{
+ return MipiCsiCntlrResetSensor((struct MipiCsiCntlr *)handle, snsResetSource);
+}
+
+int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource)
+{
+ return MipiCsiCntlrUnresetSensor((struct MipiCsiCntlr *)handle, snsResetSource);
+}