RK3568------Openharmony 3.2-Release 音频驱动
文章目录
前言
Openharmony 3.2-release版本中RK3568的音频应用,我在实际测试中发现音乐播放器UI是可用的,但实际上该应用并没有调用ADM音频框架(OHOS)接口来录放音。现在我需要测试板子的音频放音功能,只能考虑使用Linux的高级音频框架------ALSA
一、设备树配置
要想使用ALSA进行音频测试,就要先实现linux音频驱动,前文《RK3568------Openharmony 3.2-Release 板级移植》中提到,我目前使用的是飞凌OK3568-C核心板,因此我是在此设备的设备树文件上进行修改。
OK3568-C-common.dtsi
codec 节点配置
rk809_codec: codec {//RK809是挂载在I2C0上的
#sound-dai-cells = <0>;
compatible = "rockchip,rk809-codec", "rockchip,rk817-codec";
clocks = <&cru I2S1_MCLKOUT>;
clock-names = "mclk";
assigned-clocks = <&cru I2S1_MCLKOUT>, <&cru I2S1_MCLK_TX_IOE>;
assigned-clock-rates = <12288000>;
assigned-clock-parents = <&cru I2S1_MCLKOUT_TX>, <&cru I2S1_MCLKOUT_TX>;
pinctrl-names = "default";
pinctrl-0 = <&i2s1m0_mclk>;
hp-volume = <20>;
spk-volume = <3>;
mic-in-differential;
use-ext-amplifier;
spk-ctl-gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_HIGH>;
status = "okay";
sound 节点配置
rk809_sound: rk809-sound {
status = "okay";
compatible = "rockchip,multicodecs-card";
rockchip,card-name = "rockchip-rk809";
hp-det-gpio = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>;
rockchip,format = "i2s";//设置声卡协议格式为 i2s 标准格式
rockchip,mclk-fs = <256>;//默认情况下,mclk 为采样率的 256 倍
rockchip,cpu = <&i2s1_8ch>;
rockchip,codec = <&rk809_codec>;//设置CODEC为rk809 codec
pinctrl-names = "default";
pinctrl-0 = <&hp_det>;
};
注释部分是我个人对设备参数的理解,有不对的地方请大家评论区指点
二、内核配置
如果要使用SOUND驱动,内核配置需要配置相关宏如下:
ok3568_defconfig:
CONFIG_SND_SOC_RK817=y
CONFIG_SOUND=y
CONFIG_SND=y
#CONFIG_DRIVERS_HDF_AUDIO is not set
#CONFIG_DRIVERS_HDF_AUDIO_RK3568 is not set
看到这里有人会有疑问,就是设备树配置的是codec rk809,,但是内核配置是codec rk817,这里实际上是因为内核源码做了兼容,所以内核配置项配置rk817 codec
三、ALSA音频框架
前言提到,因为目前openharmony3.2-release的RK3568音频应用不支持我的测试需求,所以我决定采用ALSA框架
1. ALSA概述
ALSA 是 Advanced Linux Sound Architecture(高级的 Linux 声音体系)的缩写,目前已经成为了 linux下的主流音频体系架构,提供了音频和 MIDI 的支持,替代了原先旧版本中的 OSS(开发声音系统);ALSA 是 Linux 系统下一套标准的、先进的音频驱动框架,那么这套框架的设计本身是比较复杂的,采用分离、分层思想设计而成。
2. ALSA框架结构
ALSA架构主要有两方面组成:
Linux内核空间的ALSA驱动,在Linux内核2.6之后,ALSA驱动代码已经集成到Linux源码中。
Linux用户空间的ALSA库和程序:alsa-lib、alsa-utils、alsa-tools、alsa-firmware、alsa-plugins、alsa-oss、pyalsa。
alsa-lib 是一套 Linux 应用层的 C 语言函数库,为音频应用程序开发提供了一套统一、标准的接口,应用程序只需调用这一套 API 即可完成对底层声卡设备的操控,譬如播放与录音。
用户空间的 alsa-lib 对应用程序提供了统一的 API 接口,这样可以隐藏驱动层的实现细节,简化了应用程序的实现难度、无需应用程序开发人员直接去读写音频设备节点。所以对于我们来说,学习音频应用编程其实就是学习 alsa-lib 库函数的使用、如何基于 alsa-lib 库函数开发音频应用程序。
四、ALSA-LIB库安装
根据上文的介绍,我们可以了解,我们想要测试我们的音频,实际上就是对alsa-lib的使用。因此我的目标就是如何将alsa-lib库安装进Openharmony 3.2-release中。
明确了目标,我的思路有如下:
- 单独交叉编译alsa-lib,将编译后的库打包进Openharmony文件系统
- 在Openharmony中添加部件,在Openharmony工程中交叉编译
- 因为alsa-lib属于常规库,查看Openharmony的三方库,是否支持
根据以上3个思路,我优先考虑第3个方案,查看//third_party,果然是有相关库的,因此只需在厂商文件夹下,将库添加进工程即可(我是将该库添加到"module_list")
//vendor/hihope/rk3568/ohos.build
看到这里有人会有疑问,我们不是要安装alsa-lib吗,为什么最后是alsa-utils?首先后面我们需要用到调试音频工具amixer是在untils中,其次是alsa-utils依赖alsa-lib,在alsa-untils的工程配置文件中,已经编译过了alsa-lib,也就是说安装alsa-utils的同时,已经默认安装了alsa-lib
五、效果展示
1.查询支持的驱动类型
amixer controls
2.获取Playback Path的源
amixer cget numid=1,iface=MIXER,name=‘Playback Path’
这里我们选择直接输出,所以选择SPK
3.设置输出的流
amixer cset numid=1,iface=MIXER,name=‘Playback Path’ 3
4.放音
aplay /system/etc/dynamic.wav
六、遇到的问题
- 设备树添加功放控制引脚无效
因为我的板子接了一个功放的芯片,因此需要再播放之前控制使能一路引脚来放音,参考瑞芯微的手册:
Documentation/devicetree/bindings/sound/rockchip,rk817-codec.txt
- compatible: "rockchip,rk817-codec"
- - clocks: a list of phandle + clock-specifer pairs, one for each entry inclock-names.
- - clock-names: should be "mclk".
- - spk-ctl-gpios: spk mute enable/disable 用于外置功放使能脚,如果产品上有使用外置功放,请配置对应的使能脚
- - hp-ctl-gpios: hp mute enable/disable
- - spk-mute-delay-ms: spk mute delay time
- - hp-mute-delay-ms: hp mute delay time
- - spk-volume: DAC L/R volume digital setting for Speaker 配置喇叭输出音量,0 最大,255 最小
- - hp-volume: DAC L/R volume digital setting for Headphone 配置耳机输出音量,0 最大,255 最小
*
* DDAC L/R volume setting
* 0db~-95db,0.375db/step,for example:
* 0: 0dB
* 10: -3.75dB * 125: -46dB
* 255: -95dB
*
- capture-volume: ADC L/R volume digital setting for Microphone 配置录音输入音量,0 最大,255 最小
*
* DADC L/R volume setting
* 0db~-95db,0.375db/step,for example:
* 0: 0dB * 10: -3.75dB
* 125: -46dB * 255: -95dB
*
- mic-in-differential:
Boolean. Indicate MIC input is differential, rather than single-ended.
指定使用差分 MIC,否则为单端 MIC,所以使用差分 MIC 时加上此 property。
- pdmdata-out-enable:
Boolean. Indicate pdmdata output is enabled or disabled.
录音数据使用 PDM 数字接口。
- use-ext-amplifier:
Boolean. Indicate use external amplifier or not.
指定是否使用外部功放。 -
adc-for-loopback:
Boolean. Indicate adc use for loopback or not. 指定 ADC 用于回采,一般音箱类产品使用。
我在设备中添加了一条属性"spk-ctl-gpios",在实际放音测试中,没有声音,我在测量了该控制引脚后,发现放音过程中,并没有拉高,重新查看手册,发现没有控制引脚生效的原因是没有添加属性"use-ext-amplifier"
总结
本人之前一直从事应用开发,借着这次电鸿的契机进行系统级开发的学习,将我在工作中的遇到的问题及解决思路记录并分享,希望可以与诸君共勉
目前网上技术讨论群大都是鸿蒙的应用开发,总结此类文章也是希望将同样进行鸿蒙设备开发的同僚召集到一起,一起讨论学习。如果有同样在进行鸿蒙设备开发的朋友,可以加我的联系方式,期待您的消息
个人微信