1 Star 0 Fork 5.1K

youguilin / docs

forked from OpenHarmony / docs 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
MIPI-DSI使用指导.md 17.59 KB
一键复制 编辑 原始数据 按行查看 历史
mamingshuai 提交于 2021-06-02 01:00 . update OpenHarmony 2.0 Canary

MIPI DSI使用指导

使用流程

使用MIPI-DSI的一般流程如图1所示。

图 1 MIPI-DSI使用流程图

获取MIPI-DSI操作句柄

在进行MIPI-DSI进行通信前,首先要调用MipiDsiOpen获取操作句柄,该函数会返回指定通道ID的操作句柄。

DevHandle MipiDsiOpen(uint8_t id);

表 1 MipiDsiOpen的参数和返回值描述

参数

参数描述

id

MIPI DSI通道ID

返回值

返回值描述

NULL

获取失败

设备句柄

获取到指令通道的操作句柄, 类型为DevHandle

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

DevHandle mipiDsiHandle = NULL;  /* 设备句柄 */
chnId = 0;      /* MIPI-DSI通道ID */

/* 获取操作句柄 */
mipiDsiHandle = MipiDsiOpen(chnId);
if (mipiDsiHandle == NULL) {
    HDF_LOGE("MipiDsiOpen: failed\n");
    return;
}

MIPI-DSI相应配置

  • 写入MIPI-DSI配置

int32_t MipiDsiSetCfg(DevHandle handle, struct MipiCfg *cfg);

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

参数

参数描述

handle

操作句柄

cfg

MIPI-DSI相应配置buf 指针

返回值

返回值描述

0

设置成功

负数

设置失败

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(g_handle, &cfg);
if (ret != 0) {
    HDF_LOGE("%s: SetMipiCfg fail! ret=%d\n", __func__, ret);
    return -1;
}
  • 获取当前MIPI-DSI的配置

int32_t MipiDsiGetCfg(DevHandle handle, struct MipiCfg *cfg);

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

参数

参数描述

handle

操作句柄

cfg

MIPI-DSI相应配置buf 指针

返回值

返回值描述

0

获取成功

负数

获取失败

int32_t ret;
struct MipiCfg cfg;
memset(&cfg, 0, sizeof(struct MipiCfg));
ret = MipiDsiGetCfg(g_handle, &cfg);
if (ret != HDF_SUCCESS) {
    HDF_LOGE("%s: GetMipiCfg fail!\n", __func__);
    return HDF_FAILURE;
}

发送/回读控制指令

  • 发送指令

int32_t MipiDsiTx(PalHandle handle, struct DsiCmdDesc *cmd);

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

参数

参数描述

handle

操作句柄

cmd

需要发送的指令数据指针

返回值

返回值描述

0

发送成功

负数

发送失败

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("%s: PalMipiDsiTx fail! ret=%d\n", __func__, ret);
    HdfFree(cmd->payload);
    HdfFree(cmd);
    return HDF_FAILURE;
}
HdfFree(cmd->payload);
HdfFree(cmd);
  • 回读指令

int32_t MipiDsiRx(DevHandle handle, struct DsiCmdDesc *cmd, uint32_t readLen, uint8_t *out);

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

参数

参数描述

handle

操作句柄

cmd

需要回读的指令数据指针

readLen

期望回读的数据长度

out

回读的数据buf指针

返回值

返回值描述

0

获取成功

负数

获取失败

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(g_handle);
ret = MipiDsiRx(g_handle, cmdRead, sizeof(readVal), &readVal);
MipiDsiSetHsMode(g_handle);
if (ret != HDF_SUCCESS) {
    HDF_LOGE("%s: MipiDsiRx fail! ret=%d\n", __func__, ret);
    HdfFree(cmdRead->payload);
    HdfFree(cmdRead);
    return HDF_FAILURE;
}
HdfFree(cmdRead->payload);
HdfFree(cmdRead);

释放MIPI-DSI操作句柄

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

void MipiDsiClose(DevHandle handle);

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

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

参数

参数描述

handle

MIPI-DSI操作句柄

MipiDsiClose(mipiHandle); /* 释放掉MIPI-DSI操作句柄 */
1
https://gitee.com/yougl/docs.git
git@gitee.com:yougl/docs.git
yougl
docs
docs
master

搜索帮助