OpenHarmony(鸿蒙南向)——平台驱动指南【MIPI DSI】

往期知识点记录:

  • 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
  • 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
  • 持续更新中……

概述

功能简介

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

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

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

图 1 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无服务模式结构图

约束与限制

由于使用无服务模式,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进行通信前,首先要调用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)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

鸿蒙开发面试真题(含参考答案):

在这里插入图片描述

《OpenHarmony源码解析》:

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片
在这里插入图片描述

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

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

相关文章

Apache Iceberg 概述

Apache Iceberg概述 一、what is Apache Iceberg? 为了解决数据存储和计算引擎之间的适配的问题,Netflix开发了Iceberg,2018年11月16日进入Apache孵化器,2020 年5月19日从孵化器毕业,成为Apache的顶级项目。 Apache…

java通过webhook给飞书发送群消息

现在使用飞书的人越来越多了,飞书有一个最大的好处,可以使用webhook简便的发送群消息。而在工作中,也经常会因为一些运维方面的工作,需要给飞书发送群消息,来实时提醒相关负责人,及时处理工作。 一、先看一下效果吧&a…

OpenCV图像文件读写(5)从文件系统中读取图像的标准函数imread()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 从文件加载图像。 imread 函数从指定的文件加载图像并返回它。如果图像无法读取(因为文件缺失、权限不当、格式不受支持或无效&…

精简解析:二叉树的遍历方法及其应用场景

目录标题 二叉树的遍历方法及其应用场景摘要 1. 前序遍历 (Preorder Traversal)1.1 定义1.2 代码实现1.3 应用场景 2. 中序遍历 (Inorder Traversal)2.1 定义2.2 代码实现2.3 应用场景 3. 后序遍历 (Postorder Traversal)3.1 定义3.2 代码实现3.3 应用场景 4. 层次遍历 (Level …

Linux 文件 IO 管理(第三讲:文件系统)

Linux 文件 IO 管理(第三讲:文件系统) 进程为什么默认要打开文件描述符为 0,1 和 2 的文件呢?文件系统物理磁盘简单认识存储结构对磁盘存储进行逻辑抽象分组 —— 文件系统Block Bitmapinode Tableinode BitmapGDT(Gro…

C语言实现归并排序(Merge Sort)

目录 一、递归实现归并排序 1. 归并排序的基本步骤 2.动图演示 3.基本思路 4.代码 二、非递归实现 1.部分代码 2.代码分析 修正后代码: 归并过程打印 性能分析 复杂度分析 归并排序是一种高效的排序算法,采用分治法(Divide and Con…

【芋道源码】gitee很火的开源项目pig——后台管理快速开发框架使用笔记(微服务版之本地开发环境篇)

后台管理快速开发框架使用笔记(微服务版之本地开发环境篇) 后台管理快速开发框架使用笔记(微服务版之本地开发环境篇) 后台管理快速开发框架使用笔记(微服务版之本地开发环境篇)前言一、如何获取项目&#…

计算机毕业设计宠物领养网站我的发布领养领养用户信息/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

目录 1.课题背景 2.课题意义 ‌ 3.技术介绍 4.技术性需求 4.1后端服务‌: 4.2 前端展示‌ 5.数据库设计‌: 6.系统性能‌: 7.安全性‌: 8. 功能介绍: 9. 部分代码 1.课题背景 近年来,随着宠物饲养数量…

2024年9月25日--- Spring-IOC 1

一 Spring的概要 1.1 简介 Spring,春天的意思,意指给软件行业带来春天。2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发…

《深度学习》—— ResNet 残差神经网络

文章目录 一、什么是ResNet?二、残差结构(Residual Structure)三、Batch Normalization(BN----批归一化) 一、什么是ResNet? ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出,斩获…

linux信号 | 学习信号三步走 | 全解析信号的产生方式

前言:本节内容是信号, 主要讲解的是信号的产生。信号的产生是我们学习信号的第二个阶段。 我们已经学习过第一个阶段——信号的概念与预备知识(没有学过的友友可以查看我的前一篇文章)。 以及我们还没有学习信号的第三个阶段——信…

89个H5小游戏源码

下载地址:https://download.csdn.net/download/w2sft/89791650 亲测可用,代码完整,都是htmljs,保存到本地即可。 游戏截图:

Universal Link配置不再困扰,Xinstall来帮忙

在移动互联网时代,App的推广和运营至关重要。而Universal Link作为一种能够实现网页与App间无缝跳转的技术,对于提升用户体验、引流至App具有显著效果。今天,我们就来科普一下Universal Link的配置方法,并介绍如何通过Xinstall这款…

TypeScript 设计模式之【备忘录模式】

文章目录 备忘录模式:时光机器的魔法备忘录模式的奥秘备忘录模式有什么利与弊?如何使用备忘录模式来优化你的系统代码实现案例备忘录模式的主要优点备忘录模式的主要缺点备忘录模式的适用场景总结 备忘录模式:时光机器的魔法 想象一下,如果…

25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,通过DS18B20检测温度,滑动变阻器连接数模转换器模拟电流、电压,通过LCD1602显示,程序里设置温度阈值为40,电流阈值为60&am…

万博智云CEO王嘉在华为全联接大会:以创新云应用场景,把握增长机遇

一、大会背景 2024年9月19-21日,第九届华为全联接大会将在上海世博展览馆和上海世博中心举办。作为华为的旗舰盛会,本次大会以“共赢行业智能化”为主题邀请了众多思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁,从战略、产业、…

Nginx基础详解3(nginx.conf核心代码讲解、常用命令解析、Nginx日志切割)

续Nginx基础详解2(首页解析过程、进程模型、处理Web请求机制、nginx.conf语法结构)-CSDN博客 目录 8.nginx.conf核心代码 8.1错误日志 8.1.1第一列: 8.1.2第二列: 8.1.3第三列: 8.2 #pid 8.3http模块&#xff…

A开头的词根词缀:-ate+a-+ab\abs+ab\c\d\f\g\n\p\r\s\t+ad+amph+an+ana+ante+anti+anthrop+

ate -ate,它是英语单词中的后缀词缀。它加在词根或词干上分三种词性。 首先第一种词性adj.(形容词),它主要加缀在名词词根或词干上构成的形容词:……的,有……的,像……的,For example:accurate(adj.正确的&#xff…

如何实现全行业证照一站式结构化识别?Textln企业资质证照识别上线!

企业经营活动中,资质证书是证明企业具备某项行业准入的必要证件。但企业资质证书种类繁多,各行各业的资质证书都有差异,同一行业、不同地区出具的资质证书版式也各不相同,通过传统标注训练的方式难以全量覆盖各类企业资质证照的识…

【JAVA开源】基于Vue和SpringBoot的墙绘产品展示交易平台

本文项目编号 T 049 ,文末自助获取源码 \color{red}{T049,文末自助获取源码} T049,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…