rk3568 es8388声卡调试

目录

目录

1. 准备

2. 声卡驱动

2.1 驱动源码

2.2 修改配置文件

3. 设备数配置

3.1 声卡设备工作原理

3.1.1 原理图

3.1.2 引脚功能

3.1.3 芯片处理音频流程

3.2 音频传输协议I2S

3.3 设备数配置

3.3.1 设备数声卡节点配置

3.3.2 es8388 codec配置

3.4 声卡检测

4. 声卡测试

4.1 播放测试

 4.2 录音测试

4.3 工具说明 


1. 准备

kernel 4.19版本的sdk。

2. 声卡驱动

2.1 驱动源码

es8388的芯片可以用内核里面8323的驱动源码,因此没有往内核里面加入声卡的驱动。

es8323在sound/soc/codecs/es8323.c、sound/soc/rockchip/rockchip_multicodecs.c中

可以通过更改寄存器的值,来增大或者减小声音 

2.2 修改配置文件

修改rockchip_linux_defconfig配置文件,目录为(arch/arm64/configs/),将驱动加载到内核中

3. 设备数配置

3.1 声卡设备工作原理

3.1.1 原理图

3.1.2 引脚功能
  • MCLK:主时钟(也叫过采样率)一般是采样频率的128、或256、或384或512倍
  • SCLK:主时钟串行数据位时钟(例:2(左右声道)x16(位宽)x8k(采样率))
  • LOUT/ROUT:扬声器输出
  • LRCK:串行数据左右通道帧时钟(采样率)
  • MIC_IN(LIN1/LIN2):麦克风的输入
  • I2C的芯片地址(0x10,7位地址)
3.1.3 芯片处理音频流程
  • 音频播放时:将音频文件通过I2S数据传输给es8388芯片对文件数据进行解码并将数字音频转换成模拟音频,最后通过耳麦或扬声器传出。
  • 音频采集时:由麦克风输入模拟信号,在由es8388芯片进行编码和转换成数字信号,最后存入指定的内存当中。

3.2 音频传输协议I2S

I2S(Inter-IC Sound)是一种用于数字音频传输的串行通信协议。它主要用于将音频数据传输到数字音频处理器(例如解码器、编码器等)或其他数字音频设备。

I2S协议使用三根线进行数据传输:时钟线(SCLK)、帧同步线(LRCLK)和数据线(DS)。时钟线用于同步数据传输,帧同步线用于标识数据帧的开始和结束,数据线则传输实际的音频数据。

在此次移植中soc与es8388芯片之间使用I2S数据传输模式。

soc为主设备,es8388芯片为从设备。

3.3 设备数配置

3.3.1 设备数声卡节点配置
	es8388_sound: es8388-sound {
		status = "okay";
		compatible = "rockchip,multicodecs-card";    
		rockchip,card-name = "rockchip,es8388-codec";    //card name
                rockchip,format = "i2s";                 //set data type
                rockchip,mclk-fs = <256>;                //void signal
                rockchip,cpu = <&i2s3_2ch>;
                rockchip,codec = <&es8388>;                //set codec
                rockchip,audio-routing =
			"Speaker", "LOUT1",
			"Speaker", "ROUT1",
			"LINPUT1", "Main Mic",
			"RINPUT1", "Main Mic";
	};

用的是rk指导文档中Multi Codecs Machine Driver模式,即用于 1个 DAI 对应多个 CODEC,或者 Combo DAI 对应 多个 CODEC 的场景。
 

节点主要配置如下:

compatible:用于匹配相应的驱动文件,不用改,自带的平台驱动

rockchip,format:设置数据传输格式

rockchip,mclk-fs:mclk为采样率的256倍

rockchip,cpu:声卡和 cpu 之间的连接关系以及使用的音频接口

rockchip,codec:实现声卡和es8388编解码器(codec)之间的数据传输

rockchip,audio-routing:用于指定音频的输入和输出之间的链接,以及音频信号的路径和流向。

3.3.2 es8388 codec配置
&i2c2 {
	status = "okay";
	pinctrl-names = "default";
	clock-frequency = <100000>;
	pinctrl-0 = <&i2c2m1_xfer>;

        es8388: es8388@10 {
		status = "okay";
		#sound-dai-cells = <0>;
        #clock-cells = <0>;
		compatible = "everest,es8388", "everest,es8323";
		reg = <0x10>;
        clocks = <&cru I2S3_MCLKOUT>;
		clock-names = "mclk";
		assigned-clocks = <&cru I2S3_MCLKOUT>, <&cru I2S3_MCLK_IOE>;
		assigned-clock-rates = <12288000>;
		assigned-clock-parents = <&cru I2S3_MCLKOUT_TX>, <&cru I2S3_MCLKOUT>;
		pinctrl-names = "default";
		pinctrl-0 = <&i2s3m0_mclk>;
	};
};

这是音频编解码器(codec)节点

compatible:用于配置E8323的驱动

assigned-clock-rate:时钟的频率

pinctrl-0:i2c的控制引脚,i2c2有M0和M1,注意看原理图具体用的是哪一个

reg:I2C的7位地址

3.4 声卡检测

 # 检查音频设备
arecord -l

#获取声卡硬件参数
arecord -D hw:1,0 --dump-hw-params

4. 声卡测试

4.1 播放测试

从上面检测中可以看出es8388是声卡1

aplay -D "plughw:1,0"  -f S16_LE -c 2 -r 8000 music.wav

 4.2 录音测试

arecord -D "plughw:1,0" -f S16_LE -c 2 -r 8000 -d 30 -t wav output.wav

4.3 工具参数说明 

-d 10表示录制10秒声音,output.wav是保存的文件名称

-D hw:x  表示指定第几个声卡

-r 指定采样率,-f 指定每个采样点的位数--样本大小

-c <通道数>:指定通道数,通常是1(单声道)或2(立体声)。

-f:设置采样格式

-t:文件类型voc,wav,raw或au)

参考链接: linux rk3568 es8326声卡移植-CSDN博客

Linux系统中进行RK3568平台的ES8326声卡驱动移植工作,主要涉及设备树(Device Tree)配置、驱动代码适配以及音频子系统(如ALSA或ASoC)的整合。以下是详细的移植指南: ### 1. 准备开发环境 确保已准备好以下内容: - RK3568平台的Linux内核源码树 - 交叉编译工具链 - ES8326的数据手册和驱动源码(通常为`es8326.c`或`snd-soc-es8326.c`) - 已配置好的调试串口和文件系统访问权限 ### 2. 添加ES8326驱动代码 将ES8326的驱动代码集成到内核源码中,通常位于`sound/soc/codecs/`目录下。如果已有驱动文件,可将其复制到该目录并修改`Makefile`和`Kconfig`以启用该驱动。 ```makefile # 在 sound/soc/codecs/Makefile 中添加 obj-$(CONFIG_SND_SOC_ES8326) += snd-soc-es8326.o ``` ```kconfig # 在 sound/soc/codecs/Kconfig 中添加 config SND_SOC_ES8326 tristate "ESS ES8326 Audio Codec" depends on I2C help Say Y or M here to add support for the ESS ES8326 audio codec. ``` ### 3. 配置设备树(Device Tree) 在RK3568平台的设备树文件(如`rk3568.dtsi`或具体板级的`.dts`文件)中添加ES8326的节点信息。需要配置I2C总线地址、音频接口模式(如I2S或PCM)、GPIO控制引脚(如复位或中断)等。 示例设备树节点如下: ```dts &i2c1 { status = "okay"; clock-frequency = <400000>; es8326: codec@10 { compatible = "everest,es8326"; reg = <0x10>; clocks = <&cru PCLK_I2S1>, <&cru SCLK_I2S1>; clock-names = "mclk", "bclk"; status = "okay"; /* 可选:复位引脚 */ reset-gpios = <&gpio4 RK_PD5 GPIO_ACTIVE_LOW>; }; }; ``` 确保时钟配置与硬件设计一致,尤其是主时钟(MCLK)和位时钟(BCLK)的来源与频率。 ### 4. 配置音频平台设备(ASoC DAI Link) 在RK3568的SoC驱动中(如`sound/soc/rockchip/rk3568_audio.c`),需要添加ES8326作为ASoC的DAI Link,指定CPU DAI(如`rockchip,i2s`)、CODEC DAI(如`es8326-hifi`)以及相关参数。 ```c static struct snd_soc_dai_link rk3568_audio_dais[] = { { .name = "ES8326", .stream_name = "ES8326 PCM", .cpu_dai_name = "rk_i2s1", .codec_dai_name = "es8326-hifi", .platform_name = "rk_i2s1", .codec_name = "i2c-1076.es8326", .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM, .ops = &rk3568_audio_ops, }, }; ``` ### 5. 驱动初始化与时钟处理 在ES8326驱动中,确保`clk_prepare_enable()`被正确调用以启用主时钟(MCLK)。参考以下代码片段: ```c struct es8326_priv { struct clk *mclk; }; static int es8326_probe(struct snd_soc_component *component) { struct es8326_priv *es8326 = snd_soc_component_get_drvdata(component); int ret; es8326->mclk = devm_clk_get(component->dev, "mclk"); if (IS_ERR(es8326->mclk)) return PTR_ERR(es8326->mclk); ret = clk_prepare_enable(es8326->mclk); if (ret) return ret; // 其他初始化代码... return 0; } ``` 确保设备树中`clock-names`与驱动中`devm_clk_get()`的参数一致,避免因时钟未正确配置导致驱动加载失败[^3]。 ### 6. 编译与烧录 配置内核时启用ES8326驱动: ```bash make menuconfig # 启用 CONFIG_SND_SOC_ES8326 ``` 编译内核和设备树: ```bash make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs ``` 将生成的`Image`和`.dtb`文件烧录到目标设备中。 ### 7. 验证与调试 启动系统后,检查声卡是否被正确识别: ```bash aplay -l ``` 播放测试音频: ```bash aplay -D hw:0,0 test.wav ``` 录音测试: ```bash arecord -D hw:0,0 -f cd -t wav -d 5 test.wav ``` 查看音频设备节点: ```bash ls /dev/snd/ ``` 若设备未识别,可使用`dmesg`查看内核日志,排查驱动加载失败原因,如时钟配置错误、I2C通信失败或设备树配置不正确。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值