高清多媒体接口(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 驱动代码门路在 device\board\isoftstone\yangfan\kernel\hdf\drivers\audio 上面的 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_render YoungForYou.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
hdc file send E:\xxx.wav /data
HDMI 音频类设施插拔检测
进入 shell 端口进行一次 HDMI 设施插入、插入流程。
hdc shell# cd /data/# chmod +x audio_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 声卡的适配步骤心愿对您有所帮忙。