Rockchip RK3399 - ALC5651音频调试

本文详细介绍了在Rockchip RK3399平台进行ALC5651音频芯片的调试过程,包括内核配置、查看声卡设备、寄存器查看及音频调试步骤。内容涵盖了从内核编译到播放路径设置,以及Ftrace调试工具的使用,为解决音频播放问题提供了全面的排查方法。
摘要由CSDN通过智能技术生成

----------------------------------------------------------------------------------------------------------------------------

开发板 :NanoPC-T4开发板eMMC :16GBLPDDR3 :4GB显示屏 :15.6英寸HDMI接口显示屏u-boot :2023.04linux :6.3----------------------------------------------------------------------------------------------------------------------------

一、内核配置

1.1 配置内核

修改sound/soc/codecs/Kconfig文件,搜索config SND_SOC_RT5651,将该项修

config SND_SOC_RT5651
        tristate
        depends on I2C

改为,如果不修改的话,make menuconfig是看不到该配置项的;

config SND_SOC_RT5651
        tristate "Realtek ALC5651 CODEC"
        depends on I2C

在linux内核根目录下执行make menuconfig配置以下选项:

Device Drivers --->
  <*> Sound card support  --->
     <*> Advanced Linux Sound Architecture  ---> 
<*> Sequencer support <*> ALSA for SoC audio support ---> <*> ASoC support for Rockchip { *} Rockchip I2S Device Driver CODEC drivers ---> <*> Realtek RT5651 CODEC <*> ASoC Simple sound card support

至于为啥配这些,可以看下面的介绍。

1.1.1 支持simple-audio-card驱动

要想将sound/soc/generic/simple-card.c文件对应的驱动编译到内核,我们需要配置CONFIG_SND_SIMPLE_CARD,我们定位到sound/soc/generic/Makefile文件;

# SPDX-License-Identifier: GPL-3.0
snd-soc-simple-card-utils-objs  := simple-card-utils.o
snd-soc-simple-card-objs        := simple-card.o
snd-soc-audio-graph-card-objs   := audio-graph-card.o

obj-$(CONFIG_SND_SIMPLE_CARD_UTILS)     += snd-soc-simple-card-utils.o
obj-$(CONFIG_SND_SIMPLE_CARD)           += snd-soc-simple-card.o
obj-$(CONFIG_SND_AUDIO_GRAPH_CARD)      += snd-soc-audio-graph-card.o

这里定义了snd-soc-simple-card.o的生成规则:

snd-soc-simple-card-objs := simple-card.o

它表示将当前目录下的 simple-card.o文件编译成一个snd-soc-simple-card.o。我们可以查看sound/soc/generic/.snd-soc-simple-card.o.cmd文件找到编译命令:

root@zhengyang:/work/sambashare/rk3399/linux-5.3.8# cat  sound/soc/generic/.snd-soc-simple-card.o.cmd
cmd_sound/soc/generic/snd-soc-simple-card.o := arm-linux-ld  -EL  -maarch64elf    -r -o sound/soc/generic/snd-soc-simple-card.o sound/soc/generic/simple-card.o
1.1.2 支持I2S驱动

要想将sound/soc/rockchip/rockchip_i2s.c文件对应的驱动编译到内核,我们需要配置CONFIG_SND_SOC_ROCKCHIP_I2S,我们定位到sound/soc/rockchip/Makefile文件;

# SPDX-License-Identifier: GPL-3.0
# ROCKCHIP Platform Support
snd-soc-rockchip-i2s-objs := rockchip_i2s.o
snd-soc-rockchip-pcm-objs := rockchip_pcm.o
snd-soc-rockchip-pdm-objs := rockchip_pdm.o
snd-soc-rockchip-spdif-objs := rockchip_spdif.o

obj-$(CONFIG_SND_SOC_ROCKCHIP_I2S) += snd-soc-rockchip-i2s.o snd-soc-rockchip-pcm.o
obj-$(CONFIG_SND_SOC_ROCKCHIP_PDM) += snd-soc-rockchip-pdm.o
obj-$(CONFIG_SND_SOC_ROCKCHIP_SPDIF) += snd-soc-rockchip-spdif.o

这里定义了snd-soc-rockchip-i2s.o的生成规则:

snd-soc-rockchip-i2s-objs := rockchip_i2s.o

它表示将当前目录下的rockchip_i2s.o文件编译成一个snd-soc-rockchip-i2s.o。

1.1.3 支持rt5651驱动

要想将sound/soc/codecs/rt5651.c文件对应的驱动编译到内核,我们需要配置CONFIG_SND_SOC_RT5651,我们定位到sound/soc/codecs/文件;

snd-soc-rt5651-objs := rt5651.o
obj-$(CONFIG_SND_SOC_RT5651)    += snd-soc-rt5651.o

这里定义了snd-soc-rt5651.o的生成规则:

snd-soc-rt5651-objs := rt5651.o

它表示将当前目录下的rt5651.o文件编译成一个snd-soc-rt5651.o。

1.1.4 支持seq

在 sound/core/Makefile文件中,如果配置CONFIG_SND_SEQUENCER,将seq编译到内核,这个文件作用后面有时间再研究;

obj-$(CONFIG_SND_SEQUENCER)     += seq/
1.2 保存配置

配置完内核之后记得保存配置:

存档:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# mv rk3399_defconfig ./arch/arm64/configs/

重新配置内核:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# make rk3399_defconfig
1.3 编译内核

在linux内核根目录下执行如下命令进行编译内核:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# make -j8

u-boot-2023.04路径下的mkimage工具拷贝过来,然后在命令行使用mkimage工具编译即可:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# cp ../u-boot-2023.04/tools/mkimage ./
root@zhengyang:/work/sambashare/rk3399/linux-6.3# ./mkimage -f kernel.its kernel.itb
1.4 通过tftp烧录内核

给开发板上电,同时连接上网线,进入uboot命令行。我们将内核拷贝到tftp文件目录:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# cp kernel.itb /work/tftpboot/

接着给开发板上电。通过uboot命令行将kernel.itb下到内存地址0x10000000处:

=> tftp 0x10000000 kernel.itb

通过mmc write命令将内核镜像烧录到eMMC第0x8000个扇区处:

=> mmc erase 0x8000 0xA000
=> mmc write 0x10000000 0x8000 0xA000
1.5 启动内核

我们重新启动开发板,如果声卡驱动正常加载,我们会看到类似下面的日志:

二、查看声卡设备

下载alsa工具:

root@rk3399:/# apt-get install alsa-base alsa-utils alsa-oss alsa-tools
2.1 查看音频设备节点

查看音频设备节点:

root@rk3399:/# ll /dev/snd
total 0
drwxr-xr-x  2 root root       60 Jul 26 23:31 by-path/
crw-rw----  1 root audio 116,  4 Jul 26 23:31 controlC0
crw-rw----  1 root audio 116,  3 Jul 26 23:31 pcmC0D0c
crw-rw----  1 root audio 116,  2 Jul 26 23:31 pcmC0D0p
crw-rw----  1 root audio 116,  1 Jul 26 23:31 seq
crw-rw----  1 root audio 116, 33 Jul 26 23:31 timer

其中:

  • controlC0:用于声卡的控制,例如通道选择,混音,麦克控制,音量加减,开关等;
  • pcmC0D0c:用于录音的pcm设备;
  • pcmC0D0p:用于播放的pcm设备;
  • seq:音序器;
  • timer:定时器;

C0D0代表的是声卡0中的设备0,pcmC0D0c最后一个c代表capture,pcmC0D0p最后一个p代表playback,这些都是alsa-driver中的命名规则。

从上面的列表可以看出,声卡0下下挂了3个设备,根据声卡的实际能力,驱动实际上可以挂载更多种类的设备,我们通常更关心的是pcm和control这两种设备,默认一个声卡对应一个Control设备。

2.2 查看所有声卡

查看所有声卡:

root@rk3399:/# cat /proc/asound/cards
 0 [realtekrt5651co]: simple-card - realtek,rt5651-codec
                      realtek,rt5651-codec

0为声卡编号,realtekrt5651co为ALSA声卡的唯一标识,因为struct snd_card  id字段其长度为16,所以存放的就是realtek,rt5651-codec去除特殊字符之后的的前15个字符。

声卡分两种通道,一种是Capture、一种是Playback。Capture是输入通道,Playback是输出通道;我们以声卡0为例;

root@rk3399:/# ll /proc/asound/card0
-r--r--r-- 1 root root 0 Jul 23 16:02 id
dr-xr-xr-x 4 root root 0 Jul 23 16:02 pcm0c/
dr-xr-xr-x 4 root root 0 Jul 23 16:02 pcm0p/
root@rk3399:/# cat /proc/asound/card0/id
realtekrt5651co

pcm0p属于声卡0输出通道,pcm0c属于声卡0输入通道。

2.2.1 查看播放设备
root@rk3399:/# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: realtekrt5651co [realtek,rt5651-codec], device 0: ff880000.i2s-rt5651-aif1 rt5651-aif1-0 [ff880000.i2s-rt5651-aif1 rt5651-aif1-0]
Subdevices: 1/1
Subdevice #0: subdevice #0

这里看到的ff880000.i2s-rt5651-aif1 rt5651-aif1-0为音频数据链路的名称。

2.2.2 查看录音设备
root@rk3399:/# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: realtekrt5651co [realtek,rt5651-codec], device 0: ff880000.i2s-rt5651-aif1 rt5651-aif1-0 [ff880000.i2s-rt5651-aif1 rt5651-aif1-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
2.2.3 播放音频测试

找到一个wav音频文件,播放音频:

root@rk3399:/# cd /
root@rk3399:/# aplay AbuduOffice.wav
Playing WAVE 'AbuduOffice.mp3' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

插入耳机,如果我们发现耳机并没有声音,说明音频播放失败,我们后面会介绍排查方法。

2.3 查看pcm设备列表
root@rk3399:/# cat /proc/asound/pcm
00-00: ff880000.i2s-rt5651-aif1 rt5651-aif1-0 : ff880000.i2s-rt5651-aif1 rt5651-aif1-0 : playback 1 : capture 1
2.4 查看asoc调试信息

查看/sys/kernel/debug/asoc文件夹:

root@rk3399:/# ll /sys/kernel/debug/asoc
-r--r--r--  1 root root 0 Jan  1  1970 components
-r--r--r--  1 root root 0 Jan  1  1970 dais
drwxr-xr-x  6 root root 0 Jan  1  1970 realtek,rt5651-codec/

可以看到该目录下包含了component信息,dai信息,以及音频数据链路信息。

2.4.1 查看component

ASoC使用同一的数据结构来描述codec设备和platform设备,该数据结构就是snd_soc_component,此处输出的就是所有注册的component的名称;

root@rk3399:/# cat /sys/kernel/debug/asoc/components
ff880000.i2s     // 描述platform设备的component,这里为啥出现两次很奇怪  
ff880000.i2s
rt5651.1-001a    // 描述codec设备的component
snd-soc-dummy    // 描述platform设备的component 虚拟的
snd-soc-dummy    // 描述codec设备的component 虚拟的

我们之前分析了codec驱动、以及platform驱动注册流程,其各注册了一个component,然而这里输出了5个component,比较奇怪。

2.4.2 查看dai

在注册component的同时会为每个snd_soc_dai_driver 分配一个snd_soc_dai,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Graceful_scenery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值