表 3 HdmiRegisterHpdCallbackFunc参数和返回值描述
class="table-box">
参数 参数描述 handle DevHandle类型,HDMI控制器句柄 callback 结构体指针,热插拔回调函数信息 返回值 返回值描述 HDF_SUCCESS 注册成功 负数 注册失败
注册热插拔检测回调函数示例:
static void HdmiHpdHandle ( void * data, bool hpd)
{
if ( data == NULL ) {
HDF_LOGE ( "priv data is NULL" ) ;
return ;
}
if ( hpd == true) {
HDF_LOGD ( "HdmiHpdHandle: hot plug" ) ;
} else {
HDF_LOGD ( "HdmiHpdHandle: hot unplug" ) ;
}
}
struct HdmiHpdCallbackInfo info = { 0 } ;
info. data = handle;
info. callbackFunc = HdmiHpdHandle;
ret = HdmiRegisterHpdCallbackFunc ( hdmiHandle, info) ;
if ( ret != HDF_SUCCESS) {
HDF_LOGE ( "HdmiRegisterHpdCallbackFunc: Register hpd callback func fail, ret:%d" , ret) ;
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
读取EDID
int32_t HdmiReadSinkEdid ( DevHandle handle, uint8_t * buffer, uint32_t len) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 4 HdmiReadSinkEdid参数和返回值描述
class="table-box">参数 参数描述 handle DevHandle类型,HDMI控制器句柄 buffer uint8_t类型指针,数据缓冲区 len uint32_t类型,数据长度 返回值 返回值描述 正整数 成功读取的原始EDID数据 负数或0 读取失败
读取Sink端的原始EDID数据示例:
int32_t len;
uint8_t edid[ HDMI_EDID_MAX_LEN] = { 0 } ;
len = HdmiReadSinkEdid ( hdmiHandle, edid, HDMI_EDID_MAX_LEN) ;
if ( len <= 0 ) {
HDF_LOGE ( "HdmiReadSinkEdid: hdmi read sink edid fail, len = %d." , len) ;
return HDF_FAILURE;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
设置音频属性
int32_t HdmiSetAudioAttribute ( DevHandle handle, struct HdmiAudioAttr * attr) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 5 HdmiSetAudioAttribute参数和返回值描述
class="table-box">参数 参数描述 handle DevHandle类型,HDMI控制器句柄 attr 结构体指针,音频属性 返回值 返回值描述 HDF_SUCCESS 设置成功 负数 设置失败
设置音频属性示例:
struct HdmiAudioAttr audioAttr = { 0 } ;
int32_t ret;
audioAttr. codingType = HDMI_AUDIO_CODING_TYPE_MP3;
audioAttr. ifType = HDMI_AUDIO_IF_TYPE_I2S;
audioAttr. bitDepth = HDMI_ADIO_BIT_DEPTH_16;
audioAttr. sampleRate = HDMI_SAMPLE_RATE_8K;
audioAttr. channels = HDMI_AUDIO_FORMAT_CHANNEL_3;
ret = HdmiSetAudioAttribute ( handle, & audioAttr) ;
if ( ret != HDF_SUCCESS) {
HDF_LOGE ( "HdmiSetAudioAttribute: hdmi set audio attribute fail!, ret:%d" , ret) ;
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
设置视频属性
int32_t HdmiSetVideoAttribute ( DevHandle handle, struct HdmiVideoAttr * attr) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 6 HdmiSetVideoAttribute参数和返回值描述
class="table-box">参数 参数描述 handle DevHandle类型,HDMI控制器句柄 attr 结构体指针,视频属性 返回值 返回值描述 HDF_SUCCESS 设置成功 负数 设置失败
设置视频属性示例:
struct HdmiVideoAttr videoAttr = { 0 } ;
int32_t ret;
videoAttr. colorSpace = HDMI_COLOR_SPACE_YCBCR444;
videoAttr. colorimetry = HDMI_COLORIMETRY_EXTENDED;
videoAttr. extColorimetry = HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM;
videoAttr. quantization = HDMI_QUANTIZATION_RANGE_FULL;
ret = HdmiSetVideoAttribute ( handle, & videoAttr) ;
if ( ret != HDF_SUCCESS) {
HDF_LOGE ( "HdmiSetVideoAttribute: hdmi set video attribute fail, ret:%d." , ret) ;
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
设置HDR属性
int32_t HdmiSetHdrAttribute ( DevHandle handle, struct HdmiHdrAttr * attr) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 7 HdmiSetHdrAttribute参数和返回值描述
class="table-box">参数 参数描述 handle DevHandle类型,HDMI控制器句柄 attr 结构体指针,HDR属性 返回值 返回值描述 HDF_SUCCESS 设置成功 负数 设置失败
设置HDR属性示例:
struct HdmiHdrAttr hdrAttr = { 0 } ;
int32_t ret;
hdrAttr. mode = HDMI_HDR_MODE_CEA_861_3;
hdrAttr. userMode = HDMI_HDR_USERMODE_DOLBY;
hdrAttr. eotfType = HDMI_EOTF_SMPTE_ST_2048;
hdrAttr. metadataType = HDMI_DRM_STATIC_METADATA_TYPE_1;
hdrAttr. colorimetry = HDMI_HDR_EXTENDED_COLORIMETRY_XV_YCC_709;
ret = HdmiSetHdrAttribute ( handle, & hdrAttr) ;
if ( ret != HDF_SUCCESS) {
HDF_LOGE ( "HdmiSetHdrAttribute: hdmi set hdr attribute fail, ret:%d" , ret) ;
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
设置HDMI声音图像消隐
int32_t HdmiAvmuteSet ( DevHandle handle, bool enable) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 8 HdmiAvmuteSet参数和返回值描述
class="table-box">参数 参数描述 handle DevHandle类型,HDMI控制器句柄 enable 布尔值,使能/去使能avmute 返回值 返回值描述 HDF_SUCCESS 设置成功 负数 设置失败
设置声音图像消隐示例:
int32_t ret;
ret = HdmiAvmuteSet ( hdmiHandle, true) ;
if ( ret != HDF_SUCCESS) {
HDF_LOGE ( "HdmiAvmuteSet: hdmi avmute set fail, ret:%d" , ret) ;
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
设置色彩深度
int32_t HdmiDeepColorSet ( DevHandle handle, enum HdmiDeepColor color) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 9 HdmiDeepColorSet参数和返回值描述
class="table-box">参数 参数描述 handle DevHandle类型,HDMI控制器句柄 color 枚举类型,色彩深度 返回值 返回值描述 HDF_SUCCESS 设置成功 负数 设置失败
设置色彩深度示例:
int32_t ret;
ret = HdmiDeepColorSet ( handle, HDMI_DEEP_COLOR_48BITS) ;
if ( ret != HDF_SUCCESS) {
HDF_LOGE ( "HdmiDeepColorSet: hdmi deep color set fail, ret:%d." , ret) ;
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
获取色彩深度
int32_t HdmiDeepColorGet ( DevHandle handle, enum HdmiDeepColor * color) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 10 HdmiDeepColorGet参数和返回值描述
class="table-box">参数 参数描述 handle DevHandle类型,HDMI控制器句柄 color 枚举类型指针,色彩深度 返回值 返回值描述 HDF_SUCCESS 获取成功 负数 获取失败
获取色彩深度示例:
enum HdmiDeepColor color;
int32_t ret;
ret = HdmiDeepColorGet ( handle, & color) ;
if ( ret != HDF_SUCCESS) {
HDF_LOGE ( "HdmiDeepColorGet: hdmi deep color get fail, ret:%d" , ret) ;
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
启动HDMI传输
int32_t HdmiStart ( DevHandle handle) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 11 HdmiStart参数和返回值描述
class="table-box">参数 参数描述 handle DevHandle类型,HDMI控制器句柄 返回值 返回值描述 HDF_SUCCESS 启动成功 负数 启动失败
启动HDMI传输示例:
int32_t ret;
ret = HdmiStart ( hdmiHandle) ;
if ( ret != HDF_SUCCESS) {
HDF_LOGE ( "HdmiStart: start transmission fail, ret:%d" , ret) ;
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
停止HDMI传输
int32_t HdmiStop ( DevHandle handle) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 12 HdmiStop参数和返回值描述
class="table-box">参数 参数描述 handle DevHandle类型,HDMI控制器句柄 返回值 返回值描述 HDF_SUCCESS 停止成功 负数 停止失败
停止HDMI传输示例:
int32_t ret;
ret = HdmiStop ( hdmiHandle) ;
if ( ret != HDF_SUCCESS) {
HDF_LOGE ( "HdmiStop: stop transmission fail, ret:%d." , ret) ;
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
注销热插拔检测回调函数
int32_t HdmiUnregisterHpdCallbackFunc ( DevHandle handle) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 13 HdmiUnregisterHpdCallbackFunc参数和返回值描述
class="table-box">参数 参数描述 handle DevHandle类型,HDMI控制器句柄 返回值 返回值描述 HDF_SUCCESS 注销成功 负数 注销失败
注销热插拔检测回调函数示例:
int32_t ret;
ret = HdmiUnregisterHpdCallbackFunc ( hdmiHandle) ;
if ( ret != HDF_SUCCESS) {
HDF_LOGE ( "HdmiUnregisterHpdCallbackFunc:unregister fail, ret:%d." , ret) ;
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
关闭HDMI控制器
void HdmiClose ( DevHandle handle) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 14 HdmiClose参数和返回值描述
class="table-box">参数 参数描述 handle DevHandle类型,HDMI控制器句柄
关闭HDMI控制器示例:
HdmiClose ( hdmiHandle) ;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
使用实例
本例程以操作开发板上的HDMI设备为例,详细展示HDMI接口的完整使用流程。
本例拟在Hi3516DV300开发板上对虚拟驱动进行简单的传输操作:
SOC:hi3516dv300。
HDMI控制器:使用0号HDMI控制器。
示例如下:
# include "hdmi_if.h"
# include "hdf_log.h"
# include "osal_time.h"
static void HdmiHpdHandle ( void * data, bool hpd)
{
if ( data == NULL ) {
HDF_LOGE ( "priv data is NULL" ) ;
return ;
}
if ( hpd == true) {
HDF_LOGD ( "HdmiHpdHandle: hot plug" ) ;
} else {
HDF_LOGD ( "HdmiHpdHandle: hot unplug" ) ;
}
}
static int32_t TestHdmiSetAttr ( DevHandle handle)
{
enum HdmiDeepColor color;
struct HdmiVideoAttr videoAttr = { 0 } ;
struct HdmiAudioAttr audioAttr = { 0 } ;
struct HdmiHdrAttr hdrAttr = { 0 } ;
int32_t ret;
ret = HdmiDeepColorSet ( handle, HDMI_DEEP_COLOR_48BITS) ;
if ( ret != 0 ) {
HDF_LOGE ( "HdmiDeepColorSet failed." ) ;
return ret;
}
ret = HdmiDeepColorGet ( handle, & color) ;
if ( ret != 0 ) {
HDF_LOGE ( "HdmiDeepColorGet failed." ) ;
return ret;
}
HDF_LOGE ( "HdmiDeepColorGet successful, color = %d." , color) ;
videoAttr. colorSpace = HDMI_COLOR_SPACE_YCBCR444;
videoAttr. colorimetry = HDMI_COLORIMETRY_EXTENDED;
videoAttr. extColorimetry = HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM;
videoAttr. quantization = HDMI_QUANTIZATION_RANGE_FULL;
ret = HdmiSetVideoAttribute ( handle, & videoAttr) ;
if ( ret != 0 ) {
HDF_LOGE ( "HdmiSetVideoAttribute failed." ) ;
return ret;
}
audioAttr. codingType = HDMI_AUDIO_CODING_TYPE_MP3;
audioAttr. ifType = HDMI_AUDIO_IF_TYPE_I2S;
audioAttr. bitDepth = HDMI_ADIO_BIT_DEPTH_16;
audioAttr. sampleRate = HDMI_SAMPLE_RATE_8K;
audioAttr. channels = HDMI_AUDIO_FORMAT_CHANNEL_3;
ret = HdmiSetAudioAttribute ( handle, & audioAttr) ;
if ( ret != 0 ) {
HDF_LOGE ( "HdmiSetAudioAttribute failed." ) ;
return ret;
}
hdrAttr. mode = HDMI_HDR_MODE_CEA_861_3;
hdrAttr. userMode = HDMI_HDR_USERMODE_DOLBY;
hdrAttr. eotfType = HDMI_EOTF_SMPTE_ST_2048;
hdrAttr. metadataType = HDMI_DRM_STATIC_METADATA_TYPE_1;
hdrAttr. colorimetry = HDMI_HDR_EXTENDED_COLORIMETRY_XV_YCC_709;
ret = HdmiSetHdrAttribute ( handle, & hdrAttr) ;
if ( ret != 0 ) {
HDF_LOGE ( "HdmiSetHdrAttribute failed." ) ;
return ret;
}
return 0 ;
}
static int32_t TestCaseHdmi ( void )
{
DevHandle handle = NULL ;
int32_t ret;
struct HdmiHpdCallbackInfo info = { 0 } ;
uint8_t data[ 128 ] = { 0 } ;
HDF_LOGD ( "HdmiAdapterInit: successful." ) ;
handle = HdmiOpen ( 0 ) ;
if ( handle == NULL ) {
HDF_LOGE ( "HdmiOpen failed." ) ;
return ret;
}
info. data = handle;
info. callbackFunc = HdmiHpdHandle;
ret = HdmiRegisterHpdCallbackFunc ( handle, & info) ;
if ( ret != 0 ) {
HDF_LOGE ( "HdmiRegisterHpdCallbackFunc failed." ) ;
return ret;
}
ret = HdmiReadSinkEdid ( handle, data, 128 ) ;
if ( ret <= 0 ) {
HDF_LOGE ( "HdmiReadSinkEdid failed." ) ;
return ret;
}
HDF_LOGE ( "HdmiReadSinkEdid successful, data[6] = %d, data[8] = %d." , data[ 6 ] , data[ 8 ] ) ;
ret = TestHdmiSetAttr ( handle) ;
if ( ret != 0 ) {
HDF_LOGE ( "TestHdmiSetAttr failed." ) ;
return ret;
}
ret = HdmiStart ( handle) ;
if ( ret != 0 ) {
HDF_LOGE ( "HdmiStart failed." ) ;
return ret;
}
OsalMSleep ( 1000 ) ;
ret = HdmiStop ( handle) ;
if ( ret != 0 ) {
HDF_LOGE ( "HdmiStop failed." ) ;
return ret;
}
ret = HdmiUnregisterHpdCallbackFunc ( handle) ;
if ( ret != 0 ) {
HDF_LOGE ( "HdmiUnregisterHpdCallbackFunc failed." ) ;
return ret;
}
HdmiClose ( handle) ;
return 0 ;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
如果大家想更加深入的学习 OpenHarmony(鸿蒙南向) 开发的全栈内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:
搭建开发环境 Windows 开发环境的搭建 Ubuntu 开发环境搭建 Linux 与 Windows 之间的文件共享 ……
构建子系统 启动流程 子系统 分布式任务调度子系统 分布式通信子系统 驱动子系统 ……
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙: 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:https://qr21.cn/FV7h05
data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/maniuT/article/details/141072133","extend1":"pc","ab":"new"}">>
id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type2" id="blog_extension">
class="extension_official" data-report-click="{"spm":"1001.2101.3001.6471"}" data-report-view="{"spm":"1001.2101.3001.6471"}">
class="blog_extension_card_left">
class="blog_extension_card_cont">
鸿蒙开发学习资料领取!!!
class="blog_extension_card_cont_r">
微信名片
评论记录:
回复评论: