0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony支持HDMI接口声卡适配说明

OpenAtom OpenHarmony 来源:未知 2023-05-23 07:05 次阅读

点击蓝字 ╳ 关注我们


开源项目 OpenHarmony
是每个人的 OpenHarmony

陈甲印

鸿湖万联资深技术专家

鸿湖万联产品推荐


高清多媒体接口(High Definition Multimedia Interface,HDMI )是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。HDMI可用于机顶盒、DVD播放机、个人计算机、电视、游戏主机、综合扩大机、数字音响与电视机等设备。HDMI可以同时发送音频和视频信号,由于音频和视频信号采用同一条线材,大大简化系统线路的安装难度。这块是百度百科对HDMI的简单介绍,我们再看看HDMI不同版本对音频的支持情况:


当前我们使用最多的是2.0版本,本文介绍了OpenHarmony系统支持HDMI声卡的适配过程,带有HDMI声卡的设备包括电视、投影仪和一些带有音响的显示器。

1 功能描述

OpenHarmony系统中音频系统使用ADM框架,下面是ADM框架的组成:


ADM框架是基于HDF系统框架开发,Card Manager是用来管理多个声卡链表,Controller是声卡的控制模块包含了音量、静音、通路选择等控制功能。
Audio Control Dispath是控制功能的中转站负责接收HDI下发的控制命令和将控制命令转发给各个声卡组件。Audio Stream Dispatch是数据流的中转站,播放过程中负责接收HDI的数据流,在录音过程中负责上传声卡的录音数据流。
Run Time Device中包括的这些模块就是一个声卡工作需要的驱动服务。其中codec编解码模块驱动服务、dai数字音频接口驱动服务和platform片上系统也就是DMA模块驱动服务是大多数声卡所必须的。
HDMI声卡和其他声卡一样由三个模块组成codec编解码模块、dai数字音频接口和platform片上系统也就是DMA模块。HDMI的codec是集成在HDMI转换芯片内部的我们只需要将PCM音频流给到HDMI转换芯片就可以。DAI这块使用的是I2S总线连接HDMI芯片和platform。要实现对HDMI声卡的支持,就需要将这几个模块的驱动注册到ADM框架中。
本文基于3月1日的OpenHarmony master分支进行介绍。基于yangfan平台介绍,如适配其他平台相关配置根据具体平台进行修改。
OpenHarmony系统支持HDMI声卡的插拔识别,支持HDMI声卡的播放功能,包括启动、停止、暂停、恢复功能。

2 准备工作

2.1 查询物理连接

这是一个HDMI设备模块的逻辑试图,图中可以看到音频数据可以通过两种接口I2S或者SPIDIF将音频数据传给HDMI设备,此处我们使用的是I2S总线。


首先需要查看芯片手册HDMI模块和SOC是如何连接的,找到音频数据传输相应的I2S总线,这块是更具rk3568芯片查到的数据,I2S0连接的是HDMI。


2.2 查询寄存器地址
因为我们使用I2S总线就要对其进行配置所以我们需要找到I2S总线的基地址和I2S总线的寄存器说明。查看芯片手册找到I2S总线对应的寄存器基地址。


3 代码介绍

HDMI的驱动codec的代码ADM框架中已经实现了,我们只需要根据不同的单板平台修改平台下面的配置文件。Dai和platform的驱动代码需要根据各自平台自行开发。yangfan开发板Dai和platform驱动代码路径在deviceoardisoftstoneyangfankernelhdfdriversaudio下面的dai和soc目录下面。
涉及到的配置文件如下:
vendor/isoftstone/yangfan/hdf_config/khdf/audio$ tree
├── audio_config.hcs   // 此配置文件配置声卡信息
├── codec_config.hcs // 此配置文件配置codec信息
├── dai_config.hcs // 此配置文件配置dai信息
└── dma_config.hcs // 此配置文件配置platform信息
vendor/isoftstone/yangfan/hdf_config/khdf/device_info/
device_info.hcs//此配置文件配置声卡驱动服务信息
修改涉及的代码仓:device_board_hihope、vendor_isoftstone和kernel_linux_config

4 构建开关

OpenHarmony系统要支持HDMI声卡首先要打开构建开关:在文件kernel/linux/config/linux-5.10/arch/arm64/configs/rockchip_standard_defconfig
添加:CONFIG_DRIVERS_HDF_AUDIO_HDMI=y

5 功能配置

HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。

5.1 配置文件:device_info.hcs 添加hdmi声卡节点信息。
文件路径:
vendor/isoftstone/yangfan/hdf_config/khdf/device_info/
HDMI声卡插入后系统会根据此处配置的声卡节点加载HDMI声卡驱动。
        audio :: host {
hostName = "audio_host";
priority = 110;
device_dai :: device {...
device_hdmi :: deviceNode {
policy = 1;
priority = 50;
preload = 0;
permission = 0666;
moduleName = "DAI_RK3568";
serviceName = "hdmi_dai_service";
deviceMatchAttr = "hdf_hdmi_dai_driver";
}
}
device_codec :: device {...
device_hdmi :: deviceNode {
policy = 1;
priority = 50;
preload = 0;
permission = 0666;
moduleName = "AUDIO_HDMI_CODEC";
serviceName = "codec_service_1";
deviceMatchAttr = "hdf_codec_driver_1";
}
...
}
...
device_dma :: device {...
device_hdmi :: deviceNode {
policy = 1;
priority = 50;
preload = 0;
permission = 0666;
moduleName = "DMA_RK3568";
serviceName = "hdmi_dma_service_0";
deviceMatchAttr = "hdf_hdmi_dma_driver";
}
...
}


device_audio :: device {...
device_hdmi :: deviceNode {
policy = 2;
priority = 60;
preload = 2;
permission = 0666;
moduleName = "HDF_AUDIO";
deviceMatchAttr = "hdf_audio_driver_1";
serviceName = "hdf_audio_codec_hdmi_dev0";
}
...
}
...
}
moduleName 配置组件名称,和驱动代码中的moduleName相对应,系统会根据此名称加载驱动。
deviceMatchAttr私有配置的属性名称,根据此名称可以找到相应的私有配置。
serviceName驱动服务名称,根据此名称可以使用对应的驱动。
preload 配置加载方式,2为动态加载,当HDMI声卡插入时加载HDMI声卡驱动。
此文件中首先配置了文件首先先配置了HDMI的dai、codec和dma驱动服务,最后配置了HDMI声卡设备。

5.2 配置文件:audio_config.hcs 添加hdmi声卡服务信息。
文件路径:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此处配置一个HDMI声卡驱动包括哪些驱动服务。
root {
platform {
...
controller_0x120c1001 :: card_controller {
match_attr = "hdf_audio_driver_1";
serviceName = "hdf_audio_codec_hdmi_dev0";
codecName = "codec_service_1";
platformName = "hdmi_dma_service_0";
cpuDaiName = "hdmi_dai_service";
codecDaiName = "hdmi_codec_dai";
}
...
}
}
card_controller配置项根据声卡包含的驱动服务进行配置,不同声卡包含的驱动服务可能不同,HDMI声卡包含platform、dai和codec所以需要配置codecName codec驱动服务名称,platformName platform驱动服务名称、cpuDaiName platform侧dai服务名称、codecDaiName codec侧驱动服务名称。
match_attr配置项名称和HDMI声卡设备的私有配置名称相匹配,声卡设备可以根据这个私有配置找到声卡对应的codec、dai、platform驱动服务。
serviceName HDMI声卡服务名称,声卡加载成功后会生成/dev/hdf_audio_codec_hdmi_dev0结点。

5.3 配置文件:dma_config.hcs 添加HDMI声卡硬件信息。
文件路径:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此文件配置和HDMI声卡连接的SOC侧的DMA信息。具体信息可以通过查看cpu芯片手册得到。
root {
platform {
template dma_controller {
match_attr = "";
serviceName = "";
}
...
controller_0x120c1011 :: dma_controller {
match_attr = "hdf_hdmi_dma_driver";
serviceName = "hdmi_dma_service_0";


idInfo {
chipName = "/i2s@fe400000"; // 根据hdmi驱动芯片连接的I2S总线地址进行配置
chipIdRegister = 0xfe400000; // 根据hdmi驱动芯片连接的I2S总线地址进行配置
chipIdSize = 0x1000;
}
regConfig {
daiStartupSeqConfig = [
0x00, 0x00, 0, 0, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0x0, //Transmit Operation Init
];
}
}
}
}
此文件配置了HDMI声卡使用的dma信息。
match_attr配置项名称和HDMI声卡设备的dma服务私有配置名称相匹配。serviceName HDMI声卡dma驱动服务名称需要和device_info配置文件中HDMI声卡的dma驱动服务名称相同。
HDMI模块只需要配置idInfo配置项信息,其他配置项HDMI模块未使用。

5.4 配置文件:dai_config.hcs 添加HDMI声卡硬件信息。
文件路径:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此文件配置和HDMI声卡连接的SOC侧的i2s信息。具体信息可以通过查看cpu芯片手册得到。
root {
platform {
template dai_controller {
match_attr = "";
serviceName = "";
}
...
controller_0x120c1021 :: dai_controller {
match_attr = "hdf_hdmi_dai_driver";
serviceName = "hdmi_dai_service";


idInfo {
chipName = "/i2s@fe400000"; // 根据hdmi驱动芯片连接的I2S总线地址进行配置
chipIdRegister = 0xfe400000; // 根据hdmi驱动芯片连接的I2S总线地址进行配置
chipIdSize = 0x1000;
}
regConfig {
daiStartupSeqConfig = [
0x00, 0x00, 0, 0, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0x0, //Transmit Operation Init
];
}
}
}
}
此文件配置了HDMI声卡使用的dai信息。match_attr配置项名称和HDMI声卡设备的dai服务私有配置名称相匹配。serviceName HDMI声卡dai驱动服务名称需要和device_info配置文件中HDMI声卡的dai驱动服务名称相同。
chipIdRegister HDMI驱动芯片连接的I2S总线地址,此信息可以通过cpu的芯片手册获取。
chipIdSize物理地址映射的虚拟地址大小。

5.5 配置文件:codec_config.hcs 添加HDMI声卡硬件信息。
文件路径:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此文件配置HDMI声卡信息。由于HDMI声卡只支持播放,此处只配置了播放的参数信息。
root {
platform {
template codec_controller {
match_attr = "";
serviceName = "";
codecDaiName = "";
}
...
controller_0x120c1031 :: codec_controller {
match_attr = "hdf_codec_driver_1";
serviceName = "codec_service_1";
codecDaiName = "hdmi_codec_dai";


hwInfo = [
/*
Playback/Captrue, formats, rates, rate_min, rate_max, channels_min, channels_max,
buffer_bytes_max, period_bytes_min, period_bytes_max, periods_min, periods_max
*/
1, 0xF, 0xFF, 8000, 96000, 1, 2, 1, 2, 3, 4, 5
];
}
...
}
此文件配置了HDMI声卡使用的codec信息。
match_attr配置项名称和HDMI声卡设备的codec服务私有配置名称相匹配。serviceName HDMI声卡codec驱动服务名称需要和device_info配置文件中HDMI声卡的codec驱动服务名称相同。
codecDaiName HDMI声卡使用的codec dai的设备名称,此处名称需要和audio_config配置文件中的codecDaiName名称相同。
hwInfo配置声卡的信息,包括声卡播放和录音支持的格式、采样率范围、通道范围、缓存buffer最大值、每个周期的字节范围、周期的范围。第一个配置项Playback对应的值为1,Captrue对应的值为2。其他配置项没有使用。
HDMI声卡只支持播放,这里只配置了播放,有些参数没有生效可以随便配置。

6 应用样例

audio_sample_render是用来测试录音功能的工具,audio_sample_capture是用来测试播放功能的工具,audio_sample_event是用来检测USB插拔事件上报的工具。这两个工具可以通过编译得到,编译命令如下:
./build.sh --product-name yangfan -T audio_sample_render -T audio_sample_capture -T audio_sample_event
hdc shell
cd /data/
./audio_sample_renderYoungForYou.wav

7 功能验证

使用hdc工具推送audio_sample_render和audio_sample_event和wav音频文件到开发板data目录下:
hdc file send E:audio_sample_render /data
hdc file send E:audio_sample_event /data
hdcfilesendE:xxx.wav/data
HDMI音频类设备插拔检测
进入shell端口进行一次HDMI设备插入、拔出流程。
hdc shell
#cd/data/#chmod+xaudio_sample_event#./audio_sample_event
插入打印:
===============================================================================
@@@@@ serviceName: audio_hdi_pnp_service
@@@@@ deviceClass: 32
@@@@@ status : 1
@@@@@ info : EVENT_TYPE=0x1;DEVICE_TYPE=0x400
===============================================================================
拔出打印:
===============================================================================
@@@@@ serviceName: audio_hdi_pnp_service
@@@@@ deviceClass: 32
@@@@@ status : 1
@@@@@ info : EVENT_TYPE=0x2;DEVICE_TYPE=0x400
===============================================================================
HDMI音频类设备放音
进入shell端口进行一次完整的播放、停止、退出流程。
hdc shell
# cd /data/# chmod +x audio_sample_render## ./audio_sample_render YoungForYou.wav
==================== Loading Mode ===================
| 1. Passthrough Loading |
| 2. IPC Loading |
======================================================
Please enter your choice:
2
================= Select Audio Card ==================
1. primary
2. primary1
3. hdmi
4. usb
5. a2dp
======================================================
Please enter your choice:
3
================== Play Render Menu ==================
| 1. Render Start |
| 2. Render Stop |
| 3. Render Resume |
| 4. Render Pause |
| 5. Render SetVolume |
| 6. Render GetGain |
| 7. Render SetMute |
| 8. Render SetAttributes |
| 9. Render SelectScene |
| 10. Render getEXtParams |
| 11. Render getMmapPosition |
| 12.Exit |
======================================================
your choice is:
1
Music channels = 2
Music Rate = 44100 Hz
Music Bit = 16 bit
============= Play Render Mode ==========
| 1. Render non-mmap |
| 2. Render mmap |
========================================
Please enter your choice:
1
Start Successful,Music is playing
================== Play Render Menu ==================
| 1. Render Start |
| 2. Render Stop |
| 3. Render Resume |
| 4. Render Pause |
| 5. Render SetVolume |
| 6. Render GetGain |
| 7. Render SetMute |
| 8. Render SetAttributes |
| 9. Render SelectScene |
| 10. Render getEXtParams |
| 11. Render getMmapPosition |
| 12.Exit |
======================================================
your choice is:
2
Stop Successful
================== Play Render Menu ==================
| 1. Render Start |
| 2. Render Stop |
| 3. Render Resume |
| 4. Render Pause |
| 5. Render SetVolume |
| 6. Render GetGain |
| 7. Render SetMute |
| 8. Render SetAttributes |
| 9. Render SelectScene |
| 10. Render getEXtParams |
| 11. Render getMmapPosition |
| 12.Exit |
======================================================
your choice is:
12

8 总结

本文没有介绍HDMI声卡codec驱动的具体实现,代码路径drivers/hdf_core/framework/model/audio/hdmi。平台适配支持HDMI声卡可以不用关注驱动的具体实现。
支持HDMI声卡是OpenHarmony系统使用中不可或缺的一部分,是OpenHarmony系统用于投影仪、电视显示和生活场景的重要功能,本文介绍了OpenHarmony系统支持HDMI声卡的适配步骤希望对您有所帮助。



原文标题:OpenHarmony支持HDMI接口声卡适配说明

文章出处:【微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    57

    文章

    2398

    浏览量

    43133
  • OpenHarmony
    +关注

    关注

    25

    文章

    3753

    浏览量

    16718

原文标题:OpenHarmony支持HDMI接口声卡适配说明

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    HDMI Forum发布HDMI 2.2接口规范

    2.2接口规范的推出,为电视、电影和游戏工作室等内容制作商提供了更高质量的选择。随着高清内容的不断普及,用户对音视频质量的要求也越来越高。HDMI 2.2接口规范不仅满足了这一需求,还支持
    的头像 发表于 01-07 10:54 362次阅读

    HDMI接口类型有哪些 HDMI接口与DisplayPort接口的比较

    HDMI(High-Definition Multimedia Interface,高清晰度多媒体接口)是一种用于传输高清视频和音频的接口标准。以下是一些常见的HDMI
    的头像 发表于 11-27 14:22 1171次阅读

    HDMI接口支持哪些视频分辨率

    HDMI(High-Definition Multimedia Interface)接口支持的视频分辨率因版本不同而有所差异。以下是HDMI接口
    的头像 发表于 11-27 14:14 4456次阅读

    HDMI接口的作用和功能 HDMI接口与VGA接口的区别

    HDMI接口的主要作用和功能: 高清视频传输 :HDMI接口能够传输高分辨率的视频信号,支持多种视频格式,包括1080p、4K、8K等。
    的头像 发表于 11-27 14:12 1871次阅读

    dp接口适配器常见问题及解决方案

    设备不支持DP接口,或者在连接时出现兼容性问题。 解决方案: 确认设备的DP接口版本是否匹配。不同版本的DP接口可能存在兼容性问题。 使用转换器或
    的头像 发表于 11-15 14:42 2432次阅读

    dp接口适配器与HDMI的区别

    , Inc.(HDMI LA)负责制定标准。HDMI接口最初是为了取代传统的模拟视频接口而设计的,它能够传输高清视频和音频信号,支持多种分辨
    的头像 发表于 11-15 14:38 492次阅读

    dp接口适配器如何连接显示器

    在现代显示技术中,DP接口因其高速数据传输能力和对高分辨率视频的支持而越来越受欢迎。然而,并非所有的显示器和图形输出设备都配备了DP接口。 DP接口
    的头像 发表于 11-15 14:34 1075次阅读

    VGA转HDMI适配器使用指南

    Multimedia Interface)接口的普及,越来越多的设备开始支持HDMI。 什么是VGA转HDMI适配器 VGA转
    的头像 发表于 11-08 10:01 2306次阅读

    VGA接口HDMI接口的区别

    器和图形适配器而设计的。VGA接口使用15针脚的D-sub连接器,支持模拟信号传输。 HDMI接口H
    的头像 发表于 11-08 09:59 2578次阅读

    dp接口hdmi接口的区别

    在现代显示技术中,DP(DisplayPort)和HDMI(High-Definition Multimedia Interface)接口是连接显示器和视频源的标准接口。它们都支持高分
    的头像 发表于 10-30 13:37 1682次阅读

    主板声卡HDMI屏蔽了怎么办

    主板声卡HDMI屏蔽了,通常是指在连接HDMI音频输出设备(如显示器、电视等)时,系统自动将音频输出切换到HDMI设备,导致主板上的集成声卡
    的头像 发表于 08-20 15:15 2378次阅读

    USB声卡支持SPDIF格式吗

    高质量的音频信号。那么,USB声卡是否支持SPDIF格式呢? USB声卡的基本概念 USB声卡是一种通过USB接口传输音频信号的设备,它具有
    的头像 发表于 08-20 15:07 868次阅读

    HDMI光纤线缆支持对接头吗

    HDMI光纤线缆支持对接头,但具体支持的对接头类型和规格可能会因线缆型号、品牌和接口版本的不同而有所差异。 HDMI线是一种高清晰多媒体
    的头像 发表于 06-24 10:27 756次阅读

    HDMI接口和DVI接口有什么区别

    接口有单链路(18针)和双链路(24针)两种模式。 传输速率: HDMI接口的传输速率随版本升级而提高。HDMI 1.3支持5Gbps,
    的头像 发表于 06-17 10:28 3836次阅读

    hdmi是什么接口连接显示器

    HDMI接口,全称“高清多媒体接口”,是一种全数字化视频以及声音发送接口,能够发送未压缩的音频和视频信号。HDMI
    的头像 发表于 04-19 10:19 1541次阅读