5.1 px30 - rt5640音频驱动

写在前面

这一章节主要是介绍px30移植5640驱动的过程,实现的目标如下
1 rt5640驱动移植
2 alsa通路配置
3 alsa通路保存默认配置信息
如果对alsa框架想详细了解可以参考这位大神的博客。

https://www.cnblogs.com/xinghuo123/category/1786302.html

ALSA代码架构

kernel/sound

目录内容
/aoa苹果主板驱动
/armarm架构相关驱动
/atmelatmel设备驱动
/core该目录包含了ALSA驱动的中间层,它是整个ALSA驱动的核心部分
/drivers不同架构中一些驱动共享文件放置一些与CPU、BUS架构无关的公用代码
/i2cALSA自己的I2C控制代码
/isaisa声卡的上层模块
/mipsMIPS声卡设备驱动
/oosoos架构
/pariscgsc声卡驱动
/pcipci声卡
/ppcpowerPC架构有关
/shSUPERH声卡驱动
/socsystem-on-chip
/sparcSparc声卡驱动
/synthsynth中间层
/usbusb-audio驱动

名词解释:
CPU DAI : 主控端的 Audio Data Interface,比如 I²S,Spdif,Pdm,Tdm (就是通常所说的platform层)
CODEC DAI:即 Codec (通常所说的codec层)
DAI_LINK : 绑定 Cpu_Dai 和 Codec_Dai 为一个声卡,等同于 Machine Driver (platform
层)。
DMAENGINE:用于 Cpu 和 I²S/Spdif 等 Dai 之间的 Dma 传输引擎,实际是通过 Dma
来进行数据的搬运。
DAPM:动态音频电源管理,用于动态管理 Codec 等的电源管理,根据通路的开启配置开
关,以达到保证功能的前提下功耗尽量小。
JACK:耳机的接口检测,大部分使用 Codec 自身的检测机制,小部分使用 IO 来进行模拟。

在这里插入图片描述
在这里插入图片描述
目录层级结构

框架代码
codec层kernel/sound/soc/codecs/rt5640.c
platfrom层
MachineDriver 层 kernel/sound/soc/rockchip/rockchip_px30_rt5640.c

重要概念

DAPM
DAPM是Dynamic Audio Power Management的缩写,直译过来就是动态音频电源管理的意思,DAPM是为了使基于linux的移动设备上的
音频子系统,在任何时候都工作在最小功耗状态下。DAPM对用户空间的应用程序来说是透明的,所有与电源相关的开关都在ASoc core
中完成。用户空间的应用程序无需对代码做出修改,也无需重新编译,DAPM根据当前激活的音频流(playback/capture)和声卡中的
mixer等的配置来决定那些音频控件的电源开关被打开或关闭。

a Kcontrol

一个kcontrol代表着一个mixer(混音器),或者是一个mux(多路开关),又或者是一个音量控制器等等

b widget

可以理解为对kcontrol的进一步升级和封装,同样指音频系统中的某个部件,如mixer,mux;

c route

一个路径的连接至少包含以下几个元素:起始端widget,跳线path,到达端widget,其实route就是连接起各个widget

可以看出,这三大组件的关系是由点及面的。

工具使用

我的linux系统中自带了aplay arecord amixer 使用这个测试,不详细介绍工具的使用了,网上资料太多了,只是介绍个简单的用法

amixer 的用法

总结来说就是
amixer controls 查看命令
amixer cget 得到命令
amixer cset 设置命令

重点是分析下音频流如何打开,并且流向自己想要的方向

arecord

arecord -D hw:0,0 -d 10 -f dat -t wav test.wav

-D :指定声卡
-d: 指定录制时间
-f : 指定音频格式
-t :指定录制文件格式

aplay

aplay play.wav

alsactrl

保存设置

alsactl store

恢复设置

alsactl restore

要实现所有的通路 ,可以打开之后,使用alsactl store 保存配置,默认路径在:/var/lib/alsa/asound.state 之后开机时通过将alsactl restore写入脚本恢复

如何设置通路

重难点再次,根据官方手册,讲解一下如何配置通路。

1 确认出入口

先看一下原理图,将收音和放音的设备接到哪里,即先确认下这张图的入口和出口
在这里插入图片描述
我就以入口是IN2P 出口为SPORP为例,说明一下通路配置

2 mic通路

步骤 根据mx-[n] 查找rtl5640.h 然后查找相应的Kcontrol 或者route
在这里插入图片描述

amixer cset name="RECMIXL BST2 Switch" 1 #MX-3C[1]
amixer cset name="Stereo ADC MIXL ADC1 Switch" 1 #MX-27[14]
amixer cset name="ADC Capture Switch" 1 #MX-1C[15]

amixer cset name="RECMIXR OUT MIXR Switch" 1 # MX-3E[0]

3 speaker通路

在这里插入图片描述

amixer cset name="DAI select" 0 
amixer cset name='DAC MIXR INF1 Switch' 1  #MX-29 [6]
amixer cset name="Stereo DAC MIXR DAC R1 Switch" 1 # MX-2A[6]
amixer cset name="OUT MIXR DAC R1 Switch" 1 #MX-52 [0]

amixer cset name="SPK MIXR OUT MIXR Switch" 1 # MX-47 [1]

amixer cset name="Speaker Channel Switch" 1 #MX-01[6]
amixer cset name="SPOR MIX SPKVOL R Switch" 1 #MX-49[12]
amixer cset name="Speaker R Playback Switch" 1 #MX-01[7]
amixer cset name="Speaker Playback Volume" 26 

耳机拔插检测

设备树 : kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-rgb-v10-linux.dts

rk_headset: rk-headset {
    compatible = "rockchip_headset";
    headset_gpio = <&gpio1 RK_PC1 GPIO_ACTIVE_HIGH>;
    pinctrl-names = "default";
    pinctrl-0 = <&hp_det>;
    status ="okay";
};

kernel/arch/arm64/configs/px30_linux_defconfig

CONFIG_SWITCH=y
CONFIG_SWITCH_GPIO=y
CONFIG_RK_HEADSET=y

涉及文件夹
/kernel/drivers/headset_observe/

文件名功能
rk_headset.c检测耳机拔插
rockchip_headset_core.c核心函数
rk_headset_irq_hook_adc.c

简单的调用流程
在这里插入图片描述

遇到mic不收声的问题

我再调试过程中,rt5640遇到了录音这块死活没有声音的问题,查了好久,发现我手里的驱动代码DAPM好像有点问题
在这里插入图片描述
这个代码里没有描述MICBIAS1和IN1P IN2P IN3P,修改了一下代码

diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c

static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
+       {"IN1P", NULL, "MICBIAS1"},
+       {"IN2P", NULL, "MICBIAS1"},
+       {"IN3P", NULL, "MICBIAS1"},
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值