未验证 提交 23a79a23 编写于 作者: L liyan 提交者: Gitee

资料规范性检查

Signed-off-by: Nli-yan339 <liyan339@h-partners.com>
上级 c4b29bed
......@@ -5,7 +5,7 @@
### 功能简介
HDMI(High Definition Multimedia Interface),即高清多媒体接口,是Hitachi、Panasonic、Philips、Silicon Image、Sony、Thomson、Toshiba共同发布的一款音视频传输协议,主要用于DVD、机顶盒等音视频source到TV、显示器等Sink设备的传输。HDMI传输过程遵循TMDS(Transition Minimized Differential Signaling)协议。
HDMI(High Definition Multimedia Interface),即高清多媒体接口,是Hitachi、Panasonic、Philips、Silicon Image、Sony、Thomson、Toshiba共同发布的一款音视频传输协议,主要用于DVD、机顶盒等音视频Source设备到TV、显示器等Sink设备的传输。HDMI传输过程遵循TMDS(Transition Minimized Differential Signaling)协议。
### 基本概念
......@@ -15,13 +15,14 @@ HDMI(High Definition Multimedia Interface),即高清多媒体接口,是H
- CEC(Consumer Electronics Control):消费电子控制,该功能应该能够在连接HDMI的发送设备与接收设备之间实现交互操作。
- FRL(Fixed Rate Link):TMDS 的架构进行讯号传输时,最高带宽可达18Gbps,而 FRL 模式的带宽则提升到48Gbps。
- FRL(Fixed Rate Link):TMDS的架构进行讯号传输时,最高带宽可达18Gbps,而FRL模式的带宽则提升到48Gbps。
- HDCP(High-bandwidth Digital Content Protection):即高带宽数字内容保护技术,当用户对高清晰信号进行非法复制时,该技术会进行干扰,降低复制出来的影像的质量,从而对内容进行保护。
### 运作机制
在HDF框架中,HDMI的接口适配模式采用独立服务模式(如图1)在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用率。
在HDF框架中,HDMI的接口适配模式采用独立服务模式(如图1)在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用率。
**图 1** HDMI独立服务模式
......@@ -35,7 +36,7 @@ HDMI模块当前仅支持轻量和小型系统内核(LiteOS) 。
### 场景介绍
HDMI具有体积小,传输速率高,传输带宽宽,兼容性好,能同时传输无压缩音视频信号等优点。与传统的全模拟接口相比,HDMI不但增加了设备间接线的便捷性,还提供了一些HDMI特有的智能化功能,可用于小体积设备进行高质量音视频传输的场景。
HDMI具有体积小、传输速率高、传输带宽宽、兼容性好、能同时传输无压缩音视频信号等优点。与传统的全模拟接口相比,HDMI不但增加了设备间接线的便捷性,还提供了一些HDMI特有的智能化功能,可用于小体积设备进行高质量音视频传输的场景。
### 接口说明
......@@ -86,40 +87,40 @@ struct HdmiCntlrOps {
| hardWareInit | **cntlr**:结构体指针,核心层HDMI控制器 | 无 | 无 | 初始化HDMI硬件 |
| hardWareStatusGet | **cntlr**:结构体指针,核心层HDMI控制器<br /> | **status**:HDMI硬件状态 ; | 无 | 获取HDMI当前硬件状态 |
| controllerReset | **cntlr**:结构体指针,核心层HDMI控制器 | 无 | 无 | 复位HDMI控制器 |
| hotPlugStateGet | **cntlr**:结构体指针,核心层HDMI控制器 | 无 | bool: HDMI热插拔状态 | 获取HDMI热插拔状态 |
| hotPlugInterruptStateGet | **cntlr**:结构体指针,核心层HDMI控制器 | 无 | bool: HDMI热插拔中断状态 | 获取HDMI热插拔中断状态 |
| lowPowerSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**: bool,使能/去使能 | 无 | 无 | 使能/去使能低功耗 |
| hotPlugStateGet | **cntlr**:结构体指针,核心层HDMI控制器 | 无 | boolHDMI热插拔状态 | 获取HDMI热插拔状态 |
| hotPlugInterruptStateGet | **cntlr**:结构体指针,核心层HDMI控制器 | 无 | boolHDMI热插拔中断状态 | 获取HDMI热插拔中断状态 |
| lowPowerSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**bool,使能/去使能 | 无 | 无 | 使能/去使能低功耗 |
| tmdsModeSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**mode**:TMDS模式 | 无 | 无 | 设置TMDS模式 |
| tmdsConfigSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**mode**: TMDS参数 | 无 | HDF_STATUS相关状态 | 配置TMDS参数 |
| infoFrameEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**infoFrameType**: packet类型<br />**enable**: bool,使能/去使能 | 无 | 无 | 使能/去使能infoFrame |
| infoFrameSend | **cntlr**:结构体指针,核心层HDMI控制器<br />**infoFrameType**: packet类型<br />**data**: infoFrame数据<br />**len**:数据长度 | 无 | HDF_STATUS相关状态 | 发送infoFrame |
| cecMsgSend | **cntlr**:结构体指针,核心层HDMI控制器<br />**msg**: CEC消息 | 无 | HDF_STATUS相关状态 | 发送CEC消息 |
| audioPathEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**: bool,使能/去使能| 无 | 无 | 使能/去使能audio通路 |
| audioPathSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**config**: 配置信息 | 无 | 无 | 设置audio通路配置信息 |
| phyOutputEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**: bool,使能/去使能 | 无 | 无 | 使能/去使能物理层输出状态 |
| phyOutputSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**cfg**: 配置信息 | 无 | 无 | 设置物理层配置信息 |
| blackDataSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**: bool,使能/去使能 | 无 | 无 | 设置黑屏 |
| videoMuteEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**: bool,使能/去使能 | 无 | 无 | 使能/去使能video静音 |
| tmdsConfigSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**mode**TMDS参数 | 无 | HDF_STATUS相关状态 | 配置TMDS参数 |
| infoFrameEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**infoFrameType**:packet类型<br />**enable**bool,使能/去使能 | 无 | 无 | 使能/去使能infoFrame |
| infoFrameSend | **cntlr**:结构体指针,核心层HDMI控制器<br />**infoFrameType**:packet类型<br />**data**infoFrame数据<br />**len**:数据长度 | 无 | HDF_STATUS相关状态 | 发送infoFrame |
| cecMsgSend | **cntlr**:结构体指针,核心层HDMI控制器<br />**msg**CEC消息 | 无 | HDF_STATUS相关状态 | 发送CEC消息 |
| audioPathEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**bool,使能/去使能| 无 | 无 | 使能/去使能audio通路 |
| audioPathSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**config**配置信息 | 无 | 无 | 设置audio通路配置信息 |
| phyOutputEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**bool,使能/去使能 | 无 | 无 | 使能/去使能物理层输出状态 |
| phyOutputSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**cfg**配置信息 | 无 | 无 | 设置物理层配置信息 |
| blackDataSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**bool,使能/去使能 | 无 | 无 | 设置黑屏 |
| videoMuteEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**bool,使能/去使能 | 无 | 无 | 使能/去使能video静音 |
| videoPathSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**attr**:配置信息| 无 | 无 | 设置video通路配置信息 |
|audioMuteEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**: bool,使能/去使能 | 无 | 无 | 使能/去使能audio静音 |
| avmuteSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**: bool,使能/去使能| 无 | 无 | 使能/去使能声音图像消隐 |
|audioMuteEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**bool,使能/去使能 | 无 | 无 | 使能/去使能audio静音 |
| avmuteSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**bool,使能/去使能| 无 | 无 | 使能/去使能声音图像消隐 |
| ddcTransfer | **cntlr**:结构体指针,核心层HDMI控制器<br />**ddcCfg**:DDC配置参数 |**ddcCfg**:DDC配置参数 |HDF_STATUS相关状态 | 读写DDC数据 |
| scdcSourceScrambleGet | **cntlr**:结构体指针,核心层HDMI控制器 | 无 | bool,加扰状态 | 获取source端的加扰状态 |
| scdcSourceScrambleSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**: bool,使能/去使能 | 无 | HDF_STATUS相关状态 | 使能/去使能source端的加扰 |
| frlEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**: bool,使能/去使能 | 无 | HDF_STATUS相关状态 | 使能/去使能FRL |
| scdcSourceScrambleSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**bool,使能/去使能 | 无 | HDF_STATUS相关状态 | 使能/去使能source端的加扰 |
| frlEnable | **cntlr**:结构体指针,核心层HDMI控制器<br />**enable**bool,使能/去使能 | 无 | HDF_STATUS相关状态 | 使能/去使能FRL |
| audioNctsSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**cfg**:N/CTS配置参数 | 无 | HDF_STATUS相关状态 | 设置audio的N/CTS信息 |
| frlTrainingConfigSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**cfg**:FRL Training配置参数 | 无 | 无| 设置FRL Training配置信息 |
| frlTrainingStart | **cntlr**:结构体指针,核心层HDMI控制器 | 无 | 无 | 开始FRL Training流程 |
| frlGetTriningRslt | **cntlr**:结构体指针,核心层HDMI控制器 | **rslt**:FRL Training结果 | 无 | 获取FRL Training结果 |
| hdcpRegInit | **cntlr**:结构体指针,核心层HDMI控制器 | 无 | 无 | 初始化HDCP流程相关的寄存器 |
|hdcpGenerateAksvAndAn |**cntlr**:结构体指针,核心层HDMI控制器 | 无 | HDF_STATUS相关状态 | HDCP流程中生成aksv和an |
| hdcpOptReg | **cntlr**:结构体指针,核心层HDMI控制器<br />**type**: 操作类型<br />**data**: 寄存器数据<br />**len**: 数据长度 | **data**: 寄存器数据 | HDF_STATUS相关状态 | HDCP流程中读写相关寄存器 |
| hdrTimerSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**config**: timer配置信息 | 无 | 无 | 设置HDR相关的timer配置信息 |
| hdcpOptReg | **cntlr**:结构体指针,核心层HDMI控制器<br />**type**:操作类型<br />**data**:寄存器数据<br />**len**:数据长度 | **data**寄存器数据 | HDF_STATUS相关状态 | HDCP流程中读写相关寄存器 |
| hdrTimerSet | **cntlr**:结构体指针,核心层HDMI控制器<br />**config**timer配置信息 | 无 | 无 | 设置HDR相关的timer配置信息 |
### 开发步骤
HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以及实例化HDMI控制器对象。
HDMI模块适配的三个环节是实例化驱动入口、配置属性文件以及实例化HDMI控制器对象。
- 实例化驱动入口:
- 实例化HdfDriverEntry结构体成员。
......@@ -135,7 +136,7 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
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释放驱动资源并退出。
......@@ -165,13 +166,13 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
platform :: host {
device_hdmi :: device {
device0 :: deviceNode {
policy = 2; // 等于2,需要发布服务
priority = 20; // 驱动启动优先级
permission = 0644; // 驱动创建设备节点权限
serviceName = "HDF_PLATFORM_HDMI_0"; //【必要】驱动对外发布服务的名称,必须唯一
moduleName = "hdmi_driver"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致
deviceMatchAttr = "adapter_hdmi_driver"; //【必要】用于配置控制器私有数据,要与hdmi_config.hcs中对应控制器保持一致
} // 具体的控制器信息在 hdmi_config.hcs 中
policy = 2; // 等于2,需要发布服务。
priority = 20; // 驱动启动优先级。
permission = 0644; // 驱动创建设备节点权限。
serviceName = "HDF_PLATFORM_HDMI_0"; //【必要】驱动对外发布服务的名称,必须唯一
moduleName = "hdmi_driver"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致
deviceMatchAttr = "adapter_hdmi_driver"; //【必要】用于配置控制器私有数据,要与hdmi_config.hcs中对应控制器保持一致
} // 具体的控制器信息在hdmi_config.hcs中。
}
}
}
......@@ -183,8 +184,8 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
root {
platform {
hdmi_config {
template hdmi_controller { // 模板公共参数,继承该模板的节点如果使用模板中的默认值,则节点字段可以缺省
match_attr = ""; //【必要】需要和device_info.hcs中的deviceMatchAttr值一致
template hdmi_controller { // 模板公共参数,继承该模板的节点如果使用模板中的默认值,则节点字段可以缺省
match_attr = ""; //【必要】需要和device_info.hcs中的deviceMatchAttr值一致
index = 0; //【必要】hdmi控制器编号
regBasePhy = 0x10100000; //【必要】寄存器物理基地址
regSize = 0xd1; //【必要】寄存器位宽
......@@ -237,14 +238,14 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
```c
struct HdmiAdapterHost {
struct HdmiCntlr *cntlr; //【必要】是核心层控制对象,具体描述如下
struct HdmiCntlr *cntlr; //【必要】是核心层控制对象,具体描述如下
volatile unsigned char *regBase;//【必要】寄存器基地址
uint32_t regBasePhy; //【必要】寄存器物理基地址
uint32_t regSize; //【必要】寄存器位宽
uint32_t irqNum; //【必要】中断号
};
/* HdmiCntlr是核心层控制器结构体,其中的成员在Init函数中被赋值 */
/* HdmiCntlr是核心层控制器结构体,其中的成员在Init函数中被赋值 */
struct HdmiCntlr {
struct IDeviceIoService service;
struct HdfDeviceObject *hdfDevObj;
......@@ -314,9 +315,11 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
- Bind函数参考
**入参:**
HdfDeviceObject是整个驱动对外呈现的接口参数,具备hcs配置文件的信息
HdfDeviceObject是整个驱动对外呈现的接口参数,具备HCS配置文件的信息。
**返回值:**
HDF_STATUS相关状态(下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS 定义)
|状态(值)|状态描述|
......@@ -329,6 +332,7 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
|HDF_FAILURE |传输失败|
**函数说明:**
初始化自定义结构体对象HdmiAdapterHost,初始化HdmiCntlr成员,调用核心层HdmiCntlrAdd函数。
HdmiCntlr,HdmiAdapterHost,HdfDeviceObject之间互相赋值,方便其他函数可以相互转化。
......@@ -353,13 +357,13 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
cntlr->ops = &g_hdmiHostOps; //【必要】HdmiCntlrOps的实例化对象的挂载
cntlr->hdfDevObj = obj; //【必要】使HdfDeviceObject与HdmiCntlr可以相互转化的前提
obj->service = &cntlr->service; //【必要】使HdfDeviceObject与HdmiCntlr可以相互转化的前提
ret = HdmiAdapterCntlrParse(cntlr, obj); //【必要】初始化cntlr,失败则 goto __ERR;
ret = HdmiAdapterCntlrParse(cntlr, obj); //【必要】初始化cntlr,失败则goto __ERR。
...
ret = HdmiAdapterHostParse(host, obj); //【必要】初始化host对象的相关属性,失败则 goto __ERR;
ret = HdmiAdapterHostParse(host, obj); //【必要】初始化host对象的相关属性,失败则goto __ERR。
...
ret = HdmiAdapterHostInit(host, cntlr); // 厂商自定义的初始化,失败则 goto __ERR;
ret = HdmiAdapterHostInit(host, cntlr); // 厂商自定义的初始化,失败则goto __ERR。
...
ret = HdmiCntlrAdd(cntlr); // 调用核心层函数 失败则 goto __ERR;
ret = HdmiCntlrAdd(cntlr); // 调用核心层函数,失败则goto __ERR。
...
HDF_LOGD("HdmiAdapterBind: success.");
return HDF_SUCCESS;
......@@ -373,10 +377,12 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
- Init函数参考
**入参:**
HdfDeviceObject是整个驱动对外暴露的接口参数,具备hcs配置文件的信息
HdfDeviceObject是整个驱动对外暴露的接口参数,具备HCS配置文件的信息。
**返回值:**
HDF_STATUS相关状态
HDF_STATUS相关状态。
**函数说明**
......@@ -389,27 +395,32 @@ HDMI模块适配的三个环节是配置属性文件,实例化驱动入口以
}
```
- Release 函数参考
- Release函数参考
**入参:**
HdfDeviceObject是整个驱动对外暴露的接口参数,具备hcs配置文件的信息
HdfDeviceObject是整个驱动对外暴露的接口参数,具备HCS配置文件的信息。
**返回值:**
**函数说明:**
释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给Release接口,当HDF框架调用Init函数初始化驱动失败时,可以调用Release释放驱动资源。
> ![](../public_sys-resources/icon-note.gif) **说明:**<br>
> 所有强制转换获取相应对象的操作前提是在Init函数中具备对应赋值的操作。
```c
static void HdmiAdapterRelease(struct HdfDeviceObject *obj)
{
struct HdmiCntlr *cntlr = NULL;
...
cntlr = (struct HdmiCntlr *)obj->service;// 这里有HdfDeviceObject到HdmiCntlr的强制转化,通过service成员,赋值见Bind函数
cntlr = (struct HdmiCntlr *)obj->service; // 这里有HdfDeviceObject到HdmiCntlr的强制转化,通过service成员,赋值见Bind函数。
...
HimciDeleteHost((struct HimciAdapterHost *)cntlr->priv);// 厂商自定义的内存释放函数,这里有HdmiCntlr到HimciAdapterHost的强制转化
HimciDeleteHost((struct HimciAdapterHost *)cntlr->priv);// 厂商自定义的内存释放函数,这里有HdmiCntlr到HimciAdapterHost的强制转化。
}
```
> ![](../public_sys-resources/icon-note.gif) **说明:**<br>
> 所有强制转换获取相应对象的操作前提是在Init函数中具备对应赋值的操作。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册