RK3568------Openharmony 3.2-Release 音频驱动

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中。
明确了目标,我的思路有如下:

  1. 单独交叉编译alsa-lib,将编译后的库打包进Openharmony文件系统
  2. 在Openharmony中添加部件,在Openharmony工程中交叉编译
  3. 因为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

六、遇到的问题

  1. 设备树添加功放控制引脚无效
    因为我的板子接了一个功放的芯片,因此需要再播放之前控制使能一路引脚来放音,参考瑞芯微的手册:

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"


总结

本人之前一直从事应用开发,借着这次电鸿的契机进行系统级开发的学习,将我在工作中的遇到的问题及解决思路记录并分享,希望可以与诸君共勉
目前网上技术讨论群大都是鸿蒙的应用开发,总结此类文章也是希望将同样进行鸿蒙设备开发的同僚召集到一起,一起讨论学习。如果有同样在进行鸿蒙设备开发的朋友,可以加我的联系方式,期待您的消息
个人微信

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值