目录
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)