之前有讲过如何做一个非USB的具有输入输出的声卡,目前现成的方案有WM8731或者hifiberry DAC+ADC pro,他们都是在启动时加载驱动的,但如果我们想要使用其他的codec,怎么办呢?经过一番研究,发现可以用simple card来创建一个声卡设备,并且让树莓派作为从机,那么本文通过几个部分来讲述,一个是硬件部分,一个是软件部分。
首先说明一下,我的目的是想通过树莓派作为一个实时音频处理器,将输入的音频信号做处理并输出。
好的,朝着这个方向来解决问题,第一个,硬件部分就是DIY一个声卡,采用的是CS4272这一片codec,它的模数,数模具有114db的动态范围,高达192k的采样率,按照官方pdf说明,我搭建了如下电路
声卡电路
外部时钟部分,由一颗12.288M有源晶振提供,用74HC4040作分频器,那么74HC4040的4脚为4分频输出,13脚为256分频输出,分别得到BCK和LRCK;那么对于玩解码器的朋友自然很清楚这三根时钟线的作用。那么CS4272和树莓派将作为从机接受外部时钟信号,树莓派不需要MCK时钟,只需要LRCK和BCK。
外部I2S时钟与树莓派连接:
=======================================================================
接下来要做的事情就是在树莓派上创建一个声卡,并设置为从机模式。
软件部分:我们现在要在树莓派上创建一个声卡设备,并设置成从机模式,原文地址如下,嫌麻烦的可以不看,直接往下。
Old Kernel Install Method | Adafruit I2S MEMS Microphone Breakout | Adafruit Learning System
那么开始,我用的是RPI3做演示:
1、安装编译依赖
sudo apt-get install git bc libncurses5-dev bison flex libssl-dev
2、下载内核源代码并编译
sudo wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source -O /usr/bin/rpi-source
sudo chmod +x /usr/bin/rpi-source
/usr/bin/rpi-source -q --tag-update
rpi-source --skip-gcc
解释一下:rpi-source这个文件将会被下载到/usr/bin目录中,同时,内核源码会下载到/homg/pi下,执行完成上述命令可能需要十几分钟时间,pi zero时间会更长。
3、下载I2S模块
git clone https://github.com/PaulCreaser/rpi-i2s-audio
cd rpi-i2s-audio
rpi-i2s-audio文件夹下, 打开文件my_loader.c
如果使用的是pi zero,,改下面两行
.platform = "3f203000.i2s",和.name = "3f203000.i2s",
改成
.platform = "20203000.i2s",和.name = "20203000.i2s",
如果使用外部时钟
.daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS,
改成
.daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM,
4、编译模块并加入内核
make -C /lib/modules/$(uname -r )/build M=$(pwd) modules
sudo insmod my_loader.ko
lsmod | grep my_loader
5、检查模块是否载入
dmesg | tail
6、在启动时载入模块
sudo cp my_loader.ko /lib/modules/$(uname -r)
echo 'my_loader' | sudo tee --append /etc/modules > /dev/null
sudo depmod -a
sudo modprobe my_loader
7、查看设备,设备列表里应该会出现我们刚刚创建的声卡设备了
arecord -l
/boot/config.txt文件里的dtparam=i2s=on取消注释
8、检查是否从机模式
重启树莓派,然后终端运行
dmesg
如果树莓派没有接受到I2S时钟,就会出现以上两行I2S SYNC error!
=========================================================================
经过以上操作,我们使用jack音频服务来测试一下
说明一下,请确保I2S外部时钟电路正常工作,那么jack服务才能启动成功。
哈哈哈哈,一个2进2出声卡设备创建好了!!!
=========================================================================
如果我们已经做过上述步骤,想要更改配置,比如树莓派作为I2S主时钟,或者将SD卡运行在RPI4上使用,只需要重新编译I2S模块再加入内核即可,开机启动在上述步骤已经做过了。
1、删除/home/pi下诸如linux-3a33f11c48572b9dd0fecac164b3990fc9234da8这样类型的文件夹,因为它是本文第2步下载源代码的时候解压的,注意是文件夹不是压缩包。(更换RPI4才做这一步)
2、再重新执行以下命令(更换RPI4才做这一步)
/usr/bin/rpi-source -q --tag-update
rpi-source --skip-gcc
3、编译模块(必须)
cd rpi-i2s-audio
make -C /lib/modules/$(uname -r )/build M=$(pwd) modules
sudo insmod my_loader.ko
4、加入内核(必须)
sudo cp my_loader.ko /lib/modules/$(uname -r)
sudo depmod -a
sudo modprobe my_loader
========================================================================
目前,理论上我们可以使用市面上各种高端解码IC来搭建我们的树莓派HIFI系统。
随便记录CS4272在I2C模式下的电源时序:
reset引脚低电平跳变到高电平后的10ms之内发送I2C
(寄存器,数据)
0x07,0x03 进入power down模式 进入control port模式
0x06,x010 设置ADC为I2S格式
0x01,0x01 设置DAC为I2S格式
0x07,0x02 上电