首页 > 其他分享 >Rockchip RK3399 - Codec驱动( Realtek ALC5651)

Rockchip RK3399 - Codec驱动( Realtek ALC5651)

时间:2023-07-08 09:11:05浏览次数:47  
标签:snd simple Rockchip ALC5651 Realtek soc rockchip card rt5651

Codec driver提供了配置/使能Codec的能力,驱动代码位于sound/soc/codecs/rt5651.c文件。

一、设备节点

1.1 设备节点rt5651

我们在arch/arm64/boot/dts/rockchip/rk3399-evb.dts文件添加rt5651设备节点,该节点位于i2c1节点下:

&i2c1 {
    status = "okay";
    i2c-scl-rising-time-ns = <150>;
    i2c-scl-falling-time-ns = <30>;
    clock-frequency = <200000>;

    rt5651: rt5651@1a {
        #sound-dai-cells = <0>;
        compatible = "rockchip,rt5651";
        reg = <0x1a>;
        clocks = <&cru SCLK_I2S_8CH_OUT>;
        clock-names = "mclk";
        hp-det-gpio = <&gpio4 28 GPIO_ACTIVE_LOW>;
        status = "okay";
    };
};

 其中:

  • status :指定设备状态为“正常”,表示该设备状态为正常运行;
  • i2c-scl-rising-time-ns:定义了SCL信号上升时间的最小值,单位是纳秒;
  • i2c-scl-falling-time-ns:定义了SCL信号下降时间的最小值,单位是纳秒;
  • clock-frequency:定义了I2C总线的时钟频率,单位是赫兹;

接着定义rt5651音频编解码器的设备树节点,其名称为 rt5651,内部的设备地址为0x1a;

  • #sound-dai-cells :指定DAI的单元格数量,这里为0表示不需要添加额外的 DAI 单元格(比如,不需要配置 SAI、PCM 等标志);
  • compatible:指定设备驱动程序的兼容性,即告诉内核该设备可以被哪些驱动程序所使用;
  • reg:指定了rt5651设备在I2C控制器上的地址;
  • clocks:定义了音频编解码器使用的时钟,这里使用了由 PPL(Phase Locked Loop)产生的 SCLK_I2S_8CH_OUT 时钟信号;
  • clock-names:定义了音频编解码器使用的时钟的名称,这里为mclk,表示主时钟;
  • pinctrl-names:指定设备pinctrl配置集合,例如“default”表示默认配置;
  • pinctrl-0:设置default状态对应的引脚配置为i2s0_8ch_mclk,这里主要配置I2C1相关引脚复用为I2C功能;
  • status :指定设备状态为“正常”,表示该设备状态为正常运行;

1.2 引脚配置节点i2s0_8ch_mclk

在arch/arm64/boot/dts/rockchip/rk3399.dtsi文件添加引脚配置节点i2s_8ch_bus,定义在pinctrl设备节点下:

i2s0 {
        i2s0_8ch_mclk: i2s0-8ch-mclk {
                rockchip,pins =
                        <3 RK_PC1 2 &pcfg_pull_none>;
        };
        
        ....
}

此处配置GPIO3_C1引脚功能为MAC_TXCLK,电气特性为pcfg_pull_none。

我们在前面的文章中介绍的ALC565接线中并没有使用GPIO3_C1,所以这个我认为是多余的。

二、Codec驱动

四、烧录测试

4.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  ---> 
         <*> ALSA for SoC audio support  ---> 
            <*>  ASoC support for Rockchip                                                                                      
            {*}  Rockchip I2S Device Driver
            CODEC drivers  --->
              <*> Realtek RT5651 CODEC
            <*>  ASoC Simple sound card support  

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

4.1.1 支持simple-audio-card驱动

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

# SPDX-License-Identifier: GPL-2.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.2.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
4.1.2 支持I2S驱动

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

# SPDX-License-Identifier: GPL-2.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。

4.1.2 支持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。

4.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

4.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

4.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

4.5 启动内核

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

[    3.442742] rt5651 1-001a: Failed to reguest IRQ 0: -22
[    4.035868] asoc-simple-card rt5651-sound: ASoC: DAPM unknown pin Headphones
[    4.049408] asoc-simple-card rt5651-sound: ASoC: Failed to add route MICBIAS1(*) -> Mic Jack

 

参考文章

[1] 理解ALSA(三):从零写ASoC驱动

标签:snd,simple,Rockchip,ALC5651,Realtek,soc,rockchip,card,rt5651
From: https://www.cnblogs.com/zyly/p/17533936.html

相关文章

  • Rockchip rk3588 U-Boot详解 (三)
    Rockchiprk3588U-Boot详解(三)专栏总目录1.1Environment-VariablesENV(Environment-Variables)是U-Boot支持的一种全局数据管理和传递方式,原理是构建一张HASH映射表,把用户的数据以"键值-数据"作为表项进行管理。EVN通常用于定义平台配置参数:固件加载地址、网络配置(ipaddr、serve......
  • RK3588(YD-88)瑞芯微 Rockchip RK3588 开发板套件,支持8G内存,32G eMMC存储
     一、产品简介1.产品简述:YD-88 是基于瑞芯微RK3588 的一款核心板RK3588是一颗高性能、低功耗的应用处理器芯片,专为ARMPC、边缘计算、个人移动互联网设备和其它多媒体应用而设计,是由4个A76和4个A55与独立的NEON协处理器集成的。RK3588内置了多种功能强大的嵌入式......
  • Rockchip rk3588 U-Boot详解 (三)
    Rockchiprk3588U-Boot详解(三)专栏总目录1.1Environment-VariablesENV(Environment-Variables)是U-Boot支持的一种全局数据管理和传递方式,原理是构建一张HASH映射表,把用户的数据以"键值-数据"作为表项进行管理。EVN通常用于定义平台配置参数:固件加载地址、网络配置(i......
  • Rockchip RK3399 - rt5651 ALSA Machine驱动
    一、Machine驱动Machinedriver描述了如何控制CPU数字音频接口(DAI)和Codec,使得互相配合在一起工作,Machine驱动代码位于sound/soc/generic/simple-card.c文件。1.1设备节点rt5651-sound我们在arch/arm64/boot/dts/rockchip/rk3399-evb.dts文件添加设备节点rt5651-sound;rt5651_......
  • VMware ESXi 6.7 U3 Final Unlocker & OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (
    VMwareESXi6.7U3Final最终版,集成驱动版。此版本解决的问题:VMwareHostClient无法将现有虚拟磁盘(VMDK)附加到虚拟机请访问原文链接:https://sysin.org/blog/vmware-esxi-6-sysin/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org2023-02-28,发布一个UIfix版......
  • Rockchip RK3399 - Mali-T864 GPU驱动
    一、图像界面卡顿问题在前面的文章我们已经移植了在NanoPC-T4开发板上移植了uboot2023.04、linux5.2.8、以及ubuntu20.04.4根文件系统。然后在使用ubuntu桌面环境的时候,发现了一个问题,随便打开一个网页,视频都加载不出来,同时看到CPU的占用率会急剧升高;1.1产生原因造成这种......
  • Rockchip RK3399 - rfkill子系统
    一、rfkill子系统1.1rfkill概述rfkill是Linux内核提供的一个框架,用于控制无线通信硬件(如WiFi、蓝牙、NFC等)的开关和状态。rfkill就是RF(射频)设备的开关,有类似一键关闭所有射频外设的功能。rfkill的出现方便管理各种RF芯片的开关,目前已经很多厂商的设备使用的是rfkill的驱......
  • Rockchip RK3399 - WiFi AP6356S驱动
    最初我的计划是从uboot开始讲起的,然后再来讲内核部分,但是在移植linux5.2.8内核的时候发现其在支持WiFi模组AP6356S时需要大量的调整,不得不先过来研究一下AP6356S驱动。一、AP6256介绍1.1WiFi介绍我们日常生活中,已经离不开WiFi,那到底是什么是WiFi?WiFi是一种基于IEEE802.11标......
  • Rockchip RK3399 - 移植ubuntu根文件系统
    在上一篇文章中,我们介绍了通过busybox构建根文件系统,但是我们在使用的过程中有个致命的问题,就是缺少各种命令以及各种开发环境,比如python,jdk、mysql啊。比如我们需要使用python开发环境,那么我们就得自己去下载python源码编译,然后移植到开发板中。那我们就开始想,我们是不是像cento......
  • Rockchip RK3399 - 移植uboot 2023.04和内核FIT uImage制作
    ----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6HDMI接口显示屏u-boot:2023.04linux  :5.2.8------------------------------------------......