点击蓝字 ╳ 关注我们
开源项目 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_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 /datahdmi音频类设备插拔检测进入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声卡的适配步骤希望对您有所帮助。
原文标题:openharmony支持hdmi接口声卡适配说明
文章出处:【微信公众号:openatom openharmony】欢迎添加关注!文章转载请注明出处。
MSP430G2553的引脚功能详细图解
零跑C11成电动汽车行业的价格屠夫
中国制造突破新进展,TCL宣布将发布多款miniLED电视
iGameRTX2070Ultra评测 性能怎么样
贝塔射线扬尘监测仪助力城市空气质量改善
OpenHarmony支持HDMI接口声卡适配说明
铭普光磁推出低成本、双速率数据中心全系光模块产品
好用的国产开源Linux可视化管理工具悄然崛起!
一种新的单目视觉里程计深度学习系统
shell命令格式和特殊字符
【盘点】世界智能眼镜现状 带你领略高科技的浪潮
ADI光学传感器改善手势识别应用的可靠性
XR直播是什么?什么软件可以进行XR直播
输电线路可视化视频监测装置的功能特点
Facebook发巨资收购脑机技术公司,致力于开发增强现实智能眼镜
浅谈XUNWEI智能中控系统五大特性
怎么区分二极管的极性和正负?
当代用电行为大赏:有人心疼电费,有人靠屋顶光伏“理财”
中国手机纷纷强化创新研发,小米缺乏创新
荣耀V20采用麒麟980芯片并将搭载三大手机吓人技术