如何在树莓派CM4上将CS4270音频编解码器配置为ALSA设备
问题描述
我已将树莓派CM4与Cirrus Logic CS4270芯片连接,该芯片可提供音频I/O(CS4270数据手册可查阅Cirrus Logic官方文档)。CS4270设置为软件模式(I2C协议),引脚连接如下:
| CS4270 | CM4 |
|---|---|
| RST | GPIO22 |
| SDIN | GPIO21 |
| SDOUT | GPIO20 |
| LRCK | GPIO19 |
| SCLK | GPIO18 |
| M0 | GPIO3 (SCL1) |
| M1 | GPIO2 (SDA1) |
| I2S/*LJ | GND |
| MDIV1 | 3V3 |
| MDIV2 | GND |
| MCLK | 输入来自外部22.5792MHz振荡器 |
我能在Linux内核代码的/sound/soc/codecs/cs4270.c中找到CS4270编解码器的实现,但无法完成配置使其正常工作(例如,我编译了Linux内核以获取所有模块,但生成的模块中没有snd-soc-cs4270.ko)。请问如何让CS4270作为ALSA音频设备正常工作?
解决方案
要让CS4270在树莓派CM4上作为ALSA设备工作,需完成内核配置、设备树修改、引脚配置和驱动加载四个核心步骤,具体操作如下:
1. 配置Linux内核选项
首先确保内核编译时启用CS4270驱动及依赖项:
- 打开内核配置界面:
make menuconfig(建议基于树莓派官方内核配置文件操作) - 依次进入路径:
Device Drivers > Sound card support > Advanced Linux Sound Architecture > ALSA for SoC audio support > CODEC drivers - 勾选
Cirrus Logic CS4270 CODEC,选择**模块(M)**模式(仅此模式会生成snd-soc-cs4270.ko) - 同步启用以下依赖选项:
Device Drivers > Sound card support > Advanced Linux Sound Architecture勾选Device Drivers > Sound card support > Advanced Linux Sound Architecture > ALSA for SoC audio support勾选Device Drivers > I2C support > I2C core support勾选Device Drivers > Sound card support > Advanced Linux Sound Architecture > ALSA for SoC audio support > Raspberry Pi sound card support勾选(对应CM4的bcm2711平台)
保存配置后重新编译内核及模块:
make -j$(nproc) zImage modules dtbs sudo make modules_install sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware/ sudo cp arch/arm64/boot/zImage /boot/firmware/kernel8.img
2. 修改设备树
需在设备树中添加CS4270节点及音频链路配置:
- 基于CM4基础设备树(如
bcm2711-rpi-cm4.dts)创建overlay文件,或直接修改设备树源文件 - 添加CS4270的I2C节点:
&i2c1 { status = "okay"; cs4270: cs4270@48 { compatible = "cirrus,cs4270"; reg = <0x48>; // 根据M0/M1电平计算地址:0x48 + (M1<<1 | M0),需匹配硬件连接 reset-gpios = <&gpio 22 GPIO_ACTIVE_LOW>; #sound-dai-cells = <0>; }; };
- 添加音频链路节点,连接CS4270与CM4的I2S控制器:
&sound { compatible = "simple-audio-card"; simple-audio-card,name = "CS4270-Audio"; simple-audio-card,format = "i2s"; simple-audio-card,bitclock-master = <&dailink0_master>; simple-audio-card,frame-master = <&dailink0_master>; simple-audio-card,cpu { sound-dai = <&i2s0>; // 对应CM4的I2S0,匹配GPIO18/19/20/21的硬件连接 }; dailink0_master: simple-audio-card,codec { sound-dai = <&cs4270>; }; }; &i2s0 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&i2s0_pins>; };
- 编译设备树overlay或更新设备树文件,在
/boot/firmware/config.txt中添加dtoverlay=your-overlay-name(使用overlay时)。
3. 确认引脚配置
确保CM4 GPIO引脚功能匹配硬件连接:
- GPIO18(SCLK)、GPIO19(LRCK)、GPIO20(SDOUT)、GPIO21(SDIN)设为I2S功能
- GPIO2(SDA1)、GPIO3(SCL1)设为I2C1功能
- GPIO22设为输出模式,用于复位CS4270
可通过raspi-config的GPIO配置界面修改,或直接编辑/boot/firmware/config.txt添加:
dtparam=i2c_arm=on dtparam=i2s=on gpio=22=op,dh
4. 验证驱动与设备
重启系统后,执行以下命令验证:
- 检查驱动加载状态:
lsmod | grep snd_soc_cs4270 - 查看ALSA音频设备:
aplay -l、arecord -l - 测试音频功能:用
aplay test.wav播放音频,arecord -f cd test_rec.wav录制音频
常见问题排查
- 未生成
snd-soc-cs4270.ko:确认内核配置中CS4270驱动设为模块(M),且所有依赖的SoC音频选项已启用 - I2C通信失败:核对M0/M1电平对应的I2C地址,用
i2cdetect -y 1扫描确认设备存在 - MCLK异常:检查外部22.5792MHz振荡器工作状态,确认MDIV1/MDIV2的电平配置与采样率需求匹配
内容的提问来源于stack exchange,提问作者F.R.D
相关产品推荐
相关产品推荐

