Harmony鸿蒙南向驱动开发-MIPI DSI接口使用

功能简介

DSI(Display Serial Interface)是由移动行业处理器接口联盟(Mobile Industry Processor Interface (MIPI) Alliance)制定的规范,旨在降低移动设备中显示控制器的成本。它以串行的方式发送像素数据或指令给外设(通常是LCD或者类似的显示设备),或从外设中读取状态信息或像素信息;它定义了主机、图像数据源和目标设备之间的串行总线和通信协议。

MIPI DSI具备高速模式和低速模式两种工作模式,全部数据通道都可以用于单向的高速传输,但只有第一个数据通道才可用于低速双向传输,从属端的状态信息、像素等是通过该数据通道返回。时钟通道专用于在高速传输数据的过程中传输同步时钟信号。

图1显示了简化的DSI接口。从概念上看,符合DSI的接口与基于DBI-2和DPI-2标准的接口具有相同的功能。它向外围设备传输像素或命令数据,并且可以从外围设备读取状态或像素信息。主要区别在于,DSI对所有像素数据、命令和事件进行序列化,而在传统接口中,这些像素数据、命令和事件通常需要附加控制信号才能在并行数据总线上传输。

图 1 DSI发送、接收接口

DSI发送、接收接口

DSI标准对应D-PHY、DSI、DCS规范,可分为四层:

  • PHY Layer

    PHY层指定传输介质(电导体)、输入/输出电路和从串行比特流中捕获“1”和“0”的时钟机制。这一部分的规范记录了传输介质的特性、信号的电气参数以及时钟与数据通道之间的时序关系。在DSI链路的发送端,并行数据、信号事件和命令按照包组织在协议层转换为包。协议层附加包协议信息和报头,然后通过Lane Management层向PHY发送完整的字节。数据由PHY进行序列化,并通过串行链路发送。DSI链路的接收端执行与发送端相反的操作,将数据包分解为并行的数据、信号事件和命令。如果有多个Lane, Lane管理层将字节分配给单独的物理层,每个Lane一个PHY。

  • Lane Management层

    负责发送和收集数据流到每条Lane。数据Lane的三种操作模式 :espace mode,High-Speed(Burst) mode,Control mode。

  • Low Level Protocol层

    定义了如何组帧和解析以及错误检测等。

  • Application层

    描述高层编码和解析数据流。这一层描述了数据流中包含的数据的更高级的编码和解释。根据显示子系统架构的不同,它可能由具有指定格式的像素或编码的位流组成,或者由显示模块内的显示控制器解释的命令组成。DSI规范描述了像素值、位流、命令和命令参数到包集合中的字节的映射。

运作机制

MIPI DSI软件模块各分层的作用为:

  • 接口层:提供打开设备、写入数据和关闭设备的接口。

  • 核心层:主要提供绑定设备、初始化设备以及释放设备的能力。

  • 适配层:实现其它具体的功能。

说明:
核心层可以调用接口层的函数,核心层通过钩子函数调用适配层函数,从而适配层可以间接的调用接口层函数,但是不可逆转接口层调用适配层函数。

图 2 DSI无服务模式结构图

DSI无服务模式结构图

约束与限制

由于使用无服务模式,MIPI_DSI接口暂不支持用户态使用。

使用指导

场景介绍

MIPI DSI主要用于连接显示屏。

接口说明

MIPI DSI模块提供的主要接口如表1所示,具体API详见//drivers/hdf_core/framework/include/platform/mipi_dsi_if.h。

表1 MIPI DSI API接口功能介绍

功能分类接口名
DevHandle MipiDsiOpen(uint8_t id)获取MIPI DSI操作句柄
void MipiDsiClose(DevHandle handle)释放MIPI DSI操作句柄
int32_t MipiDsiSetCfg(DevHandle handle, struct MipiCfg *cfg)设置MIPI DSI相关配置
int32_t MipiDsiGetCfg(DevHandle handle, struct MipiCfg *cfg)获取当前MIPI DSI相关配置
void MipiDsiSetLpMode(DevHandle handle)设置MIPI DSI进入Low power模式
void MipiDsiSetHsMode(DevHandle handle)设置MIPI DSI进入High speed模式
int32_t MipiDsiTx(DevHandle handle, struct DsiCmdDesc *cmd)DSI发送指令
int32_t MipiDsiRx(DevHandle handle, struct DsiCmdDesc *cmd, int32_t readLen, uint8_t *out)MIPI DSI按期望长度回读数据

开发步骤

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

图 3 MIPI DSI使用流程图

MIPI DSI使用流程图

获取MIPI DSI操作句柄

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

DevHandle MipiDsiOpen(uint8_t id);

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

参数参数描述
iduint8_t类型,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: mipi dsi open fail.\n");return NULL;
}
MIPI DSI相应配置
  • 写入MIPI DSI配置

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

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

    参数参数描述
    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;
    }
  • 获取当前MIPI DSI的配置

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

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

    参数参数描述
    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;
    }
发送/回读控制指令
  • 发送指令

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

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

    参数参数描述
    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);
  • 回读指令

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

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

    参数参数描述
    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);
释放MIPI DSI操作句柄

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

void MipiDsiClose(DevHandle handle);

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

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

参数参数描述
handleDevHandle类型,MIPI DSI操作句柄
MipiDsiClose(mipiHandle); // 释放掉MIPI DSI操作句柄

使用实例

本例拟对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 0x0Aint32_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;
}

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/610276.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+vue网上点餐系统包含万字文档

基于SpringBoot的网上点餐系统包含万字文档 项目视频演示: springboot027网上点餐系统包含万字文档 开发系统:Windows 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要…

【文献管理】Zotero

软件介绍 文献管理软件Zotero功能强大、免费、使用便捷、可自由扩展功能,能极大地提升我们的学习、科研效率。 下载软件 Zotero官方网址 功能介绍 收集题录 管理题录 插入引文 同步文献 插件与常见问题 茉莉花 翻译 抓取失败编译器更新 样式下载地址 CNKI编译器…

6.12物联网RK3399项目开发实录-驱动开发之UART 串口的使用(wulianjishu666)

嵌入式实战开发例程【珍贵收藏,开发必备】: 链接:https://pan.baidu.com/s/1tkDBNH9R3iAaHOG1Zj9q1Q?pwdt41u UART 使用 简介 AIO-3399J 支持 SPI 桥接/扩展 4 个增强功能串口(UART)的功能,分别为 UA…

Python 全栈体系【四阶】(二十六)

第五章 深度学习 四、OpenCV 1. OpenCV安装 执行以下命令安装opencv-python库(核心库)和opencv-contrib-python库(贡献库)。注意:命令拷贝后要合成一行执行,中间不要换行。 # 安装opencv核心库 pip3 in…

用于扩展Qt本身的插件(上)

Qt自身插件 引言示例插件与应用插件的程序作为整体插件和应用插件的程序单独存在实现插件编写测试插件的程序应用插件运行结果引言 用于扩展qt自身的插件按照我的理解分为两种: 1. 直接扩展Qt自身,无需在QtCreator的设计器中加载; 2. 扩展Qt自身,同时需要在QtCreator的设计…

Java | Leetcode Java题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int n nums.length;int best 10000000;// 枚举 afor (int i 0; i < n; i) {// 保证和上一次枚举的元素不相等if (i > 0 && nums…

每天学点儿Python(6) -- 列表和枚举

列表是Python中内置的可变序列&#xff0c;类使用C/C中的数组&#xff0c;使用 [ ] 定义列表&#xff0c;列表中的元素与元素之间用英文逗号&#xff08; , &#xff09;分隔&#xff0c; 但是Python中列表可以存储任意类型的数据&#xff0c;且可以混存&#xff08;即类型可以…

未来课堂革命:OpenAI 发布 ChatGPT 使用指南,探索生成式 AI 如何重塑教育景观

随着新学期的来临&#xff0c;众多初登教师舞台的 00 后们&#xff0c;也完成了他们的第一个教师身份下的暑期生活。 对于开学的抵触情绪&#xff0c;不仅学生们普遍存在&#xff0c;许多 00 后的新晋教师们也同样感同身受。某种程度上&#xff0c;这些抗拒上班的年轻教师群体…

蓝牙app设计 (方案一)app inventor

app Inventor是一款谷歌公司开发的手机编程软件。 谷歌推出一款名叫Google App Inventor的工具软件, Google App Inventor用户能够通过该工具软件使用谷歌的Android系列软件自行研发适合手机使用的任意应用程序。 而且这款编程软件不一定非要是专业的研发人员,甚至根本不需要…

Chatgpt掘金之旅—有爱AI商业实战篇|在线课程业务|(十五)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业在线课程业务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着…

langchain txt 文档加载,分割

stuff 策略 加载 arXiv 论文&#xff0c;让模型总结前 2000 字 这里采用的是 stuff 策略&#xff0c;也就是将一大段文本。按字数分割成 N 个文本块&#xff0c;又合并成一个大的文本块。 对超大规模不友好&#xff0c;没有区分文档重要性&#xff0c;适合文档量较少场景 i…

SystemUI QuickQSPanel所在的位置

QuickQSPanel 为蓝色 位置&#xff1a; quick_status_bar_expanded_header.xml 图片&#xff1a;