diff --git a/zh-cn/device-dev/driver/driver-platform-adc-des.md b/zh-cn/device-dev/driver/driver-platform-adc-des.md
index bb9ed39d4ae1e4762e6504943e84cdb2f9d60591..ccd7fdcd5a02e4157b75fa8401073bb869813588 100755
--- a/zh-cn/device-dev/driver/driver-platform-adc-des.md
+++ b/zh-cn/device-dev/driver/driver-platform-adc-des.md
@@ -1,71 +1,85 @@
# ADC
- [概述](#section1)
-- [接口说明](#section2)
-- [使用指导](#section3)
- - [使用流程](#section4)
- - [打开ADC设备](#section5)
- - [读取AD转换结果](#section6)
- - [关闭ADC设备](#section7)
-
-- [使用实例](#section8)
+ - [功能简介](#section2)
+ - [基本概念](#section3)
+ - [运作机制](#section4)
+ - [约束与限制](#section5)
+- [使用指导](#section6)
+ - [场景介绍](#section7)
+ - [接口说明](#section8)
+ - [开发步骤](#section9)
+ - [使用实例](#section10)
## 概述
+### 功能简介
+
- ADC(Analog to Digital Converter),即模拟-数字转换器,是一种将模拟信号转换成对应数字信号的设备。
- ADC接口定义了完成ADC传输的通用方法集合,包括:
- ADC设备管理:打开或关闭ADC设备。
- ADC读取转换结果:读取AD转换结果。
- **图 1** ADC物理连线示意图
- ![](figures/ADC物理连线示意图.png "ADC物理连线示意图")
+### 基本概念
+
+ADC主要用于将模拟量转换成数字量,从而便于存储与计算等。
+
+ADC的主要技术参数有:
+
+- 分辨率
+ 分辨率指的是ADC模块能够转换的二进制位数,位数越多分辨率越高。
+
+- 转换误差
+ 转换误差通常是以输出误差的最大值形式给出。它表示A/D转换器实际输出的数字量和理论上的输出数字量之间的差别。常用最低有效位的倍数表示。
+
+- 转换时间
+ 转换时间是指A/D转换器从转换控制信号到来开始,到输出端得到稳定的数字信号所经过的时间。
+
+### 运作机制
+
+在HDF框架中,同类型设备对象较多时(可能同时存在十几个同类型配置器),如果采用独立服务模式则需要配置更多的设备节点,且相关服务会占据更多的内存资源。相反,采用统一服务模式可以使用一个设备服务作为管理器,统一处理所有同类型对象的外部访问(这会在配置文件中有所体现),实现便捷管理和节约资源的目的。ADC模块接口适配模式采用统一服务模式。
+
+ADC模块各分层的作用为:接口层提供打开设备,写入数据,关闭设备的接口。核心层主要提供绑定设备、初始化设备以及释放设备的能力。适配层实现其他具体的功能。
+
+除电源线和地线之外,ADC只需要1根线与被测量的设备进行连接,其物理连线如[图1](#fig1)所示:
+
+**图 1** ADC物理连线示意图
+![](figures/ADC物理连线示意图.png "ADC物理连线示意图")
+
+### 约束与限制
+
+ADC模块当前仅支持轻量和小型系统内核(LiteOS) 。
+
+## 使用指导
-## 接口说明
+### 场景介绍
+
+ADC设备通常用于将模拟电压转换为数字量,如与咪头搭配进行声音采集、与NTC电阻搭配进行温度测量,或者将其他模拟传感器的输出量转换为数字量的场景。
+
+### 接口说明
+
+ADC模块提供的主要接口如[表1](#table1)所示,更多关于接口的介绍请参考对应的API接口文档。
**表 1** ADC驱动API接口功能介绍
-
功能分类
- |
-接口名
- |
-描述
- |
-
-
-ADC设备管理接口
- |
-AdcOpen
- |
-打开ADC设备
- |
-
-AdcClose
- |
-关闭ADC设备
- |
-
-ADC读取转换结果接口
- |
-AdcRead
- |
-读取AD转换结果值
- |
-
-
-
-## 使用指导
-
-### 使用流程
+| 接口名 | 描述 |
+| -------- | ---------------- |
+| AdcOpen | 打开ADC设备 |
+| AdcClose | 关闭ADC设备 |
+| AdcRead | 读取AD转换结果值 |
+
+### 开发步骤
使用ADC设备的一般流程如[图2](#fig2)所示。
**图 2** ADC使用流程图
![](figures/ADC使用流程图.png "ADC使用流程图")
-### 打开ADC设备
+
+#### 打开ADC设备
在进行AD转换之前,首先要调用AdcOpen打开ADC设备。
@@ -77,34 +91,12 @@ DevHandle AdcOpen(int16_t number);
-参数
- |
-参数描述
- |
-
-
-number
- |
-ADC设备号
- |
-
-返回值
- |
-返回值描述
- |
-
-NULL
- |
-打开ADC设备失败
- |
-
-设备句柄
- |
-打开的ADC设备句柄
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | ----------------- |
+| number | ADC设备号 |
+| **返回值** | **返回值描述** |
+| NULL | 打开ADC设备失败 |
+| 设备句柄 | 打开的ADC设备句柄 |
假设系统中存在2个ADC设备,编号从0到1,那么我们现在打开1号设备。
@@ -114,12 +106,12 @@ DevHandle adcHandle = NULL; /* ADC设备句柄 /
/* 打开ADC设备 */
adcHandle = AdcOpen(1);
if (adcHandle == NULL) {
- HDF_LOGE("AdcOpen: failed\n");
+ HDF_LOGE("AdcOpen: fail\n");
return;
}
```
-### 读取AD转换结果
+#### 读取AD转换结果
```c
int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val);
@@ -129,46 +121,29 @@ int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-ADC设备句柄
- |
-
-channel
- |
-ADC设备通道号
- |
-
-val
- |
-AD转换结果
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-读取成功
- |
-
-负数
- |
-读取失败
- |
-
-
-
-
-### 关闭ADC设备
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | ADC设备句柄 |
+| channel | ADC设备通道号 |
+| val | AD转换结果 |
+| **返回值** | **返回值描述** |
+| 0 | 读取成功 |
+| 负数 | 读取失败 |
+
+读取转换结果示例(以通道1为例):
+
+```c
+uint32_t value;
+int32_t ret;
+
+ret = AdcRead(adcHandle, 1, &value);
+if (ret != 0) {
+ HDF_LOGE("ADC read fail!\n");
+ return;
+}
+```
+
+#### 关闭ADC设备
ADC通信完成之后,需要关闭ADC设备。
```c
@@ -178,29 +153,11 @@ void AdcClose(DevHandle handle);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-ADC设备句柄
- |
-
-返回值
- |
-返回值描述
- |
-
-无
- |
-无
- |
-
-
-
+| 参数 | 参数描述 |
+| ------ | ----------- |
+| handle | ADC设备句柄 |
+| 返回值 | 返回值描述 |
+| 无 | 无 |
关闭ADC设备示例:
@@ -208,7 +165,7 @@ void AdcClose(DevHandle handle);
AdcClose(adcHandle); /* 关闭ADC设备 */
```
-## 使用实例
+### 使用实例
本例程以操作开发板上的ADC设备为例,详细展示ADC接口的完整使用流程。
@@ -249,7 +206,7 @@ static int32_t TestCaseAdc(void)
for (i = 0; i < 30; i++) {
ret = AdcRead(adcHandle, ADC_CHANNEL_NUM, &Readbuf[i]);
if (ret != HDF_SUCCESS) {
- HDF_LOGE("%s: tp ADC write reg fail!:%d", __func__, ret);
+ HDF_LOGE("%s: ADC read fail!:%d", __func__, ret);
AdcClose(adcHandle);
return -1;
}
@@ -262,4 +219,3 @@ static int32_t TestCaseAdc(void)
return 0;
}
```
-
diff --git a/zh-cn/device-dev/driver/driver-platform-hdmi-des.md b/zh-cn/device-dev/driver/driver-platform-hdmi-des.md
index 1ad42787db839705a319f6432f537cb19f86ba5d..4d4809dd8b78921de7c58887b6a4e97e35f2961a 100755
--- a/zh-cn/device-dev/driver/driver-platform-hdmi-des.md
+++ b/zh-cn/device-dev/driver/driver-platform-hdmi-des.md
@@ -1,137 +1,89 @@
# HDMI
- [概述](#section1)
-- [接口说明](#section2)
-- [使用指导](#section3)
- - [使用流程](#section4)
- - [打开HDMI控制器](#section5)
- - [注册热插拔回调函数](#section6)
- - [读取EDID](#section7)
- - [设置属性](#section8)
- - [启动HDMI传输](#section10)
- - [停止HDMI传输](#section11)
- - [注销热插拔回调函数](#section12)
- - [关闭HDMI控制器](#section13)
-
-- [使用实例](#section14)
+ - [功能简介](#section2)
+ - [基本概念](#section3)
+ - [运作机制](#section4)
+ - [约束与限制](#section5)
+- [使用指导](#section6)
+ - [场景介绍](#section7)
+ - [接口说明](#section8)
+ - [开发步骤](#section9)
+ - [使用实例](#section10)
## 概述
-- HDMI(High-Definition Multiface Interface)是Hitachi, Panasonic, Philips, SiliconImage, Sony, Thomson, Toshiba共同发布的一款音视频传输协议。
-- HDMI以主从方式工作,通常有一个Source端和一个Sink端。
-- HDMI接口定义了完成HDMI传输的通用方法集合,包括:
+### 功能简介
+
+- HDMI(High-Definition Multiface Interface),即高清多媒体接口,主要用于DVD、机顶盒等音视频Source到TV、显示器等Sink设备的传输。
+- HDMI以主从方式工作,通常有一个Source端和一个Sink端。
+- HDMI接口定义了完成HDMI传输的通用方法集合,包括:
- HDMI控制器管理:打开或关闭HDMI控制器
- HDMI启动/停止传输:启动或停止HDMI传输
- HDMI控制器设置:设置音频、视频及HDR属性,设置色彩深度、声音图像消隐等
- HDMI读取EDID:读取Sink端原始的EDID数据
- HDMI热插拔:注册/注销热插拔回调函数
-- HDMI物理连接如[图1](#fig1)所示:
- **图 1** HDMI物理连线示意图
- ![](figures/HDMI物理连线示意图.png "HDMI物理连线示意图")
-## 接口说明
+### 基本概念
+
+HDMI(High-Definition Multiface Interface)是Hitachi、Panasonic、Philips、SiliconImage、Sony、Thomson、Toshiba共同发布的一款音视频传输协议。传输过程遵循TMDS(Transition Minimized Differential Signaling)协议。
+
+- TMDS(Transition Minimized Differential signal):过渡调制差分信号,也被称为最小化传输差分信号,用于发送音频、视频及各种辅助数据。
+- DDC(Display Data Channel):显示数据通道,发送端与接收端可利用DDC通道得知彼此的发送与接收能力,但HDMI仅需单向获知接收端(显示器)的能力。
+- CEC(Consumer Electronics Control):消费电子控制,该功能应该能够在连接HDMI的发送设备与接收设备之间实现交互操作。
+- FRL(Fixed Rate Link):TMDS 的架构进行讯号传输时,最高带宽可达 18Gbps,而 FRL 模式的带宽则提升到 48 Gbps。
+- HDCP(High-bandwidth Digital Content Protection):即高带宽数字内容保护技术,当用户对高清晰信号进行非法复制时,该技术会进行干扰,降低复制出来的影像的质量,从而对内容进行保护。
+- EDID(Extended Display Identification Data):扩展显示标识数据, 通常存储在显示器的固件中,标识供应商信息、EDID版本信息、最大图像大小、颜色设置、厂商预设置、频率范围的限制以及显示器名和序列号的字符串。
+
+### 运作机制
+
+HDMI的Source端提供+5V和GND,用于DDC和CEC通信。通过DDC通道,Source端可以读取Sink端的各项参数,如接受能力等;CEC为可选通道,用于同步Source端与Sink端的控制信号,改善用户体验。TMDS通道有四组差分信号,TMDS Clock Channel为TMDS提供时钟信号,其余三组传输音视频数据及各种辅助数据;HDP为热插拔检测端口,当有Sink端接入时,Source端会通过中断服务程序进行响应。
+
+HDMI物理连接如[图1](#fig1)所示:
+**图 1** HDMI物理连线示意图
+![](figures/HDMI物理连线示意图.png "HDMI物理连线示意图")
+
+### 约束与限制
+
+HDMI模块当前仅支持轻量和小型系统内核(LiteOS) 。
+
+## 使用指导
+
+### 场景介绍
+
+HDMI具有体积小,传输速率高,传输带宽宽,兼容性好,能同时传输无压缩音视频信号等优点。与传统的全模拟接口相比,HDMI不但增加了设备间接线的便捷性,还提供了一些HDMI特有的智能化功能,可用于小体积设备进行高质量音视频传输的场景。
+
+### 接口说明
**表 1** HDMI驱动API接口功能介绍
-功能分类
- |
-接口名
- |
-描述
- |
-
-
-HDMI控制器管理接口
- |
-HdmiOpen
- |
-打开HDMI控制器
- |
-
-HdmiClose
- |
-关闭HDMI控制器
- |
-
-启动/停止HDMI传输接口
- |
-HdmiStart
- |
-启动HDMI传输
- |
-
-HdmiStop
- |
-停止HDMI传输
- |
-
-HDMI控制器设置接口
- |
-HdmiAvmuteSet
- |
-HDMI声音图像消隐设置
- |
-
-HdmiDeepColorSet
- |
-设置色彩深度
- |
-
-HdmiDeepColorGet
- |
-获取色彩深度
- |
-
-HdmiSetVideoAttribute
- |
-设置视频属性
- |
-
-HdmiSetAudioAttribute
- |
-设置音频属性
- |
-
-HdmiSetHdrAttribute
- |
-设置HDR属性
- |
-
-EDID获取接口
- |
-HdmiReadSinkEdid
- |
-HDMI读取Sink端原始EDID数据
- |
-
-HDMI热插拔相关接口
- |
-HdmiRegisterHpdCallbackFunc
- |
-注册HDMI热插拔检测回调函数
- |
-
-HdmiUnregisterHpdCallbackFunc
- |
-注销HDMI热插拔检测回调函数
- |
-
-
-
-
-## 使用指导
-
-### 使用流程
+| 接口名 | 描述 |
+| ----------------------------- | -------------------------- |
+| HdmiOpen | 打开HDMI控制器 |
+| HdmiClose | 关闭HDMI控制器 |
+| HdmiStart | 启动HDMI传输 |
+| HdmiStop | 停止HDMI传输 |
+| HdmiAvmuteSet | 声音图像消隐设置 |
+| HdmiDeepColorSet | 设置色彩深度 |
+| HdmiDeepColorGet | 获取色彩深度 |
+| HdmiSetVideoAttribute | 设置视频属性 |
+| HdmiSetAudioAttribute | 设置音频属性 |
+| HdmiSetHdrAttribute | 设置HDR属性 |
+| HdmiReadSinkEdid | 读取Sink端原始EDID数据 |
+| HdmiRegisterHpdCallbackFunc | 注册HDMI热插拔检测回调函数 |
+| HdmiUnregisterHpdCallbackFunc | 注销HDMI热插拔检测回调函数 |
+
+### 开发步骤
使用HDMI设备的一般流程如[图2](#fig2)所示。
**图 2** HDMI设备使用流程图
![](figures/HDMI使用流程图.png "HDMI使用流程图")
-### 打开HDMI控制器
+#### 打开HDMI控制器
在进行HDMI通信前,首先要调用HdmiOpen打开HDMI控制器。
@@ -143,34 +95,12 @@ DevHandle HdmiOpen(int16_t number);
-参数
- |
-参数描述
- |
-
-
-number
- |
-HDMI控制器号
- |
-
-返回值
- |
-返回值描述
- |
-
-NULL
- |
-打开HDMI控制器失败
- |
-
-控制器句柄
- |
-打开的HDMI控制器句柄
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------------- |
+| number | HDMI控制器号 |
+| **返回值** | **返回值描述** |
+| NULL | 打开HDMI控制器失败 |
+| 控制器句柄 | 打开的HDMI控制器句柄 |
假设系统中存在2个HDMI控制器,编号从0到1,那么我们现在获取0号控制器:
@@ -185,7 +115,7 @@ if (hdmiHandle == NULL) {
}
```
-### 注册热插拔检测回调函数
+#### 注册热插拔检测回调函数
```c
int32_t HdmiRegisterHpdCallbackFunc(DevHandle handle, struct HdmiHpdCallbackInfo *callback);
@@ -195,39 +125,13 @@ int32_t HdmiRegisterHpdCallbackFunc(DevHandle handle, struct HdmiHpdCallbackInfo
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-callback
- |
-热插拔回调函数信息
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-注册成功
- |
-
-负数
- |
-注册失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | ------------------ |
+| handle | HDMI控制器句柄 |
+| callback | 热插拔回调函数信息 |
+| **返回值** | **返回值描述** |
+| 0 | 注册成功 |
+| 负数 | 注册失败 |
注册热插拔检测回调函数示例:
@@ -236,30 +140,31 @@ int32_t HdmiRegisterHpdCallbackFunc(DevHandle handle, struct HdmiHpdCallbackInfo
static void HdmiHpdHandle(void *data, bool hpd)
{
if (data == NULL) {
- HDF_LOGE("priv data is NULL");
- return;
-}
-
+ HDF_LOGE("priv data is NULL");
+ return;
+ }
if (hpd == true) {
HDF_LOGD("HdmiHpdHandle: hot plug");
/* 调用者添加相关处理 */
} else {
- HDF_LOGD("HdmiHpdHandle: hot unplog");
+ HDF_LOGD("HdmiHpdHandle: hot unplug");
/* 调用者添加相关处理 */
}
}
- /* 热插拔检测回调函数注册示例 */
- struct HdmiHpdCallbackInfo info = {0};
- info.data = handle;
- info.callbackFunc = HdmiHpdHandle;
- ret = HdmiRegisterHpdCallbackFunc(hdmiHandle, info);
- if (ret != 0) {
- HDF_LOGE("HdmiRegisterHpdCallbackFunc: Register failed.");
- }
+/* 热插拔检测回调函数注册示例 */
+···
+struct HdmiHpdCallbackInfo info = {0};
+info.data = handle;
+info.callbackFunc = HdmiHpdHandle;
+ret = HdmiRegisterHpdCallbackFunc(hdmiHandle, info);
+if (ret != 0) {
+ HDF_LOGE("HdmiRegisterHpdCallbackFunc: Register failed.");
+}
+···
```
-### 读取EDID
+#### 读取EDID
```c
int32_t HdmiReadSinkEdid(DevHandle handle, uint8_t *buffer, uint32_t len);
@@ -269,44 +174,14 @@ int32_t HdmiReadSinkEdid(DevHandle handle, uint8_t *buffer, uint32_t len);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-buffer
- |
-数据缓冲区
- |
-
-len
- |
-数据长度
- |
-
-返回值
- |
-返回值描述
- |
-
-正整数
- |
-成功读取的原始EDID数据
- |
-
-负数或0
- |
-读取失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | ---------------------- |
+| handle | HDMI控制器句柄 |
+| buffer | 数据缓冲区 |
+| len | 数据长度 |
+| **返回值** | **返回值描述** |
+| 正整数 | 成功读取的原始EDID数据 |
+| 负数或0 | 读取失败 |
读取Sink端的原始EDID数据示例:
@@ -320,8 +195,6 @@ if (len <= 0) {
}
```
-### 设置音频、视频及HDR属性
-
#### 设置音频属性
```c
@@ -332,39 +205,13 @@ int32_t HdmiSetAudioAttribute(DevHandle handle, struct HdmiAudioAttr *attr);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-attr
- |
-音频属性
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-设置成功
- |
-
-负数
- |
-设置失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ------ | -------------- |
+| handle | HDMI控制器句柄 |
+| attr | 音频属性 |
+| 返回值 | 返回值描述 |
+| 0 | 设置成功 |
+| 负数 | 设置失败 |
设置音频属性示例:
@@ -393,39 +240,13 @@ int32_t HdmiSetVideoAttribute(DevHandle handle, struct HdmiVideoAttr *attr);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-attr
- |
-视频属性
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-设置成功
- |
-
-负数
- |
-设置失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | HDMI控制器句柄 |
+| attr | 视频属性 |
+| **返回值** | **返回值描述** |
+| 0 | 设置成功 |
+| 负数 | 设置失败 |
设置视频属性示例:
@@ -453,39 +274,13 @@ int32_t HdmiSetHdrAttribute(DevHandle handle, struct HdmiHdrAttr *attr);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-attr
- |
-HDR属性
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-设置成功
- |
-
-负数
- |
-设置失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | HDMI控制器句柄 |
+| attr | HDR属性 |
+| **返回值** | **返回值描述** |
+| 0 | 设置成功 |
+| 负数 | 设置失败 |
设置HDR属性示例:
@@ -504,8 +299,6 @@ if (ret != 0) {
}
```
-### 其他可选设置
-
#### 设置HDMI声音图像消隐
```c
@@ -516,39 +309,13 @@ int32_t HdmiAvmuteSet(DevHandle handle, bool enable);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-enable
- |
-使能/去使能avmute
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-设置成功
- |
-
-负数
- |
-设置失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | ----------------- |
+| handle | HDMI控制器句柄 |
+| enable | 使能/去使能avmute |
+| **返回值** | **返回值描述** |
+| 0 | 设置成功 |
+| 负数 | 设置失败 |
设置声音图像消隐示例:
@@ -571,39 +338,13 @@ int32_t HdmiDeepColorSet(DevHandle handle, enum HdmiDeepColor color);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-color
- |
-色彩深度
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-设置成功
- |
-
-负数
- |
-设置失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | HDMI控制器句柄 |
+| color | 色彩深度 |
+| **返回值** | **返回值描述** |
+| 0 | 设置成功 |
+| 负数 | 设置失败 |
设置色彩深度示例:
@@ -626,39 +367,13 @@ int32_t HdmiDeepColorGet(DevHandle handle, enum HdmiDeepColor *color);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-color
- |
-色彩深度
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-获取成功
- |
-
-负数
- |
-获取失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | HDMI控制器句柄 |
+| color | 色彩深度 |
+| **返回值** | **返回值描述** |
+| 0 | 获取成功 |
+| 负数 | 获取失败 |
获取色彩深度示例:
@@ -672,7 +387,7 @@ if (ret != 0) {
}
```
-### 启动HDMI传输
+#### 启动HDMI传输
```c
int32_t HdmiStart(DevHandle handle);
@@ -682,34 +397,12 @@ int32_t HdmiStart(DevHandle handle);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-启动成功
- |
-
-负数
- |
-启动失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | HDMI控制器句柄 |
+| **返回值** | **返回值描述** |
+| 0 | 启动成功 |
+| 负数 | 启动失败 |
启动HDMI传输示例:
@@ -722,7 +415,7 @@ if (ret != 0) {
}
```
-### 停止HDMI传输
+#### 停止HDMI传输
```c
int32_t HdmiStop(DevHandle handle);
@@ -732,34 +425,12 @@ int32_t HdmiStop(DevHandle handle);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-停止成功
- |
-
-负数
- |
-停止失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | HDMI控制器句柄 |
+| **返回值** | **返回值描述** |
+| 0 | 停止成功 |
+| 负数 | 停止失败 |
停止HDMI传输示例:
@@ -772,7 +443,7 @@ if (ret != 0) {
}
```
-### 注销热插拔检测回调函数
+#### 注销热插拔检测回调函数
```c
int32_t HdmiUnregisterHpdCallbackFunc(DevHandle handle);
@@ -782,34 +453,12 @@ int32_t HdmiUnregisterHpdCallbackFunc(DevHandle handle);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-注销成功
- |
-
-负数
- |
-注销失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | HDMI控制器句柄 |
+| **返回值** | **返回值描述** |
+| 0 | 注销成功 |
+| 负数 | 注销失败 |
注销热插拔检测回调函数示例:
@@ -822,7 +471,7 @@ if (ret != 0) {
}
```
-### 关闭HDMI控制器
+#### 关闭HDMI控制器
```c
void HdmiClose(DevHandle handle);
@@ -832,19 +481,9 @@ void HdmiClose(DevHandle handle);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-HDMI控制器句柄
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | HDMI控制器句柄 |
关闭HDMI控制器示例:
@@ -852,7 +491,7 @@ void HdmiClose(DevHandle handle);
HdmiClose(hdmiHandle);
```
-## 使用实例
+### 使用实例
本例程以操作开发板上的HDMI设备为例,详细展示HDMI接口的完整使用流程。
@@ -882,7 +521,7 @@ static void HdmiHpdHandle(void *data, bool hpd)
HDF_LOGD("HdmiHpdHandle: hot plug");
/* 调用者添加相关处理 */
} else {
- HDF_LOGD("HdmiHpdHandle: hot unplog");
+ HDF_LOGD("HdmiHpdHandle: hot unplug");
/* 调用者添加相关处理 */
}
}
diff --git a/zh-cn/device-dev/driver/driver-platform-hdmi-develop.md b/zh-cn/device-dev/driver/driver-platform-hdmi-develop.md
index 408a31c4229be396fec6afe707d2e4a124d63309..89b0729fc8a491917a6788b4a92f21719f39f0d4 100755
--- a/zh-cn/device-dev/driver/driver-platform-hdmi-develop.md
+++ b/zh-cn/device-dev/driver/driver-platform-hdmi-develop.md
@@ -1,115 +1,152 @@
# HDMI
- [概述](#1)
-- [开发步骤](#2)
-- [开发实例](#3)
+ - [功能简介](#2)
+ - [基本概念](#3)
+ - [运作机制](#4)
+ - [约束与限制](#5)
+- [开发指导](#6)
+ - [场景介绍](#7)
+ - [接口说明](#8)
+ - [开发步骤](#9)
## 概述
-HDMI(High-Definition Multiface Interface)是Hitachi、Panasonic、Philips、SiliconImage、Sony、Thomson、Toshiba共同发布的一款音视频传输协议,主要用于DVD、机顶盒等音视频source到TV、显示器等sink设备的传输。传输过程遵循TMDS(Transition Minimized Differential Signaling)协议。
+### 功能简介
-在HDF框架中,HDMI的接口适配模式采用独立服务模式,在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用率。
+HDMI(High-Definition Multiface Interface),即高清多媒体接口,主要用于DVD、机顶盒等音视频source到TV、显示器等sink设备的传输。
- **图 1** HDMI统一服务模式
+### 基本概念
+
+HDMI(High-Definition Multiface Interface)是Hitachi、Panasonic、Philips、SiliconImage、Sony、Thomson、Toshiba共同发布的一款音视频传输协议。传输过程遵循TMDS(Transition Minimized Differential Signaling)协议。
+
+- TMDS(Transition Minimized Differential signal):过渡调制差分信号,也被称为最小化传输差分信号,用于发送音频、视频及各种辅助数据。
+
+- DDC(Display Data Channel):显示数据通道,发送端与接收端可利用DDC通道得知彼此的发送与接收能力,但HDMI仅需单向获知接收端(显示器)的能力。
+
+- CEC(Consumer Electronics Control):消费电子控制,该功能应该能够在连接HDMI的发送设备与接收设备之间实现交互操作。
+
+- FRL(Fixed Rate Link):TMDS 的架构进行讯号传输时,最高带宽可达 18Gbps,而 FRL 模式的带宽则提升到 48 Gbps。
+- HDCP(High-bandwidth Digital Content Protection):即高带宽数字内容保护技术,当用户对高清晰信号进行非法复制时,该技术会进行干扰,降低复制出来的影像的质量,从而对内容进行保护。
+
+
+### 运作机制
+
+在HDF框架中,HDMI的接口适配模式采用独立服务模式(如[图1](#fig1)),在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用率。
+
+ **图 1** HDMI独立服务模式
![image1](figures/独立服务模式结构图.png)
-## 开发步骤
+### 约束与限制
+
+HDMI模块当前仅支持轻量和小型系统内核(LiteOS) 。
+
+## 开发指导
+
+### 场景介绍
+
+HDMI具有体积小,传输速率高,传输带宽宽,兼容性好,能同时传输无压缩音视频信号等优点。与传统的全模拟接口相比,HDMI不但增加了设备间接线的便捷性,还提供了一些HDMI特有的智能化功能,可用于小体积设备进行高质量音视频传输的场景。
+
+### 接口说明
+
+HdmiCntlrOps定义:
+```c
+struct HdmiCntlrOps {
+ void (*hardWareInit)(struct HdmiCntlr *cntlr);
+ void (*hardWareStatusGet)(struct HdmiCntlr *cntlr, struct HdmiHardwareStatus *status);
+ void (*controllerReset)(struct HdmiCntlr *cntlr);
+ bool (*hotPlugStateGet)(struct HdmiCntlr *cntlr);
+ bool (*hotPlugInterruptStateGet)(struct HdmiCntlr *cntlr);
+ void (*lowPowerSet)(struct HdmiCntlr *cntlr, bool enable);
+ void (*tmdsModeSet)(struct HdmiCntlr *cntlr, enum HdmiTmdsModeType mode);
+ int32_t (*tmdsConfigSet)(struct HdmiCntlr *cntlr, struct HdmiTmdsConfig mode);
+ void (*infoFrameEnable)(struct HdmiCntlr *cntlr, enum HdmiPacketType infoFrameType, bool enable);
+ int32_t (*infoFrameSend)(struct HdmiCntlr *cntlr, enum HdmiPacketType infoFrameType, uint8_t *data, uint32_t len);
+ int32_t (*infoFrameDataSet)(struct HdmiCntlr *cntlr, uint32_t type, uint8_t *data, uint32_t len);
+ int32_t (*cecMsgSend)(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg);
+ void (*audioPathEnable)(struct HdmiCntlr *cntlr, bool enable);
+ void (*audioPathSet)(struct HdmiCntlr *cntlr, struct HdmiAudioConfigInfo *config);
+ void (*phyOutputEnable)(struct HdmiCntlr *cntlr, bool enable);
+ void (*phyOutputSet)(struct HdmiCntlr *cntlr, struct HdmiPhyCfg *cfg);
+ void (*blackDataSet)(struct HdmiCntlr *cntlr, bool enable);
+ void (*videoMuteEnable)(struct HdmiCntlr *cntlr, bool enable);
+ void (*videoPathSet)(struct HdmiCntlr *cntlr, struct HdmiVideoAttr *attr);
+ void (*audioMuteEnable)(struct HdmiCntlr *cntlr, bool enable);
+ void (*avmuteSet)(struct HdmiCntlr *cntlr, bool enable);
+ int32_t (*ddcTransfer)(struct HdmiCntlr *cntlr, struct HdmiDdcCfg *ddcCfg);
+ bool (*scdcSourceScrambleGet)(struct HdmiCntlr *cntlr);
+ int32_t (*scdcSourceScrambleSet)(struct HdmiCntlr *cntlr, bool enable);
+ void (*frlSet)(struct HdmiCntlr *cntlr);
+ int32_t (*frlEnable)(struct HdmiCntlr *cntlr, bool enable);
+ int32_t (*audioNctsSet)(struct HdmiCntlr *cntlr, struct HdmiFrlAudioNctsConfig *cfg);
+ void (*frlTrainingConfigSet)(struct HdmiCntlr *cntlr, struct HdmiFrlTrainConfig *cfg);
+ void (*frlTrainingStart)(struct HdmiCntlr *cntlr);
+ void (*frlGetTriningRslt)(struct HdmiCntlr *cntlr, struct HdmiFrlTrainRslt *rslt);
+ void (*hdcpRegInit)(struct HdmiCntlr *cntlr);
+ int32_t (*hdcpGenerateAksvAndAn)(struct HdmiCntlr *cntlr);
+ int32_t (*hdcpOptReg)(struct HdmiCntlr *cntlr, enum HdmiHdcpRegOptType type, uint8_t *data, uint32_t len);
+ void (*hdrTimerSet)(struct HdmiCntlr *cntlr, struct HdmiHdrTimerConfig *config);
+};
+```
+
+**表1** HdmiCntlrOps结构体成员的回调函数功能说明
+
+| 函数成员 | 入参 | 出参 | 返回值 | 功能 |
+| ------------------------ | ------------------------------------------------------------ | -------------------------------------- | ------------------ | -------------------------------------------------- |
+| hardWareInit | **cntlr**: 结构体指针,核心层HDMI控制器; | 无 | 无 | 初始化HDMI硬件 |
+| hardWareStatusGet | **cntlr**: 结构体指针,核心层HDMI控制器;
| **status**:HDMI硬件状态 ; | 无 | 获取HDMI当前硬件状态 |
+| controllerReset | **cntlr**: 结构体指针,核心层HDMI控制器; | 无 | 无 | 复位HDMI控制器 |
+| hotPlugStateGet | **cntlr**: 结构体指针,核心层HDMI控制器; | 无 | bool: HDMI热插拔状态 | 获取HDMI热插拔状态 |
+| hotPlugInterruptStateGet | **cntlr**: 结构体指针,核心层HDMI控制器; | 无 | bool: HDMI热插拔中断状态 | 获取HDMI热插拔中断状态 |
+| lowPowerSet | **cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能 | 无 | 无 | 使能/去使能低功耗 |
+| tmdsModeSet | **cntlr**: 结构体指针,核心层HDMI控制器;
**mode**:TMDS模式 | 无 | 无 | 设置TMDS模式 |
+|tmdsConfigSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**mode**: TMDS参数|无|HDF_STATUS相关状态|配置TMDS参数|
+|infoFrameEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**infoFrameType**: packet类型
**enable**: bool,使能/去使能|无|无|使能/去使能infoFrame|
+|infoFrameSend|**cntlr**: 结构体指针,核心层HDMI控制器;
**infoFrameType**: packet类型
**data**: infoFrame数据
**len**:数据长度|无|HDF_STATUS相关状态|发送inforFrame|
+|cecMsgSend|**cntlr**: 结构体指针,核心层HDMI控制器;
**msg**: CEC消息|无|HDF_STATUS相关状态|发送CEC消息|
+|audioPathEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能audio通路|
+|audioPathSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**config**: 配置信息|无|无|设置audio通路配置信息|
+|phyOutputEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能物理层输出状态|
+|phyOutputSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**cfg**: 配置信息|无|无|设置物理层配置信息|
+|blackDataSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|设置黑屏|
+|videoMuteEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能video静音|
+|videoPathSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**attr**: 配置信息|无|无|设置viedo通路配置信息|
+|audioMuteEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能audio静音|
+|avmuteSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能声音图像消隐|
+|ddcTransfer|**cntlr**: 结构体指针,核心层HDMI控制器;
**ddcCfg**:DDC配置参数|**ddcCfg**:DDC配置参数|HDF_STATUS相关状态|读写DDC数据|
+|scdcSourceScrambleGet|**cntlr**: 结构体指针,核心层HDMI控制器;|无|bool,加扰状态|获取source端的加扰状态|
+|scdcSourceScrambleSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|HDF_STATUS相关状态|使能/去使能source端的加扰|
+|frlEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|HDF_STATUS相关状态|使能/去使能FRL|
+|audioNctsSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**cfg**:N/CTS配 置参数|无|HDF_STATUS相关状态|设置audio的N/CTS信息|
+|frlTrainingConfigSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**cfg**:FRL Traning配置参数|无|无|设置FRL Traning配置信息|
+|frlTrainingStart|**cntlr**: 结构体指针,核心层HDMI控制器;|无|无|开始FRL Traning流程|
+|frlGetTriningRslt|**cntlr**: 结构体指针,核心层HDMI控制器;|**rslt**:FRL Traning结果|无|获取FRL Traning结果|
+|hdcpRegInit|**cntlr**: 结构体指针,核心层HDMI控制器;|无|无|初始化HDCP流程相关的寄存器|
+|hdcpGenerateAksvAndAn|**cntlr**: 结构体指针,核心层HDMI控制器;|无|HDF_STATUS相关状态|HDCP流程中生成aksv和an|
+|hdcpOptReg|**cntlr**: 结构体指针,核心层HDMI控制器;
**type**: 操作类型
**data**: 寄存器数据
**len**: 数据长度|**data**: 寄存器数据|HDF_STATUS相关状态|HDCP流程中读写相关寄存器|
+|hdrTimerSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**config**: timer配置信息|无|无|设置HDR相关的timer配置信息|
+
+
+### 开发步骤
HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以及实例化HDMI控制器对象。
-1. **实例化驱动入口:**
+- **实例化驱动入口:**
- 实例化HdfDriverEntry结构体成员。
- 调用HDF_INIT将HdfDriverEntry实例化对象注册到HDF框架中。
-2. **配置属性文件:**
+- **配置属性文件:**
- 在device_info.hcs文件中添加deviceNode描述。
- 【可选】添加hdmi_config.hcs器件属性文件。
-3. **实例化HDMI控制器对象:**
+- **实例化HDMI控制器对象:**
- 初始化HdmiCntlr成员。
- - 实例化HdmiCntlr成员HdmiCntlrOps方法集合,其定义和成员函数说明见下文。
+ - 实例化HdmiCntlr成员HdmiCntlrOps方法集合。
- HdmiCntlrOps定义:
- ```c
- struct HdmiCntlrOps {
- void (*hardWareInit)(struct HdmiCntlr *cntlr);
- void (*hardWareStatusGet)(struct HdmiCntlr *cntlr, struct HdmiHardwareStatus *status);
- void (*controllerReset)(struct HdmiCntlr *cntlr);
- bool (*hotPlugStateGet)(struct HdmiCntlr *cntlr);
- bool (*hotPlugInterruptStateGet)(struct HdmiCntlr *cntlr);
- void (*lowPowerSet)(struct HdmiCntlr *cntlr, bool enable);
- void (*tmdsModeSet)(struct HdmiCntlr *cntlr, enum HdmiTmdsModeType mode);
- int32_t (*tmdsConfigSet)(struct HdmiCntlr *cntlr, struct HdmiTmdsConfig mode);
- void (*infoFrameEnable)(struct HdmiCntlr *cntlr, enum HdmiPacketType infoFrameType, bool enable);
- int32_t (*infoFrameSend)(struct HdmiCntlr *cntlr, enum HdmiPacketType infoFrameType, uint8_t *data, uint32_t len);
- int32_t (*infoFrameDataSet)(struct HdmiCntlr *cntlr, uint32_t type, uint8_t *data, uint32_t len);
- int32_t (*cecMsgSend)(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg);
- void (*audioPathEnable)(struct HdmiCntlr *cntlr, bool enable);
- void (*audioPathSet)(struct HdmiCntlr *cntlr, struct HdmiAudioConfigInfo *config);
- void (*phyOutputEnable)(struct HdmiCntlr *cntlr, bool enable);
- void (*phyOutputSet)(struct HdmiCntlr *cntlr, struct HdmiPhyCfg *cfg);
- void (*blackDataSet)(struct HdmiCntlr *cntlr, bool enable);
- void (*videoMuteEnable)(struct HdmiCntlr *cntlr, bool enable);
- void (*videoPathSet)(struct HdmiCntlr *cntlr, struct HdmiVideoAttr *attr);
- void (*audioMuteEnable)(struct HdmiCntlr *cntlr, bool enable);
- void (*avmuteSet)(struct HdmiCntlr *cntlr, bool enable);
- int32_t (*ddcTransfer)(struct HdmiCntlr *cntlr, struct HdmiDdcCfg *ddcCfg);
- bool (*scdcSourceScrambleGet)(struct HdmiCntlr *cntlr);
- int32_t (*scdcSourceScrambleSet)(struct HdmiCntlr *cntlr, bool enable);
- void (*frlSet)(struct HdmiCntlr *cntlr);
- int32_t (*frlEnable)(struct HdmiCntlr *cntlr, bool enable);
- int32_t (*audioNctsSet)(struct HdmiCntlr *cntlr, struct HdmiFrlAudioNctsConfig *cfg);
- void (*frlTrainingConfigSet)(struct HdmiCntlr *cntlr, struct HdmiFrlTrainConfig *cfg);
- void (*frlTrainingStart)(struct HdmiCntlr *cntlr);
- void (*frlGetTriningRslt)(struct HdmiCntlr *cntlr, struct HdmiFrlTrainRslt *rslt);
- void (*hdcpRegInit)(struct HdmiCntlr *cntlr);
- int32_t (*hdcpGenerateAksvAndAn)(struct HdmiCntlr *cntlr);
- int32_t (*hdcpOptReg)(struct HdmiCntlr *cntlr, enum HdmiHdcpRegOptType type, uint8_t *data, uint32_t len);
- void (*hdrTimerSet)(struct HdmiCntlr *cntlr, struct HdmiHdrTimerConfig *config);
- };
- ```
+1. **实例化驱动入口**
- 表1 HdmiCntlrOps结构体成员的回调函数功能说明
-
- | 函数成员 | 入参 | 出参 | 返回值 | 功能 |
- | ------------------------ | ------------------------------------------------------------ | -------------------------------------- | ------------------ | -------------------------------------------------- |
- | hardWareInit | **cntlr**: 结构体指针,核心层HDMI控制器; | 无 | 无 | HDMI硬件初始化 |
- | hardWareStatusGet | **cntlr**: 结构体指针,核心层HDMI控制器;
| **status**:HDMI硬件状态 ; | 无 | 获取HDMI当前硬件状态 |
- | controllerReset | **cntlr**: 结构体指针,核心层HDMI控制器; | 无 | 无 | HDMI控制器复位 |
- | hotPlugStateGet | **cntlr**: 结构体指针,核心层HDMI控制器; | 无 | bool: HDMI热插拔状态 | 获取HDMI热插拔状态 |
- | hotPlugInterruptStateGet | **cntlr**: 结构体指针,核心层HDMI控制器; | 无 | bool: HDMI热插拔中断状态 | 获取HDMI热插拔中断状态 |
- | lowPowerSet | **cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能 | 无 | 无 | 使能/去使能低功耗 |
- | tmdsModeSet | **cntlr**: 结构体指针,核心层HDMI控制器;
**mode**:TMDS模式 | 无 | 无 | 设置TMDS模式 |
- |tmdsConfigSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**mode**: TMDS参数|无|HDF_STATUS相关状态|配置TMDS参数|
- |infoFrameEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**infoFrameType**: packet类型
**enable**: bool,使能/去使能|无|无|使能/去使能infoFrame|
- |infoFrameSend|**cntlr**: 结构体指针,核心层HDMI控制器;
**infoFrameType**: packet类型
**data**: infoFrame数据
**len**:数据长度|无|HDF_STATUS相关状态|发送inforFrame|
- |cecMsgSend|**cntlr**: 结构体指针,核心层HDMI控制器;
**msg**: CEC消息|无|HDF_STATUS相关状态|发送CEC消息|
- |audioPathEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能audio通路|
- |audioPathSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**config**: 配置信息|无|无|设置audio通路配置信息|
- |phyOutputEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能物理层输出状态|
- |phyOutputSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**cfg**: 配置信息|无|无|设置物理层配置信息|
- |blackDataSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|黑屏设置|
- |videoMuteEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能video静音|
- |videoPathSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**attr**: 配置信息|无|无|设置viedo通路配置信息|
- |audioMuteEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能audio静音|
- |avmuteSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能声音图像消隐|
- |ddcTransfer|**cntlr**: 结构体指针,核心层HDMI控制器;
**ddcCfg**:DDC配置参数|**ddcCfg**:DDC配置参数|HDF_STATUS相关状态|DDC读写数据|
- |scdcSourceScrambleGet|**cntlr**: 结构体指针,核心层HDMI控制器;|无|bool,加扰状态|获取source端的加扰状态|
- |scdcSourceScrambleSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|HDF_STATUS相关状态|使能/去使能source端的加扰|
- |frlEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|HDF_STATUS相关状态|使能/去使能FRL|
- |audioNctsSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**cfg**:N/CTS配 置参数|无|HDF_STATUS相关状态|设置audio的N/CTS信息|
- |frlTrainingConfigSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**cfg**:FRL Traning配置参数|无|无|设置FRL Traning配置信息|
- |frlTrainingStart|**cntlr**: 结构体指针,核心层HDMI控制器;|无|无|开始FRL Traning流程|
- |frlGetTriningRslt|**cntlr**: 结构体指针,核心层HDMI控制器;|**rslt**:FRL Traning结果|无|获取FRL Traning结果|
- |hdcpRegInit|**cntlr**: 结构体指针,核心层HDMI控制器;|无|无|初始化HDCP流程相关的寄存器|
- |hdcpGenerateAksvAndAn|**cntlr**: 结构体指针,核心层HDMI控制器;|无|HDF_STATUS相关状态|HDCP流程中生成aksv和an|
- |hdcpOptReg|**cntlr**: 结构体指针,核心层HDMI控制器;
**type**: 操作类型
**data**: 寄存器数据
**len**: 数据长度|**data**: 寄存器数据|HDF_STATUS相关状态|HDCP流程中的相关寄存器读写操作|
- |hdrTimerSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**config**: timer配置信息|无|无|设置HDR相关的timer配置信息|
-
-## 开发实例
-
-1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf_device_desc.h 中定义)类型的全局变量,且moduleName要和device_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。
+ 驱动入口必须为HdfDriverEntry(在 hdf_device_desc.h 中定义)类型的全局变量,且moduleName要和device_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。
一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。
@@ -126,7 +163,9 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
HDF_INIT(g_hdmiDriverEntry); //调用HDF_INIT将驱动入口注册到HDF框架中
```
-2. 完成驱动入口注册之后,下一步请在device_info.hcs文件中添加deviceNode信息,并在hdmi_config.hcs中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值对于厂商驱动的实现以及核心层HdmiCntlr相关成员的默认值或限制范围有密切关系。
+2. **配置属性文件**
+
+ 完成驱动入口注册之后,下一步请在device_info.hcs文件中添加deviceNode信息,并在hdmi_config.hcs中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值对于厂商驱动的实现以及核心层HdmiCntlr相关成员的默认值或限制范围有密切关系。
从第一个节点开始配置具体HDMI控制器信息,此节点并不表示某一路HDMI控制器,而是代表一个资源性质设备,用于描述一类HDMI控制器的信息。本例只有一个HDMI控制器,如有多个控制器,则需要在device_info文件增加deviceNode信息,以及在hdmi_config文件中增加对应的器件属性。
@@ -198,10 +237,12 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
}
```
-3. 最后一步,完成驱动入口注册之后,要以核心层HdmiCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化HdmiCntlr成员HdmiCntlrOps(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。
-
+3. **实例化控制器对象**
+
+ 最后一步,完成驱动入口注册之后,要以核心层HdmiCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化HdmiCntlr成员HdmiCntlrOps(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。
+
- 自定义结构体参考
-
+
> ![](../public_sys-resources/icon-note.gif) **说明:**
> 从驱动角度看,自定义结构体是参数和数据的载体。HDF会读取hdmi_config.hcs文件中的数值并通过DeviceResourceIface来初始化结构体成员,且其中一些重要数值(例如设备号、总线号等)也会被传递给核心层HdmiCntlr对象。
@@ -213,7 +254,7 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
uint32_t regSize; //【必要】寄存器位宽
uint32_t irqNum; //【必要】中断号
};
-
+
/* HdmiCntlr是核心层控制器结构体,其中的成员在Init函数中被赋值 */
struct HdmiCntlr {
struct IDeviceIoService service;
@@ -240,7 +281,7 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
};
```
- - **【重要】** HdmiCntlr成员回调函数结构体HdmiCntlrOps的实例化
+ - HdmiCntlr成员回调函数结构体HdmiCntlrOps的实例化
```c
static struct HdmiCntlrOps g_hdmiAdapterHostOps = {
@@ -280,15 +321,15 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
.hdrTimerSet = HdmiAdapterHdrTimerSet,
};
```
-
- - **Bind函数参考**
-
- > **入参:**
- > HdfDeviceObject 是整个驱动对外呈现的接口参数,具备 HCS 配置文件的信息
- >
- > **返回值:**
- > HDF_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS 定义)
-
+
+ - Bind函数参考
+
+ **入参:**
+ HdfDeviceObject 是整个驱动对外呈现的接口参数,具备 HCS 配置文件的信息
+
+ **返回值:**
+ HDF_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS 定义)
+
|状态(值)|状态描述|
|:-|:-|
|HDF_ERR_INVALID_OBJECT|控制器对象非法|
@@ -297,12 +338,12 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
|HDF_ERR_IO |I/O 错误|
|HDF_SUCCESS |传输成功|
|HDF_FAILURE |传输失败|
-
- > **函数说明:**
- > 初始化自定义结构体对象HdmiAdapterHost,初始化HdmiCntlr成员,调用核心层HdmiCntlrAdd函数。
- >
- > HdmiCntlr,HdmiAdapterHost,HdfDeviceObject之间互相赋值,方便其他函数可以相互转化。
-
+
+ **函数说明:**
+ 初始化自定义结构体对象HdmiAdapterHost,初始化HdmiCntlr成员,调用核心层HdmiCntlrAdd函数。
+
+ HdmiCntlr,HdmiAdapterHost,HdfDeviceObject之间互相赋值,方便其他函数可以相互转化。
+
```c
static int32_t HdmiAdapterBind(struct HdfDeviceObject *obj)
{
@@ -339,37 +380,37 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
return ret;
}
```
-
- - **init函数参考**
-
- >**入参:**
- >HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息
- >
- >**返回值:**
- >HDF_STATUS相关状态
- >
- >函数说明:
- >
- >实现HdmiAdapterInit函数。
-
+
+ - Init函数参考
+
+ **入参:**
+ HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息
+
+ **返回值:**
+ HDF_STATUS相关状态
+
+ **函数说明**:
+
+ 实现HdmiAdapterInit函数。
+
```c
static int32_t HdmiAdapterInit(struct HdfDeviceObject *obj)
{
return HDF_SUCCESS;
}
```
-
- - **Release 函数参考**
-
- > **入参:**
- > HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息
- >
- > **返回值:**
- > 无
- >
- > **函数说明:**
- > 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。
-
+
+ - Release 函数参考
+
+ **入参:**
+ HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息
+
+ **返回值:**
+ 无
+
+ **函数说明:**
+ 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。
+
```c
static void HdmiAdapterRelease(struct HdfDeviceObject *obj)
{
@@ -380,4 +421,7 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
HimciDeleteHost((struct HimciAdapterHost *)cntlr->priv);//厂商自定义的内存释放函数,这里有HdmiCntlr到HimciAdapterHost的强制转化
}
```
- > 所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。
+
+ > ![](../public_sys-resources/icon-note.gif) **说明:**
+ > 所有强制转换获取相应对象的操作前提是在Init函数中具备对应赋值的操作。
+
diff --git a/zh-cn/device-dev/driver/driver-platform-i3c-des.md b/zh-cn/device-dev/driver/driver-platform-i3c-des.md
index b2000091489dfa80a596c360fcdd776dab8a92c4..7e40317218786d455acc0a0df8f518fa5af8a903 100755
--- a/zh-cn/device-dev/driver/driver-platform-i3c-des.md
+++ b/zh-cn/device-dev/driver/driver-platform-i3c-des.md
@@ -1,108 +1,90 @@
# I3C
- [概述](#section1)
-- [接口说明](#section2)
-- [使用指导](#section3)
- - [使用流程](#section4)
- - [打开I3C控制器](#section5)
- - [进行I3C通信](#section6)
- - [获取I3C控制器配置](#section7)
- - [配置I3C控制器](#section8)
- - [请求IBI(带内中断)](#section9)
- - [释放IBI(带内中断)](#section10)
- - [关闭I3C控制器](#section11)
-
-- [使用实例](#section12)
+ - [功能简介](#section2)
+ - [基本概念](#section3)
+ - [运作机制](#section4)
+ - [约束与限制](#section5)
+- [使用指导](#section6)
+ - [场景介绍](#section7)
+ - [接口说明](#section8)
+ - [开发步骤](#section9)
+ - [使用实例](#section10)
## 概述
-- I3C(Improved Inter Integrated Circuit)总线是由MIPI Alliance开发的一种简单、低成本的双向二线制同步串行总线。
-- I3C总线向下兼容传统的I2C设备,同时增加了带内中断(In-Bind Interrupt)功能,支持I3C设备进行热接入操作,弥补了I2C总线需要额外增加中断线来完成中断的不足。
+### 功能简介
+
+I3C(Improved Inter Integrated Circuit)总线是由MIPI Alliance开发的一种简单、低成本的双向二线制同步串行总线。
+
+- I3C接口定义了完成I3C传输的通用方法集合,包括:
+ I3C控制器管理:打开或关闭I3C控制器。
+ I3C控制器配置:获取或配置I3C控制器参数。
+ I3C消息传输:通过消息传输结构体数组进行自定义传输。
+ I3C带内中断:请求或释放带内中断。
+
+### 基本概念
+
+- I3C是两线双向串行总线,针对多个传感器从设备进行了优化,并且一次只能由一个I3C主设备控制。 相比于I2C,I3C总线拥有更高的速度、更低的功耗,支持带内中断、从设备热接入以及切换当前主设备,同时向后兼容I2C从设备。
+- I3C增加了带内中断(In-Bind Interrupt)功能,支持I3C设备进行热接入操作,弥补了I2C总线需要额外增加中断线来完成中断的不足。
- I3C总线上允许同时存在I2C设备、I3C从设备和I3C次级主设备。
-- I3C接口定义了完成I3C传输的通用方法集合,包括:
+- I3C相关缩略词解释:
+ - IBI(In-Band Interrupt):带内中断。在SCL线没有启动信号时,I3C从设备可以通过拉低SDA线使主设备发出SCL启动信号,从而发出带内中断请求。若有多个从机同时发出中断请求,I3C主机则通过从机地址进行仲裁,低地址优先相应。
+ - DAA(Dynamic Address Assignment):动态地址分配。I3C支持对从设备地址进行动态分配从而避免地址冲突。在分配动态地址之前,连接到I3C总线上的每个I3C设备都应以两种方式之一来唯一标识:
+ 1)设备可能有一个符合I2C规范的静态地址,主机可以使用此静态地址;
+ 2)在任何情况下,设备均应具有48位的临时ID。 除非设备具有静态地址且主机使用静态地址,否则主机应使用此48位临时ID。
+ - CCC(Common Command Code) :通用命令代码,所有I3C设备均支持CCC,可以直接将其传输到特定的I3C从设备,也可以同时传输到所有I3C从设备。
+ - BCR(Bus Characteristic Register):总线特性寄存器,每个连接到 I3C 总线的 I3C 设备都应具有相关的只读总线特性寄存器 (BCR),该寄存器描述了I3C兼容设备在动态地址分配和通用命令代码中的作用和功能。
+ - DCR(Device Characteristic Register):设备特性寄存器,连接到 I3C 总线的每个 I3C 设备都应具有相关的只读设备特性寄存器 (DCR)。 该寄存器描述了用于动态地址分配和通用命令代码的 I3C 兼容设备类型(例如,加速度计、陀螺仪等)。
- - I3C控制器管理:打开或关闭I3C控制器。
- - I3C控制器配置:获取或配置I3C控制器参数。
- - I3C消息传输:通过消息传输结构体数组进行自定义传输。
- - I3C带内中断:请求或释放带内中断。
- - I3C的物理连接如[图1](#fig1)所示:
- **图 1** I3C物理连线示意图
- ![](figures/I3C物理连线示意图.png "I3C物理连线示意图")
+### 运作机制
-## 接口说明
+在HDF框架中,I3C模块接口适配模式采用统一服务模式,这需要一个设备服务来作为I3C模块的管理器,统一处理外部访问,这会在配置文件中有所体现。统一服务模式适合于同类型设备对象较多的情况,如I3C可能同时具备十几个控制器,采用独立服务模式需要配置更多的设备节点,且服务会占据内存资源。
-**表 1** I3C驱动API接口功能介绍
+ 相比于I2C,I3C总线拥有更高的速度、更低的功耗,支持带内中断、从设备热接入以及切换当前主设备,同时向后兼容I2C从设备。一路I3C总线上,可以连接多个设备,这些设备可以是I2C从设备、I3C从设备和I3C次级主设备,但只能同时存在一个主设备,一般为控制器本身。
-
+**图 1** I3C物理连线示意图
+![](figures/I3C物理连线示意图.png "I3C物理连线示意图")
+
+### 约束与限制
+
+I3C模块当前仅支持轻量和小型系统内核(LiteOS) 。
-功能分类
- |
-接口名
- |
-描述
- |
-
-
-I3C控制器管理接口
- |
-I3cOpen
- |
-打开I3C控制器
- |
-
-I3cClose
- |
-关闭I3C控制器
- |
-
-I3c消息传输接口
- |
-I3cTransfer
- |
-自定义传输
- |
-
-I3C控制器配置接口
- |
-I3cSetConfig
- |
-配置I3C控制器
- |
-
-I3cGetConfig
- |
-获取I3C控制器配置
- |
-
-I3C带内中断接口
- |
-I3cRequestIbi
- |
-请求带内中断
- |
-
-I3cFreeIbi
- |
-释放带内中断
- |
-
-
+## 使用指导
+### 场景介绍
+I3C可连接单个或多个I3C、I2C从器件,它主要用于:
+1. 与传感器通信,如陀螺仪、气压计或支持I3C协议的图像传感器等;
+2. 通过软件或硬件协议转换,与其他接口(如 UART 串口等)的设备进行通信。
+
+### 接口说明
+
+**表 1** I3C驱动API接口功能介绍
+
+
+
+| 接口名 | 描述 |
+| ------------- | ----------------- |
+| I3cOpen | 打开I3C控制器 |
+| I3cClose | 关闭I3C控制器 |
+| I3cTransfer | 自定义传输 |
+| I3cSetConfig | 配置I3C控制器 |
+| I3cGetConfig | 获取I3C控制器配置 |
+| I3cRequestIbi | 请求带内中断 |
+| I3cFreeIbi | 释放带内中断 |
>![](../public_sys-resources/icon-note.gif) **说明:**
>本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。
-## 使用指导
-
-### 使用流程
+### 开发步骤
I3C的使用流程如[图2](#fig2)所示。
**图 2** I3C使用流程图
![](figures/I3C使用流程图.png "I3C使用流程图")
-### 打开I3C控制器
+#### 打开I3C控制器
在进行I3C通信前,首先要调用I3cOpen打开I3C控制器。
```c
@@ -113,34 +95,12 @@ DevHandle I3cOpen(int16_t number);
-参数
- |
-参数描述
- |
-
-
-number
- |
-I3C控制器号
- |
-
-返回值
- |
-返回值描述
- |
-
-NULL
- |
-打开I3C控制器失败
- |
-
-控制器句柄
- |
-打开的I3C控制器句柄
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | ------------------- |
+| number | I3C控制器号 |
+| **返回值** | **返回值描述** |
+| NULL | 打开I3C控制器失败 |
+| 控制器句柄 | 打开的I3C控制器句柄 |
假设系统中存在8个I3C控制器,编号从0到7,那么我们现在打开1号控制器:
@@ -155,7 +115,7 @@ if (i3cHandle == NULL) {
}
```
-### 进行I3C通信
+#### 进行I3C通信
消息传输
```c
@@ -166,49 +126,15 @@ int32_t I3cTransfer(DevHandle handle, struct I3cMsg *msgs, int16_t count, enum T
-参数
- |
-参数描述
- |
-
-
-handle
- |
-I3C控制器句柄
- |
-
-msgs
- |
-待传输数据的消息结构体数组
- |
-
-count
- |
-消息数组长度
- |
-
-mode
- |
-传输模式,0:I2C模式;1:I3C模式;2:发送CCC(Common Command Code)
- |
-
-返回值
- |
-返回值描述
- |
-
-正整数
- |
-成功传输的消息结构体数目
- |
-
-负数
- |
-执行失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------------------------------------- |
+| handle | I3C控制器句柄 |
+| msgs | 待传输数据的消息结构体数组 |
+| count | 消息数组长度 |
+| mode | 传输模式,0:I2C模式;1:I3C模式;2:发送CCC |
+| **返回值** | **返回值描述** |
+| 正整数 | 成功传输的消息结构体数目 |
+| 负数 | 执行失败 |
I3C传输消息类型为I3cMsg,每个传输消息结构体表示一次读或写,通过一个消息数组,可以执行若干次的读写组合操作。
@@ -239,7 +165,7 @@ if (ret != 2) {
>- 本函数不对每个消息结构体中的数据长度做限制,同样由具体I3C控制器决定。
>- 本函数可能会引起系统休眠,禁止在中断上下文调用。
-### 获取I3C控制器配置
+#### 获取I3C控制器配置
```c
int32_t I3cGetConfig(DevHandle handle, struct I3cConfig *config);
@@ -249,41 +175,27 @@ int32_t I3cGetConfig(DevHandle handle, struct I3cConfig *config);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-I3C控制器句柄
- |
-
-config
- |
-I3C控制器配置
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-获取成功
- |
-
-负数
- |
-获取失败
- |
-
-
-
-
-### 配置I3C控制器
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | I3C控制器句柄 |
+| config | I3C控制器配置 |
+| **返回值** | **返回值描述** |
+| 0 | 获取成功 |
+| 负数 | 获取失败 |
+
+获取I3C控制器配置示例:
+
+```c
+struct I3cConfig config;
+
+ret = I3cGetConfig(i3cHandle, &config);
+if (ret != HDF_SUCCESS) {
+ HDF_LOGE("%s: Get config fail!", __func__);
+ return HDF_FAILURE;
+}
+```
+
+#### 配置I3C控制器
```c
int32_t I3cSetConfig(DevHandle handle, struct I3cConfig *config);
@@ -293,41 +205,29 @@ int32_t I3cSetConfig(DevHandle handle, struct I3cConfig *config);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-I3C控制器句柄
- |
-
-config
- |
-I3C控制器配置
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-配置成功
- |
-
-负数
- |
-配置失败
- |
-
-
-
-
-### 请求IBI(带内中断)
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | I3C控制器句柄 |
+| config | I3C控制器配置 |
+| **返回值** | **返回值描述** |
+| 0 | 配置成功 |
+| 负数 | 配置失败 |
+
+配置I3C控制器示例:
+
+```c
+struct I3cConfig config;
+
+config->busMode = I3C_BUS_HDR_MODE;
+config->curMaster = NULL;
+ret = I3cSetConfig(i3cHandle, &config);
+if (ret != HDF_SUCCESS) {
+ HDF_LOGE("%s: Set config fail!", __func__);
+ return HDF_FAILURE;
+}
+```
+
+#### 请求IBI(带内中断)
```c
int32_t I3cRequestIbi(DevHandle handle, uint16_t addr, I3cIbiFunc func, uint32_t payload);
@@ -337,49 +237,17 @@ int32_t I3cRequestIbi(DevHandle handle, uint16_t addr, I3cIbiFunc func, uint32_t
-参数
- |
-参数描述
- |
-
-
-handle
- |
-I3C控制器设备句柄
- |
-
-addr
- |
-I3C设备地址
- |
-
-func
- |
-IBI回调函数
- |
-
-payload
- |
-IBI有效载荷
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-请求成功
- |
-
-负数
- |
-请求失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | I3C控制器句柄 |
+| addr | I3C设备地址 |
+| func | IBI回调函数 |
+| payload | IBI有效载荷 |
+| **返回值** | **返回值描述** |
+| 0 | 请求成功 |
+| 负数 | 请求失败 |
+
+请求带内中断示例:
```c
static int32_t TestI3cIbiFunc(DevHandle handle, uint16_t addr, struct I3cIbiData data)
@@ -415,7 +283,7 @@ int32_t I3cTestRequestIbi(void)
}
```
-### 释放IBI(带内中断)
+#### 释放IBI(带内中断)
```c
int32_t I3cFreeIbi(DevHandle handle, uint16_t addr);
@@ -425,45 +293,21 @@ int32_t I3cFreeIbi(DevHandle handle, uint16_t addr);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-I3C控制器设备句柄
- |
-
-addr
- |
-I3C设备地址
- |
-
-返回值
- |
-返回值描述
- |
-
-0
- |
-释放成功
- |
-
-负数
- |
-释放失败
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | I3C控制器句柄 |
+| addr | I3C设备地址 |
+| **返回值** | **返回值描述** |
+| 0 | 释放成功 |
+| 负数 | 释放失败 |
+
+释放带内中断示例:
```c
I3cFreeIbi(i3cHandle, 0x3F); /* 释放带内中断 */
```
-### 关闭I3C控制器
+#### 关闭I3C控制器
I3C通信完成之后,需要关闭I3C控制器,关闭函数如下所示:
```c
@@ -474,26 +318,17 @@ void I3cClose(DevHandle handle);
-参数
- |
-参数描述
- |
-
-
-handle
- |
-I3C控制器设备句柄
- |
-
-
-
+| 参数 | 参数描述 |
+| ---------- | -------------- |
+| handle | I3C控制器句柄 |
+关闭I3C控制器实例:
```c
I3cClose(i3cHandle); /* 关闭I3C控制器 */
```
-## 使用实例
+## 使用实例
本例程以操作开发板上的I3C设备为例,详细展示I3C接口的完整使用流程。
@@ -511,7 +346,6 @@ I3cClose(i3cHandle); /* 关闭I3C控制器 */
```c
#include "i3c_if.h" /* I3C标准接口头文件 */
-#include "i3c_ccc.h" /* I3C通用命令代码头文件 */
#include "hdf_log.h" /* 标准日志打印头文件 */
#include "osal_io.h" /* 标准IO读写接口头文件 */
#include "osal_time.h" /* 标准延迟&睡眠接口头文件 */
diff --git a/zh-cn/device-dev/driver/driver-platform-i3c-develop.md b/zh-cn/device-dev/driver/driver-platform-i3c-develop.md
index 3f882b3b3dfd1a733da5feef13239c429ea2a41b..3fdf899756b7e6d8f40fc7b8671703039e6dd114 100755
--- a/zh-cn/device-dev/driver/driver-platform-i3c-develop.md
+++ b/zh-cn/device-dev/driver/driver-platform-i3c-develop.md
@@ -1,73 +1,115 @@
# I3C
- [概述](#1)
-- [开发步骤](#2)
-- [开发实例](#3)
+ - [功能简介](#2)
+ - [基本概念](#3)
+ - [运作机制](#4)
+ - [约束与限制](#5)
+- [开发指导](#6)
+ - [场景介绍](#7)
+ - [接口说明](#8)
+ - [开发步骤](#9)
## 概述
-I3C(Improved Inter Integrated Circuit)总线是由MIPI Alliance开发的一种简单、低成本的双向二线制同步串行总线。在HDF框架中,I3C模块接口适配模式采用统一服务模式,这需要一个设备服务来作为I3C模块的管理器,统一处理外部访问,这会在配置文件中有所体现。统一服务模式适合于同类型设备对象较多的情况,如I3C可能同时具备十几个控制器,采用独立服务模式需要配置更多的设备节点,且服务会占据内存资源。
+### 功能简介
+
+I3C(Improved Inter Integrated Circuit)总线是由MIPI Alliance开发的一种简单、低成本的双向二线制同步串行总线。
+
+### 基本概念
+
+I3C是两线双向串行总线,针对多个传感器从设备进行了优化,并且一次只能由一个I3C主设备控制。 相比于I2C,I3C总线拥有更高的速度、更低的功耗,支持带内中断、从设备热接入以及切换当前主设备,同时向后兼容I2C从设备。
+
+- IBI(In-Band Interrupt):带内中断。在SCL线没有启动信号时,I3C从设备可以通过拉低SDA线使主设备发出SCL启动信号,从而发出带内中断请求。若有多个从机同时发出中断请求,I3C主机则通过从机地址进行仲裁,低地址优先相应。
+- DAA(Dynamic Address Assignment):动态地址分配。I3C支持对从设备地址进行动态分配从而避免地址冲突。在分配动态地址之前,连接到I3C总线上的每个I3C设备都应以两种方式之一来唯一标识:
+1)设备可能有一个符合I2C规范的静态地址,主机可以使用此静态地址;
+2)在任何情况下,设备均应具有48位的临时ID。 除非设备具有静态地址且主机使用静态地址,否则主机应使用此48位临时ID。
+
+- CCC(Common Command Code) :通用命令代码(CCC),所有I3C设备均支持CCC,可以直接将其传输到特定的I3C从设备,也可以同时传输到所有I3C从设备。
+- BCR(Bus Characteristic Register):总线特性寄存器,每个连接到 I3C 总线的 I3C 设备都应具有相关的只读总线特性寄存器 (BCR),该寄存器描述了I3C兼容设备在动态地址分配和通用命令代码中的作用和功能。
+- DCR(Device Characteristic Register):设备特性寄存器,连接到 I3C 总线的每个 I3C 设备都应具有相关的只读设备特性寄存器 (DCR)。 该寄存器描述了用于动态地址分配和通用命令代码的 I3C 兼容设备类型(例如,加速度计、陀螺仪等)。
+
+
+### 运作机制
+
+在HDF框架中,同类型控制器对象较多时(可能同时存在十几个同类型控制器),如果采用独立服务模式则需要配置更多的设备节点,且相关服务会占据更多的内存资源。相反,采用统一服务模式可以使用一个设备服务作为管理器,统一处理所有同类型对象的外部访问(这会在配置文件中有所体现),实现便捷管理和节约资源的目的。I3C模块接口适配模式采用统一服务模式(如[图1](#fig1)所示)。
+
+I3C模块各分层的作用为:接口层提供打开控制器、传输消息、获取和设置控制器参数以及关闭控制器的接口。核心层主要提供绑定设备、初始化设备以及释放设备的能力。适配层实现其他具体的功能。
+
+ **图 1** I3C统一服务模式
![image1](figures/统一服务模式结构图.png)
-## 开发步骤
+### 约束与限制
+
+I3C模块当前仅支持轻量和小型系统内核(LiteOS) 。
+
+## 开发指导
+
+### 场景介绍
+
+I3C可连接单个或多个I3C、I2C从器件,它主要用于:
+1. 与传感器通信,如陀螺仪、气压计或支持I3C协议的图像传感器等。
+2. 通过软件或硬件协议转换,与其他通信接口(如 UART 串口等)的设备进行通信。
+
+### 接口说明
+
+I3cMethod定义:
+```c
+struct I3cMethod {
+ int32_t (*sendCccCmd)(struct I3cCntlr *cntlr, struct I3cCccCmd *ccc);
+ int32_t (*transfer)(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count);
+ int32_t (*i2cTransfer)(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count);
+ int32_t (*setConfig)(struct I3cCntlr *cntlr, struct I3cConfig *config);
+ int32_t (*getConfig)(struct I3cCntlr *cntlr, struct I3cConfig *config);
+ int32_t (*requestIbi)(struct I3cDevice *dev);
+ void (*freeIbi)(struct I3cDevice *dev);
+};
+```
+
+**表1** I3cMethod结构体成员的回调函数功能说明
+|函数成员|入参|出参|返回值|功能|
+|-|-|-|-|-|
+|sendCccCmd|**cntlr**: 结构体指针,核心层I3C控制器;
**ccc**:传入的通用命令代码结构体指针;|**ccc**:传出的通用命令代码结构体指针;|HDF_STATUS相关状态|发送CCC(Common command Code,即通用命令代码)|
+|Transfer |**cntlr**: 结构体指针,核心层I3C控制器;
**msgs**:结构体指针,用户消息 ;
**count**:int16_t,消息数量|**msgs**:结构体指针,用户消息 ;|HDF_STATUS相关状态|使用I3C模式传递用户消息|
+|i2cTransfer |**cntlr**: 结构体指针,核心层I3C控制器;
**msgs**:结构体指针,用户消息 ;
**count**:int16_t,消息数量|**msgs**:结构体指针,用户消息 ;|HDF_STATUS相关状态|使用I2C模式传递用户消息|
+|setConfig|**cntlr**: 结构体指针,核心层I3C控制器;
**config**: 控制器配置参数|无|HDF_STATUS相关状态|设置I3C控制器配置参数|
+|getConfig|**cntlr**: 结构体指针,核心层I3C控制器;|**config**: 控制器配置参数|HDF_STATUS相关状态|获取I3C控制器配置参数|
+|requestIbi|**device**: 结构体指针,核心层I3C设备;|无|HDF_STATUS相关状态|为I3C设备请求IBI(In-Bind Interrupt,即带内中断)|
+|freeIbi|**device**: 结构体指针,核心层I3C设备;|无|HDF_STATUS相关状态|释放IBI|
+
+### 开发步骤
I3C模块适配的四个环节是实例化驱动入口、配置属性文件、实例化I3C控制器对象以及注册中断处理子程序。
-1. **实例化驱动入口:**
+- **实例化驱动入口:**
- 实例化HdfDriverEntry结构体成员。
- 调用HDF_INIT将HdfDriverEntry实例化对象注册到HDF框架中。
-2. **配置属性文件:**
-
+- **配置属性文件:**
+
- 在device_info.hcs文件中添加deviceNode描述。
- 【可选】添加i3c_config.hcs器件属性文件。
-3. **实例化I3C控制器对象:**
-
+- **实例化I3C控制器对象:**
- 初始化I3cCntlr成员。
- 实例化I3cCntlr成员I3cMethod方法集合,其定义和成员函数说明见下文。
-4. **注册中断处理子程序:**
+- **注册中断处理子程序:**
为控制器注册中断处理程序,实现设备热接入和IBI(带内中断)功能。
- I3cMethod定义:
- ```c
- struct I3cMethod {
- int32_t (*sendCccCmd)(struct I3cCntlr *cntlr, struct I3cCccCmd *ccc);
- int32_t (*transfer)(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count);
- int32_t (*i2cTransfer)(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count);
- int32_t (*setConfig)(struct I3cCntlr *cntlr, struct I3cConfig *config);
- int32_t (*getConfig)(struct I3cCntlr *cntlr, struct I3cConfig *config);
- int32_t (*requestIbi)(struct I3cDevice *dev);
- void (*freeIbi)(struct I3cDevice *dev);
- };
- ```
-
- 表1 I3cMethod结构体成员的回调函数功能说明
-
- |函数成员|入参|出参|返回值|功能|
- |-|-|-|-|-|
- |sendCccCmd|**cntlr**: 结构体指针,核心层I3C控制器;
**ccc**:传入的通用命令代码结构体指针;|**ccc**:传出的通用命令代码结构体指针;|HDF_STATUS相关状态|发送CCC(Common command Code,即通用命令代码)|
- |Transfer |**cntlr**: 结构体指针,核心层I3C控制器;
**msgs**:结构体指针,用户消息 ;
**count**:int16_t,消息数量|**msgs**:结构体指针,用户消息 ;|HDF_STATUS相关状态|使用I3C模式传递用户消息|
- |i2cTransfer |**cntlr**: 结构体指针,核心层I3C控制器;
**msgs**:结构体指针,用户消息 ;
**count**:int16_t,消息数量|**msgs**:结构体指针,用户消息 ;|HDF_STATUS相关状态|使用I2C模式传递用户消息|
- |setConfig|**cntlr**: 结构体指针,核心层I3C控制器;
**config**: 控制器配置参数|无|HDF_STATUS相关状态|设置I3C控制器配置参数|
- |getConfig|**cntlr**: 结构体指针,核心层I3C控制器;|**config**: 控制器配置参数|HDF_STATUS相关状态|获取I3C控制器配置参数|
- |requestIbi|**device**: 结构体指针,核心层I3C设备;|无|HDF_STATUS相关状态|为I3C设备请求IBI(In-Bind Interrupt,即带内中断)|
- |freeIbi|**device**: 结构体指针,核心层I3C设备;|无|HDF_STATUS相关状态|释放IBI|
-
-## 开发实例
-
-1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf_device_desc.h 中定义)类型的全局变量,且moduleName要和device_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。
+1. **实例化驱动入口**
+ 驱动入口必须为HdfDriverEntry(在 hdf_device_desc.h 中定义)类型的全局变量,且moduleName要和device_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。
+
一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。
-
+
I3C驱动入口参考:
-
+
> I3C模块这种类型的控制器会出现很多个控制器挂接的情况,因而在HDF框架中首先会为这类型的控制器创建一个管理器对象,并同时对外发布一个管理器服务来统一处理外部访问。这样,用户需要打开某个控制器时,会先获取到管理器服务,然后管理器服务根据用户指定参数查找到指定控制器。
- >
- > I3C管理器服务的驱动由核心层实现,**厂商不需要关注这部分内容的实现,但在实现Init函数的时候需要调用核心层的I3cCntlrAdd函数,它会实现相应功能。**
-
+ >
+ > I3C管理器服务的驱动由核心层实现,厂商不需要关注这部分内容的实现,但在实现Init函数的时候需要调用核心层的I3cCntlrAdd函数,它会实现相应功能。
+
```c
static struct HdfDriverEntry g_virtualI3cDriverEntry = {
.moduleVersion = 1,
@@ -87,17 +129,19 @@ I3C模块适配的四个环节是实例化驱动入口、配置属性文件、
HDF_INIT(g_i3cManagerEntry);
```
-2. 完成驱动入口注册之后,下一步请在device_info.hcs文件中添加deviceNode信息,并在i3c_config.hcs中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值对于厂商驱动的实现以及核心层I3cCntlr相关成员的默认值或限制范围有密切关系。
+2. **配置属性文件**
+
+ 完成驱动入口注册之后,下一步请在device_info.hcs文件中添加deviceNode信息,并在i3c_config.hcs中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值对于厂商驱动的实现以及核心层I3cCntlr相关成员的默认值或限制范围有密切关系。
+
+ 统一服务模式的特点是device_info文件中第一个设备节点必须为I3C管理器,其各项参数必须如下设置:
- **统一服务模式**的特点是device_info文件中第一个设备节点必须为I3C管理器,其各项参数必须如下设置:
-
|成员名|值|
|-|-|
|moduleName |HDF_PLATFORM_I3C_MANAGER|
|serviceName|无(预留)|
|policy|0|
|cntlrMatchAttr| 无(预留)|
-
+
从第二个节点开始配置具体I3C控制器信息,此节点并不表示某一路I3C控制器,而是代表一个资源性质设备,用于描述一类I3C控制器的信息。本例只有一个I3C控制器,如有多个控制器,则需要在device_info文件增加deviceNode信息,以及在i3c_config文件中增加对应的器件属性。
- device_info.hcs 配置参考
@@ -151,14 +195,16 @@ I3C模块适配的四个环节是实例化驱动入口、配置属性文件、
}
```
-3. 配置属性文件完成后,要以核心层I3cCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化I3cCntlr成员I3cMethod(让用户可以通过接口来调用驱动底层函数)。
+3. **实例化I3C控制器对象**
+
+ 配置属性文件完成后,要以核心层I3cCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化I3cCntlr成员I3cMethod(让用户可以通过接口来调用驱动底层函数)。
此步骤需要通过实现HdfDriverEntry成员函数(Bind,Init,Release)来完成。
- 自定义结构体参考
> 从驱动的角度看,自定义结构体是参数和数据的载体,而且i3c_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,其中一些重要数值也会传递给核心层I3cCntlr对象,例如设备号、总线号等。
-
+
```c
struct VirtualI3cCntlr {
struct I3cCntlr cntlr; //【必要】是核心层控制对象,具体描述见下面
@@ -173,7 +219,7 @@ I3C模块适配的四个环节是实例化驱动入口、配置属性文件、
uint32_t i2cFmRate;
uint32_t i2cFmPlusRate;
};
-
+
/* I3cCntlr是核心层控制器结构体,其中的成员在Init函数中被赋值 */
struct I3cCntlr {
OsalSpinlock lock;
@@ -188,109 +234,109 @@ I3C模块适配的四个环节是实例化驱动入口、配置属性文件、
};
```
- > **【重要】** I3cCntlr成员回调函数结构体I3cMethod的实例化,I3cLockMethod回调函数结构体本例未实现,若要实例化,可参考I2C驱动开发,其他成员在Init函数中初始化
-
-
- - **init函数参考**
-
- > **入参:**
- > HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息
- >
- > **返回值:**
- > HDF_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS 定义)
+ > I3cCntlr成员回调函数结构体I3cMethod的实例化,I3cLockMethod回调函数结构体本例未实现,若要实例化,可参考I2C驱动开发,其他成员在Init函数中初始化
+
+ - init函数参考
+
+ **入参:**
+ HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息
+
+ **返回值:**
+ HDF_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS 定义)
+
+
+ |状态(值)|问题描述|
+ |:-|:-:|
+ |HDF_ERR_INVALID_OBJECT|控制器对象非法|
+ |HDF_ERR_INVALID_PARAM |参数非法|
+ |HDF_ERR_MALLOC_FAIL |内存分配失败|
+ |HDF_ERR_IO |I/O 错误|
+ |HDF_SUCCESS |传输成功|
+ |HDF_FAILURE |传输失败|
+
+ **函数说明:**
+ 初始化自定义结构体对象,初始化I3cCntlr成员,调用核心层I3cCntlrAdd函数。
+
+ ```c
+ static int32_t VirtualI3cParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node)
+ {
+ int32_t ret;
+ struct VirtualI3cCntlr *virtual = NULL; //【必要】自定义结构体对象
+ (void)device;
+
+ virtual = (struct VirtualI3cCntlr *)OsalMemCalloc(sizeof(*virtual)); //【必要】内存分配
+ if (virtual == NULL) {
+ HDF_LOGE("%s: Malloc virtual fail!", __func__);
+ return HDF_ERR_MALLOC_FAIL;
+ }
+
+ ret = VirtualI3cReadDrs(virtual, node); //【必要】将i3c_config文件的默认值填充到结构体中
+ if (ret != HDF_SUCCESS) {
+ HDF_LOGE("%s: Read drs fail! ret:%d", __func__, ret);
+ goto __ERR__;
+ }
+ ...
+ virtual->regBase = OsalIoRemap(virtual->regBasePhy, virtual->regSize);//【必要】地址映射
+ ret = OsalRegisterIrq(hi35xx->softIrqNum, OSAL_IRQF_TRIGGER_NONE, I3cIbiHandle, "I3C", virtual); //【必要】注册中断程序
+ if (ret != HDF_SUCCESS) {
+ HDF_LOGE("%s: register irq failed!", __func__);
+ return ret;
+ }
+ ...
+ VirtualI3cCntlrInit(virtual); //【必要】I3C设备的初始化
+ virtual->cntlr.priv = (void *)node; //【必要】存储设备属性
+ virtual->cntlr.busId = virtual->busId; //【必要】初始化I3cCntlr成员
+ virtual->cntlr.ops = &g_method; //【必要】I3cMethod的实例化对象的挂载
+ (void)OsalSpinInit(&virtual->spin);
+ ret = I3cCntlrAdd(&virtual->cntlr); //【必要且重要】调用此函数将控制器添加至核心,返回成功信号后驱动才完全接入平台核心层
+ if (ret != HDF_SUCCESS) {
+ HDF_LOGE("%s: add i3c controller failed! ret = %d", __func__, ret);
+ (void)OsalSpinDestroy(&virtual->spin);
+ goto __ERR__;
+ }
+
+ return HDF_SUCCESS;
+ __ERR__: //若控制器添加失败,需要执行去初始化相关函数
+ if (virtual != NULL) {
+ OsalMemFree(virtual);
+ virtual = NULL;
+ }
+
+ return ret;
+ }
+
+ static int32_t VirtualI3cInit(struct HdfDeviceObject *device)
+ {
+ int32_t ret;
+ const struct DeviceResourceNode *childNode = NULL;
+
+ if (device == NULL || device->property == NULL) {
+ HDF_LOGE("%s: device or property is NULL", __func__);
+ return HDF_ERR_INVALID_OBJECT;
+ }
+
+ DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) {
+ ret = VirtualI3cParseAndInit(device, childNode);
+ if (ret != HDF_SUCCESS) {
+ break;
+ }
+ }
+
+ return ret;
+ }
+ ```
+
+ - Release 函数参考
+
+ **入参:**
+ HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息 。
- |状态(值)|问题描述|
- |:-|:-:|
- |HDF_ERR_INVALID_OBJECT|控制器对象非法|
- |HDF_ERR_INVALID_PARAM |参数非法|
- |HDF_ERR_MALLOC_FAIL |内存分配失败|
- |HDF_ERR_IO |I/O 错误|
- |HDF_SUCCESS |传输成功|
- |HDF_FAILURE |传输失败|
-
- > **函数说明:**
- > 初始化自定义结构体对象,初始化I3cCntlr成员,调用核心层I3cCntlrAdd函数。
-
- ```c
- static int32_t VirtualI3cParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node)
- {
- int32_t ret;
- struct VirtualI3cCntlr *virtual = NULL; //【必要】自定义结构体对象
- (void)device;
-
- virtual = (struct VirtualI3cCntlr *)OsalMemCalloc(sizeof(*virtual)); //【必要】内存分配
- if (virtual == NULL) {
- HDF_LOGE("%s: Malloc virtual fail!", __func__);
- return HDF_ERR_MALLOC_FAIL;
- }
-
- ret = VirtualI3cReadDrs(virtual, node); //【必要】将i3c_config文件的默认值填充到结构体中
- if (ret != HDF_SUCCESS) {
- HDF_LOGE("%s: Read drs fail! ret:%d", __func__, ret);
- goto __ERR__;
- }
- ...
- virtual->regBase = OsalIoRemap(virtual->regBasePhy, virtual->regSize);//【必要】地址映射
- ret = OsalRegisterIrq(hi35xx->softIrqNum, OSAL_IRQF_TRIGGER_NONE, I3cIbiHandle, "I3C", virtual); //【必要】注册中断程序
- if (ret != HDF_SUCCESS) {
- HDF_LOGE("%s: register irq failed!", __func__);
- return ret;
- }
- ...
- VirtualI3cCntlrInit(virtual); //【必要】I3C设备的初始化
- virtual->cntlr.priv = (void *)node; //【必要】存储设备属性
- virtual->cntlr.busId = virtual->busId; //【必要】初始化I3cCntlr成员
- virtual->cntlr.ops = &g_method; //【必要】I3cMethod的实例化对象的挂载
- (void)OsalSpinInit(&virtual->spin);
- ret = I3cCntlrAdd(&virtual->cntlr); //【必要且重要】调用此函数将控制器添加至核心,返回成功信号后驱动才完全接入平台核心层
- if (ret != HDF_SUCCESS) {
- HDF_LOGE("%s: add i3c controller failed! ret = %d", __func__, ret);
- (void)OsalSpinDestroy(&virtual->spin);
- goto __ERR__;
- }
-
- return HDF_SUCCESS;
- __ERR__: //若控制器添加失败,需要执行去初始化相关函数
- if (virtual != NULL) {
- OsalMemFree(virtual);
- virtual = NULL;
- }
-
- return ret;
- }
-
- static int32_t VirtualI3cInit(struct HdfDeviceObject *device)
- {
- int32_t ret;
- const struct DeviceResourceNode *childNode = NULL;
-
- if (device == NULL || device->property == NULL) {
- HDF_LOGE("%s: device or property is NULL", __func__);
- return HDF_ERR_INVALID_OBJECT;
- }
-
- DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) {
- ret = VirtualI3cParseAndInit(device, childNode);
- if (ret != HDF_SUCCESS) {
- break;
- }
- }
-
- return ret;
- }
- ```
-
- - **Release 函数参考**
+ **返回值:**
+ 无。
+
+ **函数说明:**
+ 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。
- > **入参:**
- > HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息 。
- >
- > **返回值:**
- > 无。
- >
- > **函数说明:**
- > 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。
-
```c
static void VirtualI3cRemoveByNode(const struct DeviceResourceNode *node)
{
@@ -327,9 +373,9 @@ I3C模块适配的四个环节是实例化驱动入口、配置属性文件、
static void VirtualI3cRelease(struct HdfDeviceObject *device)
{
const struct DeviceResourceNode *childNode = NULL;
-
+
HDF_LOGI("%s: enter", __func__);
-
+
if (device == NULL || device->property == NULL) {
HDF_LOGE("%s: device or property is NULL", __func__);
return;
@@ -342,7 +388,9 @@ I3C模块适配的四个环节是实例化驱动入口、配置属性文件、
}
```
-4. 最后一步,实现中断处理程序,在中断处理程序中通过判断中断产生的地址,实现热接入、IBI等操作。
+4. **注册中断处理子程序**
+
+ 在中断处理程序中通过判断中断产生的地址,实现热接入、IBI等操作。
```c
static int32_t VirtualI3cReservedAddrWorker(struct VirtualI3cCntlr *virtual, uint16_t addr)
@@ -378,7 +426,7 @@ I3C模块适配的四个环节是实例化驱动入口、配置属性文件、
struct I3cDevice *device = NULL;
uint16_t ibiAddr;
char *testStr = "Hello I3C!";
-
+
(void)irq;
if (data == NULL) {
HDF_LOGW("%s: data is NULL!", __func__);
@@ -404,7 +452,7 @@ I3C模块适配的四个环节是实例化驱动入口、配置属性文件、
/* 根据产生IBI的I3C设备调用IBI回调函数 */
return I3cCntlrIbiCallback(device);
}
-
+
return HDF_SUCCESS;
}
```
\ No newline at end of file
diff --git "a/zh-cn/device-dev/driver/figures/HDMI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/zh-cn/device-dev/driver/figures/HDMI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png"
index fa578f83d99f47e868312dad99d6b38fa960e794..05da9ba45a46df455935b302c61d5a6c566eacc7 100755
Binary files "a/zh-cn/device-dev/driver/figures/HDMI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" and "b/zh-cn/device-dev/driver/figures/HDMI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ
diff --git "a/zh-cn/device-dev/driver/figures/\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/zh-cn/device-dev/driver/figures/\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png"
index f0ddcee70022751a43b9ef1da145c68094da0eab..84474d3fecb9c37254a778d5ef005f8b2fdf5501 100755
Binary files "a/zh-cn/device-dev/driver/figures/\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" and "b/zh-cn/device-dev/driver/figures/\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ