OpenHarmony 适配HDMI接口声卡

高清多媒体接口(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声卡的适配步骤希望对您有所帮助。

如果大家想更加深入的学习 OpenHarmony 开发的内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:

OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……

系统架构分析:https://qr18.cn/CgxrRy

  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy

在这里插入图片描述

OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/657731.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【智能算法应用】灰狼算法GWO求解三维路径规划问题

目录 1.算法原理2.三维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法(GWO)原理及实现 2.三维路径规划数学模型 三维地形可以等效处理成山峰地形,数学模型为: z ( x , y ) h 0 ∑ j 1 N h j max ⁡…

升级鸿蒙4.2新变化,新增 WLAN 网络自动连接开关!

手机已经成为现代人生活中不可或缺的一部分,手机里的功能可以满足大部分人的生活场景,但是最依赖的应该就是手机网络,手机网络突然变差怎么办——消息发不出去?刷新闻速度变慢?仔细检查后,发现其实不是手机…

OrangePi Kunpeng Pro ——信创再接力

文章目录 OrangePi Kunpeng Pro ——信创再接力1. 绪论1.1 开箱 2. 硬件介绍2.1 硬件配置2.2 硬件清单 3. 网络测试3.1 有线连接3.2 WIFI连接 4.查看系统配置5. 安装常用软件5.1 安装python5.1.1 更换pip源为国内清华源 5.2 安装docker5.3 安装opencv5.4 安装dlib 6.CPU多进程能…

闲话 .NET(3):.NET Framework 的缺点

前言 2016 年,微软正式推出 .NET Core 1.0,并在 2019 年全面停止 .NET Framework 的更新。 .NET Core 并不是 .NET Framework 的升级版,而是一个从头开始开发的全新平台,一个跟 .NET Framework 截然不同的开源技术框架。 微软为…

计算属性与监听属性

【 1 】计算属性 计算属性大致就是这样 # 1 计算属性是基于它们的依赖进行缓存的# 2 计算属性只有在它的相关依赖发生改变时才会重新求值# 3 计算属性就像Python中的property,可以把方法/函数伪装成属性 # 计算属性本质上是一个函数,它们可以通过 get…

UML 在 vs-code上的快速使用

UML 在 vs-code上的快速使用 1.软件准备工作2.创建第一张甘特图2.1 创建 UML文件: xxxx. puml2.2 输入甘特图代码2.3 VS code 生成甘特图 结束 。 1.软件准备工作 使用的软件为:VS CODE使用插件 : PluntUML2.创建第一张甘特图 2.1 创建 UML文件: xxxx. …

基于python flask的疾病数据采集与可视化大屏,实现关联规则算法的治疗方法分析

背景 基于Python Flask的疾病数据采集与可视化大屏,旨在实现对疾病数据的采集、分析和可视化展示,为医疗领域提供决策支持和治疗方法分析。其中,关联规则算法被应用于治疗方法分析,旨在发现不同治疗方式之间的关联性和规律性&…

容器监控方案

1、docker部署prometheus Prometheus是一套开源的系统监控报警框架,它基于时序数据库,并通过HTTP协议周期性地从被监控的组件中抓取指标数据。以下是一些关于Prometheus的详细介绍: 基本概念:Prometheus所有采集的监控数据均以指…

阿里开源React应用动效解决方案:ant-motion

ant-motion:简化动效开发,提升用户体验 - 精选真开源,释放新价值。 概览 Ant Motion是由Ant Design团队精心打造,专为React应用设计的动画规范和组件库。它不仅仅是一套动画规范,更是一个完整的解决方案,旨…

[SCTF2019]Who is he

unity 游戏,直接输入字符串 直接修改 if 判断,看能不能直接输出flag 修改了程序逻辑,但还是输出了 明明已经把这个 if 删了 不知道为什么还会输出这串字符 应该程序还有什么引入吧,看 wp 应该先查一下程序的动态链接库 DLL 是…

探讨大米自动化生产线包装设备的智能化发展趋势

随着科技的飞速发展,智能化已经成为各行各业转型升级的重要方向。在大米生产领域,自动化生产线包装设备的智能化发展更是引领着粮食产业的未来潮流。星派将从智能化技术、市场需求、发展趋势等方面,探讨大米自动化生产线包装设备的智能化发展…

22.Volatile原理

文章目录 Volatile原理1.Volatile语义中的内存屏障1.1.volatile写操作的内存屏障1.1.1.StoreStore 屏障1.1.2.StoreLoad 屏障 1.2.volatile读操作的内存屏障1.2.1.LoadStore屏障1.2.2.LoadLoad屏障 2.volatile不具备原子性2.1.原理 Volatile原理 1.Volatile语义中的内存屏障 在…

多模态大模型:系统、趋势与问题

引言 多模态大模型是当今人工智能领域的热门方向之一。它不仅能处理文本,还能理解和生成图像、视频、语音等多种模态的数据。这种能力使得多模态大模型在自然语言处理、计算机视觉等多个领域展示出巨大的潜力和应用价值。那么,多模态大模型是如何训练出…

web自动化-数据驱动与失败用例截图、失败重新运行

因为只有失败的用例需要截图,那么问题就是: 什么时候用例会失败? 数据驱动测试 我们前面覆盖到的用例都是正常的用例,如果要测试异常的用例呢? 我们来写一下登录的异常 场景:【login_page】 # 用户输入框…

vivado设置Vscode为默认编辑器

D:\vscode\Microsoft VS Code\Code.exe -g [file name]:[line number]

开源大模型与闭源大模型:谁将引领AI的未来?

前言 在AI领域,开源大模型和闭源大模型一直并存,各自有其独特的优势和挑战。下面,我们将从数据隐私、商业应用和社区参与三个方向,对这两种模型进行深入探讨。 一、数据隐私 开源大模型: 1. 透明度高: …

YoloV8实战:各种图绘制汇总(mAP50、mAP50-95、loss、PR_curve、F1_curve)|科研必备|绘图神器

摘要 本文的内容是告诉大家如何绘制mAP50、mAP50-95、loss、PR_curve、F1_curve等图像,方便大家写论文。 绘制mAP50、mAP50-95、loss等图。 先上效果,如下图: 首先将,训练的result.csv汇总到一个文件夹下面(这样方便寻找),要不然找起来太麻烦。如下图: 我都放到re…

The Sandbox 和 Bitkub 联手增强东南亚元宇宙中心

作为去中心化游戏虚拟世界和区块链平台的先驱,The Sandbox 正与泰国领先的区块链网络 Bitkub Blockchain Technology Co., Ltd. 展开创新合作。双方合作的目的是将Bitkub元宇宙的影响力扩展到The Sandbox,建立一个元宇宙中心,向用户承诺从 Bi…

5.28学习总结

java复习总结 hashcode()和equals() hashcode():在Object里这个方法是通过返回地址的整数值来生成哈希值。 equals():在Object里这个方法是通过比较他们的内存地址来确定两个对象是否相同。 运行效率:hashcode的时间复杂度为O(1)(因为只要计算一次哈…

搜维尔科技:【系统集成案例】三面CAVE系统案例

用户名称:成都东软学院 主要产品:工业激光投影机、光学跟踪系统、主动立体眼镜、主动式立体眼镜发生器 在4米x9米的空间内,通过三通道立体成像,对立体模型进行数字化验证,辅助unity课程设计。 立体投影大屏方案采用的…