假设系统中的MIPI CSI通道为0,获取该通道控制器操作句柄的示例如下:

DevHandle MipiCsiHandle = NULL;  // 设备句柄
id = 0;                          // MIPI CSI通道ID

// 获取控制器操作句柄 
MipiCsiHandle = MipiCsiOpen(id);
if (MipiCsiHandle == NULL) {
    HDF_LOGE("MipiCsiOpen: mipi csi open fail.\n");
    return NULL;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
进行MIPI CSI相应配置
    int32_t MipiCsiSetComboDevAttr(DevHandle handle, ComboDevAttr *pAttr);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 5 MipiCsiSetComboDevAttr的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
pAttr结构体指针,MIPI CSI相应配置
返回值返回值描述
HDF_SUCCESS设置成功
负数设置失败
    int32_t ret;
    struct ComboDevAttr attr;

    // 当前配置如下 
    (void)memset_s(&attr, sizeof(ComboDevAttr), 0, sizeof(ComboDevAttr));
    attr.devno = 0;                    // 设备0 
    attr.inputMode = INPUT_MODE_MIPI;  // 输入模式为MIPI 
    attr.dataRate = MIPI_DATA_RATE_X1; // 每时钟输出1像素 
    attr.imgRect.x = 0;                // 0: 图像传感器左上位置 
    attr.imgRect.y = 0;                // 0: 图像传感器右上位置 
    attr.imgRect.width = 2592;         // 2592: 图像传感器宽度大小 
    attr.imgRect.height = 1944;        // 1944: 图像传感器高度尺寸 
    // 写入配置数据 
    ret = MipiCsiSetComboDevAttr(MipiCsiHandle, &attr);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiSetComboDevAttr: mipi csi set combo dev attr fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">
    int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType* dataType);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 6 MipiCsiSetExtDataType的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
dataType结构体指针,定义YUV和原始数据格式以及位深度
返回值返回值描述
HDF_SUCCESS设置成功
负数设置失败
    int32_t ret;
    struct ExtDataType dataType;

    // 配置YUV和RAW数据格式和位深参数 
    dataType.devno = 0;               // 设备0 
    dataType.num = 0;                 // Sensor 0 
    dataType.extDataBitWidth[0] = 12; // 位深数组元素0 
    dataType.extDataBitWidth[1] = 12; // 位深数组元素1 
    dataType.extDataBitWidth[2] = 12; // 位深数组元素2 

    dataType.extDataType[0] = 0x39;   // 定义YUV和原始数据格式以及位深度元素0 
    dataType.extDataType[1] = 0x39;   // 定义YUV和原始数据格式以及位深度元素1 
    dataType.extDataType[2] = 0x39;   // 定义YUV和原始数据格式以及位深度元素2 
    // 设置YUV和RAW数据格式和位深 
    ret = MipiCsiSetExtDataType(MipiCsiHandle, &dataType);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiSetExtDataType: mipi csi set ext data type fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">
    int32_t MipiCsiSetHsMode(DevHandle handle, LaneDivideMode laneDivideMode);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 7 MipiCsiSetHsMode的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
laneDivideMode结构体类型,Lane模式参数
返回值返回值描述
HDF_SUCCESS设置成功
负数设置失败
    int32_t ret;
    enum LaneDivideMode mode;

    // Lane模式参数为0 
    mode = LANE_DIVIDE_MODE_0;
    // 设置MIPI RX的 Lane分布 
    ret = MipiCsiSetHsMode(MipiCsiHandle, mode);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiSetHsMode: mipi csi set hs mode fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
    int32_t MipiCsiSetPhyCmvmode(DevHandle handle, uint8_t devno, PhyCmvMode cmvMode);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 8 MipiCsiSetPhyCmvmode的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
cmvMode结构体类型,共模电压模式参数
devnouint8_t类型,设备编号
返回值返回值描述
HDF_SUCCESS设置成功
负数设置失败
    int32_t ret;
    enum PhyCmvMode mode;
    uint8_t devno;

    // 共模电压模式参数为0 
    mode = PHY_CMV_GE1200MV;
    // 设备编号为0 
    devno = 0;
    // 设置共模电压模式 
    ret = MipiCsiSetPhyCmvmode(MipiCsiHandle, devno, mode);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiSetPhyCmvmode: mipi csi set phy cmv mode fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
复位/撤销复位Sensor
    int32_t MipiCsiResetSensor(DevHandle handle, uint8_t snsResetSource);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 9 MipiCsiResetSensor的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
snsResetSourceuint8_t类型,传感器的复位信号线号,在软件中称为传感器的复位源
返回值返回值描述
HDF_SUCCESS复位成功
负数复位失败
    int32_t ret;
    uint8_t snsResetSource;

    // 传感器复位信号线号为0 
    snsResetSource = 0;
    // 复位Sensor 
    ret = MipiCsiResetSensor(MipiCsiHandle, snsResetSource);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiResetSensor: mipi csi reset sensor fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
    int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 10 MipiCsiUnresetSensor的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
snsResetSourceuint8_t类型,传感器的复位信号线号,在软件中称为传感器的复位源
返回值返回值描述
HDF_SUCCESS撤销复位成功
负数撤销复位失败
    int32_t ret;
    uint8_t snsResetSource;

    // 传感器撤销复位信号线号为0 
    snsResetSource = 0;
    // 撤销复位Sensor 
    ret = MipiCsiUnresetSensor(MipiCsiHandle, snsResetSource);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiUnresetSensor: mipi csi unreset sensor fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
复位/撤销复位MIPI RX
    int32_t MipiCsiResetRx(DevHandle handle, uint8_t comboDev);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 11 MipiCsiResetRx的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
comboDevuint8_t类型,MIPI RX或LVDS通路序号
返回值返回值描述
HDF_SUCCESS复位成功
负数复位失败
    int32_t ret;
    uint8_t comboDev;

    // 通路序号为0 
    comboDev = 0;
    // 复位MIPI RX 
    ret = MipiCsiResetRx(MipiCsiHandle, comboDev);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiResetRx: mipi csi reset rx fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
    int32_t MipiCsiUnresetRx(DevHandle handle, uint8_t comboDev);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 12 MipiCsiUnresetRx的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
comboDevuint8_t类型,MIPI RX或LVDS通路序号
返回值返回值描述
HDF_SUCCESS撤销复位成功
负数撤销复位失败
    int32_t ret;
    uint8_t comboDev;

    // 通路序号为0 
    comboDev = 0;
    // 撤销复位MIPI RX 
    ret = MipiCsiUnresetRx(MipiCsiHandle, comboDev);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiUnresetRx: mipi csi unreset rx fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
使能/关闭MIPI的时钟
    int32_t MipiCsiEnableClock(DevHandle handle, uint8_t comboDev);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 13 MipiCsiEnableClock的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
comboDevuint8_t类型,通路序号
返回值返回值描述
HDF_SUCCESS使能成功
负数使能失败
    int32_t ret;
    uint8_t comboDev;

    // 通路序号为0 
    comboDev = 0;
    // 使能MIPI的时钟 
    ret = MipiCsiEnableClock(MipiCsiHandle, comboDev);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiEnableClock: mipi csi enable clock fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
    int32_t MipiCsiDisableClock(DevHandle handle, uint8_t comboDev);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 14 MipiCsiDisableClock的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
comboDevuint8_t类型,通路序号
返回值返回值描述
HDF_SUCCESS关闭成功
负数关闭失败
    int32_t ret;
    uint8_t comboDev;

    // 通路序号为0 
    comboDev = 0;
    // 关闭MIPI的时钟 
    ret = MipiCsiDisableClock(MipiCsiHandle, comboDev);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiDisableClock: mipi csi disable clock fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
使能/关闭MIPI上的Sensor时钟
    int32_t MipiCsiEnableSensorClock(DevHandle handle, uint8_t snsClkSource);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 15 MipiCsiEnableSensorClock的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
snsClkSourceuint8_t类型,传感器的时钟信号线号,在软件中称为传感器的时钟源
返回值返回值描述
HDF_SUCCESS使能成功
负数使能失败
    int32_t ret;
    uint8_t snsClkSource;

    // 传感器的时钟信号线号为0 
    snsClkSource = 0;
    // 使能MIPI上的Sensor时钟 
    ret = MipiCsiEnableSensorClock(MipiCsiHandle, snsClkSource);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiEnableSensorClock: mipi csi enable sensor clock fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
    int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 16 MipiCsiDisableSensorClock的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,控制器操作句柄
snsClkSourceuint8_t类型,传感器的时钟信号线号,在软件中称为传感器的时钟源
返回值返回值描述
HDF_SUCCESS关闭成功
负数关闭失败
    int32_t ret;
    uint8_t snsClkSource;

    // 传感器的时钟信号线号为0 
    snsClkSource = 0;
    // 关闭MIPI上的Sensor时钟 
    ret = MipiCsiDisableSensorClock(MipiCsiHandle, snsClkSource);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiCsiDisableSensorClock: mipi csi disable sensor clock fail, ret=%d\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
释放MIPI CSI控制器操作句柄

MIPI CSI使用完成之后,需要释放控制器操作句柄,释放句柄的函数如下所示:

void MipiCsiClose(DevHandle handle);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

该函数会释放掉由MipiCsiOpen申请的资源。

表 17 MipiCsiClose的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,MIPI CSI控制器操作句柄
MipiCsiClose(MIPIHandle); // 释放掉MIPI CSI控制器操作句柄 
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

使用实例

本例拟对Hi3516DV300开发板上MIPI CSI设备进行操作。

MIPI CSI完整的使用示例如下所示:

#include "hdf_log.h"
#include "mipi_csi_if.h"
#include "securec.h"

enum InterfaceType {
    INTERFACE_MIPI = 0,
    INTERFACE_LVDS,
    INTERFACE_CMOS,
    INTERFACE_BUTT
};

static void InitMipiDevAttr(MipiDevAttr *mipiAttr)
{
    MipiDevAttr attr;
    if (mipiAttr == NULL) {
        return;
    }

    HDF_LOGI("InitMipiDevAttr: enter.");
    (void)memset_s(&attr, sizeof(MipiDevAttr), 0, sizeof(MipiDevAttr));
    attr.inputDataType = DATA_TYPE_RAW_12BIT;
    attr.wdrMode = HI_MIPI_WDR_MODE_NONE;
    // laneId: -1 - disable
    attr.laneId[0] = 0;          // 0 -- laneId 0 
    attr.laneId[1] = 1;          // 1 -- laneId 1 
    attr.laneId[2] = 2;          // 2 -- laneId 2 
    attr.laneId[3] = 3;          // 3 -- laneId 3 

    // Used by the HI_MIPI_WDR_MODE_DT, This is not fully tested!
    if (attr.wdrMode == HI_MIPI_WDR_MODE_DT) {
        attr.dataType[0] = 0x39; // 0x39 -- data type reserved 
        attr.dataType[1] = 0x39; // 0x39 -- data type reserved 
        attr.dataType[2] = 0x39; // 0x39 -- data type reserved 
        attr.dataType[3] = 0x39; // 0x39 -- data type reserved 
    }

    *mipiAttr = attr;
}

static int MipiGetIntputModeType(InputMode inputMode)
{
    switch (inputMode) {
        case INPUT_MODE_SUBLVDS:
        case INPUT_MODE_LVDS:
        case INPUT_MODE_HISPI:
            return INTERFACE_LVDS;
        case INPUT_MODE_MIPI:
            return INTERFACE_MIPI;
        case INPUT_MODE_CMOS:
        case INPUT_MODE_BT1120:
        case INPUT_MODE_BT656:
        case INPUT_MODE_BYPASS:
            return INTERFACE_CMOS;
        default:
            break;
    }

    return INTERFACE_BUTT;
}

static void InitLvdsDevAttr(LvdsDevAttr *lvdsAttr)
{
    int i;
    int j;
    int k;
    LvdsDevAttr attr;

    if (lvdsAttr == NULL) {
        return;
    }

    (void)memset_s(&attr, sizeof(LvdsDevAttr), 0, sizeof(LvdsDevAttr));
    attr.inputDataType = DATA_TYPE_RAW_12BIT;
    attr.wdrMode = HI_WDR_MODE_NONE;
    // LVDS synchronization mode. LVDS_SYNC_MODE_SOF, LVDS_SYNC_MODE_SAV
    attr.syncMode = LVDS_SYNC_MODE_SOF;
    // LVDS Vsync type. LVDS_VSYNC_NORMAL, LVDS_VSYNC_SHARE, LVDS_VSYNC_HCONNECT
    attr.vsyncAttr.syncType = LVDS_VSYNC_NORMAL;
    // hconnect vsync blanking len, valid when the syncType is LVDS_VSYNC_HCONNECT
    // This is not fully tested!
    if (attr.vsyncAttr.syncType == LVDS_VSYNC_HCONNECT) {
        attr.vsyncAttr.hblank1 = 0;
        attr.vsyncAttr.hblank2 = 0;
    }
    // frame identification code: LVDS_FID_NONE, LVDS_FID_IN_SAV, LVDS_FID_IN_DATA
    attr.fidAttr.fidType = LVDS_FID_NONE;
    // 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.
    // This is not fully tested!
    attr.fidAttr.outputFil = 'm';
    // LVDS bit size end mode: LVDS_ENDIAN_LITTLE, LVDS_ENDIAN_BIG
    attr.dataEndian = LVDS_ENDIAN_LITTLE;
    // sync code endian: little/big, LVDS_ENDIAN_LITTLE, LVDS_ENDIAN_BIG
    attr.syncCodeEndian = LVDS_ENDIAN_LITTLE;
    // laneId: -1 - disable
    attr.laneId[0] = 0; // 0 -- laneId 0 
    attr.laneId[1] = 1; // 1 -- laneId 1 
    attr.laneId[2] = 2; // 2 -- laneId 2 
    attr.laneId[3] = 3; // 3 -- laneId 3 

    /* 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 
       This is not fully tested! */
    for (i = 0; i < LVDS_LANE_NUM; i++) {
        for (j = 0; j < WDR_VC_NUM; j++) {
            for (k = 0; k < SYNC_CODE_NUM; k++) {
                attr.syncCode[i][j][k] = 0; // 0 -- frame0 sof 
            }
        }
    }

    *lvdsAttr = attr;
}

static int32_t PalMipiCsiTestSample(void)
{
    uint8_t id;
    int32_t ret;
    uint8_t comboDev;
    uint8_t snsClkSource;
    uint8_t snsResetSource;
    uint8_t devno;
    LaneDivideMode laneMode;
    PhyCmvMode CmvMode;
    ComboDevAttr attr;
    DevHandle MipiCsiHandle = NULL;
    enum InterfaceType interType;
    
    // 控制器ID号 
    id = 0; 
    // 获取控制器操作句柄 
    MipiCsiHandle = MipiCsiOpen(id);
    if (MipiCsiHandle == NULL) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi open fail!\n");
        return HDF_FAILURE;
    }

    // Lane模式参数为0 
    laneMode = LANE_DIVIDE_MODE_0;
    // 设置MIPI RX的Lane分布 
    ret = MipiCsiSetHsMode(MipiCsiHandle, laneMode);
    if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi set hs mode fail, ret=%d\n", ret);
        return ret;
    }

    // 通路序号为0 
    comboDev = 0;
    // 使能MIPI的时钟 
    ret = MipiCsiEnableClock(MipiCsiHandle, comboDev);
    if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi enable clock fail, ret=%d\n", ret);
        return ret;
    }
    
    // 复位MIPI RX 
    ret = MipiCsiResetRx(MipiCsiHandle, comboDev);
    if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi reset rx fail, ret=%d\n", ret);
        return ret;
    }

    // 传感器的时钟信号线号为0 
    snsClkSource = 0;
    // 使能MIPI上的Sensor时钟 
    ret = MipiCsiEnableSensorClock(MipiCsiHandle, snsClkSource);
    if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi enable sensor clock fail, ret=%d\n", ret);
        return ret;
    }
    snsResetSource = 0;
    // 复位Sensor 
    ret = MipiCsiResetSensor(MipiCsiHandle, snsResetSource);
    if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi reset sensor fail, ret=%d\n", ret);
        return ret;
    }
    
    // MIPI参数配置如下 
    (void)memset_s(&attr, sizeof(ComboDevAttr), 0, sizeof(ComboDevAttr));
    attr.devno = 0;                    // 设备0 
    attr.inputMode = INPUT_MODE_MIPI;  // 输入模式为MIPI 
    attr.dataRate = MIPI_DATA_RATE_X1; // 每时钟输出1像素 
    attr.imgRect.x = 0;                // 0: 图像传感器左上位置 
    attr.imgRect.y = 0;                // 0: 图像传感器右上位置 
    attr.imgRect.width = 2592;         // 2592: 图像传感器宽度大小 
    attr.imgRect.height = 1944;        // 1944: 图像传感器高度尺寸 
    interType = MipiGetIntputModeType(attr.inputMode);
    if (interType == INTERFACE_MIPI) {
        HDF_LOGI("PalMipiCsiTestSample: call[InitMipiDevAttr].");
        InitMipiDevAttr(&attr.mipiAttr);
    } else if (interType == INTERFACE_LVDS) {
        HDF_LOGI("PalMipiCsiTestSample: call[InitLvdsDevAttr].");
        InitLvdsDevAttr(&attr.lvdsAttr);
    } else {
        HDF_LOGE("PalMipiCsiTestSample: interType = %d is error!", attr.inputMode);
    }
    // 写入配置数据 
    ret = MipiCsiSetComboDevAttr(MipiCsiHandle, &attr);
    if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi set combo devAttr fail, ret=%d\n", ret);
        return ret;
    }
    
    // 共模电压模式参数为0 
    CmvMode = PHY_CMV_GE1200MV;
    // 设备编号为0 
    devno = 0;
    // 设置共模电压模式 
    ret = MipiCsiSetPhyCmvmode(MipiCsiHandle, devno, CmvMode);
    if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi set phy cmv mode fail, ret=%d\n", ret);
        return ret;
    }
    
    // 通路序号为0 
    comboDev = 0;
    // 撤销复位MIPI RX 
    ret = MipiCsiUnresetRx(MipiCsiHandle, comboDev);
    if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi unreset rx fail, ret=%d\n", ret);
        return ret;
    }
    
    // 关闭MIPI的时钟 
    ret = MipiCsiDisableClock(MipiCsiHandle, comboDev);
    if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi disable clock fail, ret=%d\n", ret);
        return ret;
    }
    
    // 传感器撤销复位信号线号为0 
    snsResetSource = 0;
    // 撤销复位Sensor 
    ret = MipiCsiUnresetSensor(MipiCsiHandle, snsResetSource);
    if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi unreset sensor fail, ret=%d\n", ret);
        return ret;
    }
    
    // 关闭MIPI上的Sensor时钟 
    ret = MipiCsiDisableSensorClock(MipiCsiHandle, snsClkSource);
    if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
        HDF_LOGE("PalMipiCsiTestSample: mipi csi disable sensor clock fail, ret=%d\n", ret);
        return ret;
    }
    HDF_LOGI("PalMipiCsiTestSample: function tests end.");
    // 释放MIPI DSI设备句柄 
    MipiCsiClose(MipiCsiHandle);
    return ret;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

如果大家想更加深入的学习 OpenHarmony(鸿蒙南向) 开发的全栈内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:

OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy

系统架构分析:https://qr18.cn/CgxrRy

OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy

在这里插入图片描述

OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy

写在最后

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/maniuT/article/details/141111728","extend1":"pc","ab":"new"}">> id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type2" id="blog_extension"> class="extension_official" data-report-click="{"spm":"1001.2101.3001.6471"}" data-report-view="{"spm":"1001.2101.3001.6471"}"> class="blog_extension_card_left"> class="blog_extension_card_cont"> 鸿蒙开发学习资料领取!!! class="blog_extension_card_cont_r"> 微信名片
注:本文转载自blog.csdn.net的沧海一笑-dj的文章"https://blog.csdn.net/dengjin20104042056/article/details/99709956"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!