表 3 MipiDsiSetCfg的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,操作句柄
cfg结构体指针类型,MIPI DSI相应配置buf 指针
返回值返回值描述
HDF_SUCCESS设置MIPI DSI配置成功
负数设置MIPI DSI配置失败
    int32_t ret;
    struct MipiCfg cfg = {0};

    // 当前对接的屏幕配置如下
    cfg.lane = DSI_4_LANES;
    cfg.mode = DSI_CMD_MODE;
    cfg.burstMode = VIDEO_NON_BURST_MODE_SYNC_EVENTS;
    cfg.format = FORMAT_RGB_24_BIT;
    cfg.pixelClk = 174;
    cfg.phyDataRate = 384;
    cfg.timingInfo.hsaPixels = 50;
    cfg.timingInfo.hbpPixels = 55;
    cfg.timingInfo.hlinePixels = 1200;
    cfg.timingInfo.yResLines = 1800;
    cfg.timingInfo.vbpLines = 33;
    cfg.timingInfo.vsaLines = 76;
    cfg.timingInfo.vfpLines = 120;
    cfg.timingInfo.xResPixels = 1342;
    // 写入配置数据
    ret = MipiDsiSetCfg(mipiDsiHandle, &cfg);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiDsiSetCfg: set mipi cfg 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 MipiDsiGetCfg(DevHandle handle, struct MipiCfg *cfg);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

表 4 MipiDsiGetCfg的参数和返回值描述

class="table-box">
参数参数描述
handleDevHandle类型,操作句柄
cfg结构体指针,MIPI DSI相应配置buf 指针
返回值返回值描述
HDF_SUCCESS获取当前MIPI DSI的配置成功
负数获取当前MIPI DSI的配置失败
    int32_t ret;
    struct MipiCfg cfg;
    memset(&cfg, 0, sizeof(struct MipiCfg));
    ret = MipiDsiGetCfg(mipiDsiHandle, &cfg);
    if (ret != HDF_SUCCESS) {
        HDF_LOGEMipiDsiGetCfg: get mipi cfg fail, ret:%d!\n", ret);
        return ret;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
发送/回读控制指令
    int32_t MipiDsiTx(PalHandle handle, struct DsiCmdDesc *cmd);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

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

class="table-box">
参数参数描述
handleDevHandle类型,操作句柄
cmd结构体指针类型,需要发送的指令数据指针
返回值返回值描述
HDF_SUCCESS发送成功
负数发送失败
    int32_t ret;
    struct DsiCmdDesc *cmd = OsalMemCalloc(sizeof(struct DsiCmdDesc));
    if (cmd == NULL) {
        return HDF_FAILURE;
    }
    cmd->dtype = DTYPE_DCS_WRITE;
    cmd->dlen = 1;
    cmd->payload = OsalMemCalloc(sizeof(uint8_t));
    if (cmd->payload == NULL) {
        HdfFree(cmd);
        return HDF_FAILURE;
    }
    *(cmd->payload) = DTYPE_GEN_LWRITE;
    MipiDsiSetLpMode(mipiHandle);
    ret = MipiDsiTx(mipiHandle, cmd);
    MipiDsiSetHsMode(mipiHandle);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiDsiTx: mipi dsi tx fail, ret:%d\n", ret);
        HdfFree(cmd->payload);
        HdfFree(cmd);
        return ret;
    }
    HdfFree(cmd->payload);
    HdfFree(cmd);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">
    int32_t MipiDsiRx(DevHandle handle, struct DsiCmdDesc *cmd, uint32_t readLen, uint8_t *out);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

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

class="table-box">
参数参数描述
handleDevHandle类型,操作句柄
cmd结构体指针类型,需要回读的指令数据指针
readLenuint32_t类型,期望回读的数据长度
outuint8_t类型指针,回读的数据
返回值返回值描述
HDF_SUCCESS获取成功
负数获取失败
    int32_t ret;
    uint8_t readVal = 0;

    struct DsiCmdDesc *cmdRead = OsalMemCalloc(sizeof(struct DsiCmdDesc));
    if (cmdRead == NULL) {
        return HDF_FAILURE;
    }
    cmdRead->dtype = DTYPE_DCS_READ;
    cmdRead->dlen = 1;
    cmdRead->payload = OsalMemCalloc(sizeof(uint8_t));
    if (cmdRead->payload == NULL) {
        HdfFree(cmdRead);
        return HDF_FAILURE;
    }
    *(cmdRead->payload) = DDIC_REG_STATUS;
    MipiDsiSetLpMode(mipiDsiHandle);
    ret = MipiDsiRx(mipiDsiHandle, cmdRead, sizeof(readVal), &readVal);
    MipiDsiSetHsMode(mipiDsiHandle);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("MipiDsiRx: mipi dsi rx fail, ret:%d\n", ret);
        HdfFree(cmdRead->payload);
        HdfFree(cmdRead);
        return HDF_FAILURE;
    }
    HdfFree(cmdRead->payload);
    HdfFree(cmdRead);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">
释放MIPI DSI操作句柄

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

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

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

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

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

使用实例

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

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

#include "hdf_log.h"
#include "mipi_dsi_if.h"
#include "osal_mem.h"

#define DTYPE_DCS_WRITE 0x05
#define DTYPE_DCS_READ 0x06
#define DTYPE_GEN_LWRITE 0x29
#define DDIC_REG_STATUS 0x0A

int32_t PalMipiDsiTestSample(void)
{
    uint8_t chnId;
    int32_t ret;  
    DevHandle mipiDsiHandle = NULL;

    // 设备通道编号
    chnId = 0; 
    // 获取操作句柄
    mipiDsiHandle = MipiDsiOpen(chnId);
    if (mipiDsiHandle == NULL) {
        HDF_LOGE("MipiDsiOpen: failed!\n");
        return HDF_FAILURE;
    }
    // 配置相应参数 
    struct MipiCfg cfg = {0};
    cfg.lane = DSI_2_LANES;
    cfg.mode = DSI_VIDEO_MODE;
    cfg.format = FORMAT_RGB_24_BIT;
    cfg.burstMode = VIDEO_BURST_MODE;
    cfg.timing.xPixels = 480;           // 480: width 
    cfg.timing.hsaPixels = 10;          // 10: horizontal sync porch 
    cfg.timing.hbpPixels = 20;          // 20: horizontal back porch 
    cfg.timing.hlinePixels = 530;       // 530: horizontal total width 
    cfg.timing.vsaLines = 2;            // 2: vertiacl sync width 
    cfg.timing.vbpLines = 14;           // 14: vertiacl back porch 
    cfg.timing.vfpLines = 16;           // 16: vertiacl front porch 
    cfg.timing.ylines = 960;            // 960: height 
    cfg.timing.edpiCmdSize = 0;         // 0 : no care 
    cfg.pixelClk = 31546;               // 31546: pixel clk   
    cfg.phyDataRate = 379;              // 379: mipi clk 
    // 写入配置数据 
    ret = MipiDsiSetCfg(mipiDsiHandle, &cfg);
    if (ret != 0) {
        HDF_LOGE("PalMipiDsiTestSample: set mipi dsi cfg fail, ret:%d\n", ret);
        return ret;
    }
    // 发送PANEL初始化指令 
    struct DsiCmdDesc *cmd = OsalMemCalloc(sizeof(struct DsiCmdDesc));
    if (cmd == NULL) {
        return -1;
    }
    cmd->dataType = DTYPE_DCS_WRITE;
    cmd->dataLen = 1;
    cmd->payload = OsalMemCalloc(sizeof(uint8_t));
    if (cmd->payload == NULL) {
        OsalMemFree(cmd);
        return -1;
    }
    *(cmd->payload) = DTYPE_GEN_LWRITE;
    MipiDsiSetLpMode(mipiDsiHandle);
    ret = MipiDsiTx(mipiDsiHandle, cmd);
    MipiDsiSetHsMode(mipiDsiHandle);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("PalMipiDsiTestSample: mipi dsi tx fail, ret:%d\n", ret);
        OsalMemFree(cmd->payload);
        OsalMemFree(cmd);
        return ret;
    }
    OsalMemFree(cmd->payload);
    OsalMemFree(cmd);
    // 回读panel状态寄存器 
    uint8_t readVal = 0;
    struct DsiCmdDesc *cmdRead = OsalMemCalloc(sizeof(struct DsiCmdDesc));
    if (cmdRead == NULL) {
        return -1;
    }
    cmdRead->dataType = DTYPE_DCS_READ;
    cmdRead->dataLen = 1;
    cmdRead->payload = OsalMemCalloc(sizeof(uint8_t));
    if (cmdRead->payload == NULL) {
        OsalMemFree(cmdRead);
        return -1;
    }
    *(cmdRead->payload) = DDIC_REG_STATUS;
    MipiDsiSetLpMode(mipiDsiHandle);
    ret = MipiDsiRx(mipiDsiHandle, cmdRead, sizeof(readVal), &readVal);
    MipiDsiSetHsMode(mipiDsiHandle);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("PalMipiDsiTestSample: mipi dsi rx fail, ret:%d\n", ret);
        OsalMemFree(cmdRead->payload);
        OsalMemFree(cmdRead);
        return ret;
    }
    OsalMemFree(cmdRead->payload);
    OsalMemFree(cmdRead);
    HDF_LOGD("PalMipiDsiTestSample: mipi dsi tests end");
    // 释放MIPI DSI设备句柄 
    MipiDsiClose(mipiDsiHandle);
    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/141112353","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/99710012"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!