如何让Raspbian将ADC的SPI输入识别为声卡
适配SPI MCP3008为Raspbian ALSA声卡的设备树覆盖层配置说明
你需要基于Linux ASoC(音频系统芯片)框架的simple-audio-card通用驱动编写覆盖层,配合内核已有的mcp3008 IIO驱动、asoc-codec-iio虚拟codec驱动实现SPI ADC到声卡的映射,需要定义的节点和属性如下:
1. 基础头与公共配置
首先声明覆盖层的兼容范围、启用SPI控制器:
#include <dt-bindings/gpio/gpio.h> #include <dt-bindings/spi/spi.h> #include <dt-bindings/iio/iio.h> /dts-v1/; /plugin/; / { compatible = "brcm,bcm2711"; /* 匹配树莓派4的Bcm2711 SOC */ }; /* 启用SPI0控制器 */ &spi0 { status = "okay"; #address-cells = <1>; #size-cells = <0>; };
2. SPI总线下的MCP3008硬件节点
在&spi0节点下新增MCP3008的设备描述,匹配内核原生IIO驱动:
&spi0 { /* 此处接上面spi0的已有配置 */ mcp3008: adc@0 { compatible = "microchip,mcp3008"; reg = <0>; /* 对应SPI0的CE0片选引脚,接CE1则改为<1> */ spi-max-frequency = <1000000>; /* MCP3008支持的最高SPI时钟为1MHz */ #io-channel-cells = <1>; status = "okay"; }; };
3. 虚拟音频Codec节点
在根节点下新增ASoC虚拟Codec节点,把MCP3008的IIO采样通道映射为音频输入源:
/ { /* 此处接上面根节点的已有配置 */ mcp3008_codec: codec@0 { compatible = "asoc-codec-iio"; io-channels = <&mcp3008 0>; /* 0表示使用MCP3008的CH0通道,多通道采样可新增对应配置 */ io-channel-names = "adc"; #sound-dai-cells = <0>; status = "okay"; }; };
4. 简单声卡绑定节点
在根节点下新增simple-audio-card节点,把虚拟Codec绑定为标准ALSA声卡:
/ { /* 此处接上面根节点的已有配置 */ sound_mcp3008: sound@0 { compatible = "simple-audio-card"; simple-audio-card,name = "MCP3008-Audio"; /* 声卡显示名称,ODAS可直接通过该名称调用 */ simple-audio-card,format = "pdm"; simple-audio-card,bitclock-master = <&mcp3008_codec>; simple-audio-card,frame-master = <&mcp3008_codec>; /* 配置采样参数,适配ODAS默认的16kHz采样要求 */ simple-audio-card,rates = <16000>; simple-audio-card,formats = <S16_LE>; simple-audio-card,cpu { sound-dai = <&i2s>; }; simple-audio-card,codec { sound-dai = <&mcp3008_codec>; }; }; };
生效验证步骤
- 编写完成后用
dtc -I dts -O dtbo -o mcp3008-audio.dtbo mcp3008-audio.dts命令编译覆盖层 - 将编译得到的
.dtbo文件放入/boot/firmware/overlays/(Raspbian Bookworm)或/boot/overlays/(旧版系统)目录 - 在
/boot/firmware/config.txt末尾添加两行配置:dtparam=spi=on dtoverlay=mcp3008-audio - 重启后执行
arecord -l即可看到识别到的MCP3008声卡,直接在ODAS配置中指定该声卡作为输入源即可使用
内容的提问来源于stack exchange,提问作者Artem Chepurnoy
相关产品推荐
相关产品推荐

