1、前序
前期所需资料:
rk3568的源码、es8326声卡小板的datesheet、核心版原理图、底板原理图
前期需要掌握的软件:
1)amixer和alsamixer:用于配置音频各个参数,前者是命令行模式,后者是基于文本图形界面的,可以在终端中显示.通过键盘的上下键,左右键等实现音量设置,开关操作等。
2)aplay:命令行播放视频
3)mplayer:播放视频
2、内核中加载驱动代码
2.1、获取驱动代码
- 确定es8326声卡驱动程序:首先,确定要添加和移植的目标声卡驱动程序。这可能涉及查找适用于目标硬件平台的开源驱动程序或者从硬件供应商获取的专有驱动程序。
- 理解es8326声卡驱动程序接口和功能:仔细阅读声卡驱动程序的文档和源代码,了解其接口、功能和依赖关系。这将帮助你理解驱动程序的工作原理和与其他组件的交互方式。
- 检查目标硬件平台的硬件特性:了解目标硬件平台的特性,例如处理器类型、内存布局、外设控制器等。这将有助于确定驱动程序在新平台上可能需要进行的修改和适配。
- 修改或编写适配代码:根据目标硬件平台的特性,对驱动程序进行修改或编写新的适配代码。这可能涉及修改寄存器配置、中断处理、设备初始化等。
2.2、添加驱动程序源代码
2.2.1、es8326源码放置
将es8326声卡驱动程序的源代码添加到内核源代码树中的适当位置(kernel/sound/soc/codecs目录下)。这可能涉及创建新的目录结构,以便将驱动程序源代码组织起来。
2.2.2修改配置文件
-
修改rk3568_xxx_defconfig文件,加载驱动程序,将该驱动程序加载到内核中。
-
修改Kconfig文件,配置es8326声卡选项,该文件就是定义es8326声卡标识符、描述信息。
-
修改Makefile文件, 编译声卡源码生成kernel可识别的二进制文件。
2.3、编译内核
使用交叉编译工具链将内核和声卡驱动程序一起编译为适用于目标硬件平台的二进制文件,即内核镜像boot.img。
2.3.1、编译命令
cd kernel
make ARCH=arm64 rk3568_xxx_defconfig -j8
make ARCH=arm64 rk3568-xxx.img -j12
2.3.2、编译结果查询
在kernel目录下键入编译命令,等待编译成功,查看是否生成es8326.o二进制文 件,表明驱动程序加载成功。
在适配驱动程序的过程中,可能会遇到一些问题和错误,需要和厂商进行沟通或者自己根据报错进行解决。
3、kernel设备树配置
3.1、es8326声卡设备工作原理
3.1.1、es8326原理图
3.1.2、引脚功能
主要挑几个重要的引脚
- MCLK:主时钟
- SCLK:主时钟串行数据位时钟
- SDID:DAC串行数据输入
- LRCK:串行数据左右通道帧时钟
- SOUT:ADC串行数据输出
- LOUT/ROUT:扬声器输出
- DMIC(28,27,29):麦克风的输入
- CE:I2C的芯片地址(0x18)
3.1.3、芯片处理音频流程图
如上图所示:
- 音频播放时将音频文件通过I2S数据传输到DRC调整音频信号的动态范围,在经DAC芯片将数字音频转换成模拟音频,最后通过耳麦或扬声器传出。
- 音频采集时,由麦克风输入模拟信号,经过PGA过滤噪音,在由ADC模数转换芯片转换成数字信号,最后存入指定的内存当中。
3.2、音频传输协议I2S
3.2.1、I2S简介
I2S(Inter-IC Sound)是一种用于数字音频传输的串行通信协议。它主要用于将音频数据传输到数字音频处理器(例如解码器、编码器等)或其他数字音频设备。
I2S协议使用三根线进行数据传输:时钟线(SCLK)、帧同步线(LRCLK)和数据线(SD)。时钟线用于同步数据传输,帧同步线用于标识数据帧的开始和结束,数据线则传输实际的音频数据。
在此次移植中soc与es8326芯片之间使用I2S数据传输模式。
3.2.2、I2S工作原理
- 主设备(例如音频处理器)产生时钟信号(SCLK),用于同步数据传输。时钟信号的频率决定了数据的传输速度。
- 主设备还产生帧同步信号(LRCLK),用于标识数据帧的开始和结束。帧同步信号的频率通常是音频采样率的倍数。
- 主设备将音频数据按照时钟信号的边沿,通过数据线(SD)发送给从设备。
- 从设备接收到数据后,根据时钟信号进行同步,并在帧同步信号指示的时候开始接收数据。
- 从设备接收到的音频数据可以被进一步处理或输出。
在此次移植中,soc为主设备,es8326芯片为从设备。
3.3、核心板原理图与底板原理图
熟悉硬件原理图接口,以便于后续测试出现问题方便定位。
3.4、设备树配置
设备树(Device Tree)编写是将声卡硬件与Linux内核进行匹配和配置的重要步骤。设备树是一种描述硬件设备的数据结构,它以一种与硬件无关的方式来表达设备的特性和连接关系。
3.4.1、设备树声卡节点配置
es8326-sound {
status = "okay";
compatible = "simple-audio-card";
simple-audio-card,format = "i2s"; //set data type
simple-audio-card,name = "rockchip,es8326-codec"; //card name
simple-audio-card,mclk-fs = <256>; //void signal
// sound part
simple-audio-card,widgets =
"Microphone", "Microphone Jack",
"Headphone", "Headphone Jack";
simple-audio-card,routing =
"Microphone Jack", "MICBIAS1",
"MIC1", "Microphone Jack",
"Headphone Jack", "HPOL",
"Headphone Jack", "HPOR";
// set dai
simple-audio-card,cpu {
sound-dai = <&i2s3_2ch>;
};
//set codec
simple-audio-card,codec {
sound-dai = <&es8326>;
};
};
该声卡节点主要配置一下几个方面:
- compatible:非常重要,用于匹配相应的驱动文件
- simple-audio-card,format:设置数据传输模式
- simple-audio-card,widgets:通过配置widget节点,可以实现对音频编解码器的各种功能和配置,例如设置输入输出端口、音量控制、混音等。
- simple-audio-card,routing:用于描述音频信号的流动路径和连接关系。通过配置routing,可以指定音频输入和输出之间的连接,以及音频信号的路径和流向。
- simple-audio-card,cpu:它描述了 simple-audio-card 和 cpu 之间的连接关系以及使用的音频接口。
- simple-audio-card,codec:通过 sound-dai 属性,将名为 es8326 的音频编解码器连接到了 simple-audio-card 和 codec 之间,以实现声卡和音频编解码器之间的音频数据传输。
3.4.2、es8326 codec配置
es8326: es8326@18 {
#sound-dai-cells = <0>;
compatible = "everest, es8326";
reg = <0x18>; //codec adress
clocks = <&cru I2S3_MCLKOUT>; //MCLK
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:是和驱动文件匹配的属性
- clocks:时钟的频率
- assigned-clocks:将I2S3_MCLK_IOE时钟的父时钟设置为I2S3_MCLKOUT
- pinctrl - 0:设置引脚控制
3.4.3、es8326声卡检测
3.4.3.1、编译内核并烧录
使用内核编译命令,通过烧录工具将镜像烧录到开发板上。
3.4.3.2、检测声卡
在终端上键入:cat /proc/asound/cards,会出现如下图所示的声卡信息:
或者通过dmesg | grep es8326进行查看。
3.5、设备树配置可能会遇到的问题
1、设置simple-audio-card,mclk-fs,这个对于es8326来说是256,这个根据实际情况而定,否则导致声卡无法整正常工作。
2、设备节点es8326-sound中simple-audio-card,widgets和simple-audio-card,routing的设置,这两者分别是声卡的控件和声音输入输出路径,这个很重要,需要了解es8326芯片工作原理,否则会导致播放和录音都没有声音。
3、需确定es8326设备挂载到那一条总线上,则需要在设备树dts中那一条总线上配置es8326的设备信息。
4、声卡调试
4.1、声卡播放测试
在终端上
声卡播放测试使用aplay软件进行测试,测试命令如下:
aplay -Dhw:1,0 test.wav
-D:可选择播放声音的声卡
在UI上
直接使用鼠标点击播放音频文件,和我们熟悉的windows系统播放音频一样。
4.2、声卡录音测试
在终端上
声卡录音测试使用arecord软件进行测试,测试命令如下:
arecord -Dhw:1,0 -c 2 -f S16_LE -r 44100 -d 10 -t wav test.wav
-D:选择声卡
-c:通道
-f:设置采样格式
-r:设置录音频率
-d:设置持续时间,单位为秒
-t:文件类型voc,wav,raw或au)
在UI上
直接使用app软件进行录音
4.3、amixer命令
amixer命令是调节音频属性的,所以用户可通过该命令查看和控制声卡上的所有混音器控件,如音量控制、静音控制、捕捉选项等;设置混音器控件的值,如设置音量、开/关静音等;保存和恢复混音器的状态。
- 命令:amixer -c 1 control,如下图所示:-- -
- 结合前几章的内容,知道每一个属性的寄存器地址以及该属性含义,使用amixer命令进行调节,通过一二节的录音、播放来进行验证,看是否能够达到预期期望。以播放声音为例,通过调节DAC Playback Volume这个属性值来调节输出声音大小,在通过aplay命令播放音频文件,实现方法如下:
- 查看属性值信息,amixer -c 1 cget numid=1:
- 使用amixer命令进行调节amixer -c 1 cset name=‘DAC Playback Volume’ val,其中val = 1~191,通过aplay命令播放,看是否会有声音音量的变化。
- 查看属性值信息,amixer -c 1 cget numid=1:
4.4、在测试中可能遇到的问题
1、aplay使用命令要指定声卡,否则会使用系统默认的声卡,会导致播放没有声音,也可以通过命令设置默认声卡,直接键入aplay test.wav
2、录音时,没有指定采样频率,或者设置采样频率的值超出声卡范围,可能会导致录音没有声音。要仔细阅读声卡的datesheet,防止这样的错误发生。
5、适配桌面系统(pulseaudio)
5.1、pulseaudio简介
pulseaudio 是一个跨平台的音频服务器。pulseaudio 像一个”声音服务器”,坐在应用程序和音频硬件之间,对流经其上的所有音频流进行控制和处理。
提供高级的功能如:
- 声音路由
- 格式转换
- 声音混合
- 音量控制
5.2、pulseaudio配置
5.2.1、HiFi.conf文件作用以及存放路径
在文件系统/usr/share/alsa/ucm/目录下添加rockchip,es8326-codec文件夹,文件夹下有HiFi.conf和rockchip,es8326-codec.conf文件。
文件HiFi.conf作用
其主要作用是配置声卡的输入与输出路径,配置播放与录音的控件设置,以便于让用户有更好的声音体验。
5.2.2、编写es8326配置文件
HiFi.conf
# Use case for devices on rockchip,es8326-codec card.
SectionVerb {
EnableSequence [
cdev "hw:rockchipes8326c"
]
DisableSequence [
cdev "hw:rockchipes8326c"
]
}
SectionDevice."Headphone" {
Comment "Headphones Playback"
EnableSequence [
cdev "hw:rockchipes8326c"
]
DisableSequence [
cdev "hw:rockchipes8326c"
]
Value {
PlaybackPCM "hw:rockchipes8326c"
PlaybackChannels "2"
PlaybackPriority "1"
JackControl "Headphones Jack"
JackHWMute "Speaker"
}
}
SectionDevice."Speaker" {
Comment "Speaker Playback"
EnableSequence [
cdev "hw:rockchipes8326c"
]
DisableSequence [
cdev "hw:rockchipes8326c"
]
Value {
PlaybackPCM "hw:rockchipes8326c"
PlaybackChannels "2"
PlaybackPriority "2"
}
}
SectionDevice."Headset" {
Comment "Headset Mic"
ConflictingDevice [
"MainMic"
]
EnableSequence [
cdev "hw:rockchipes8326c"
]
DisableSequence [
cdev "hw:rockchipes8326c"
]
Value {
CapturePCM "hw:rockchipes8326c"
CaptureChannels "2"
JackControl "Mic Jack"
JackHWMute "MainMic"
}
}
SectionDevice."MainMic" {
Comment "Main Mic"
ConflictingDevice [
"Headset"
]
EnableSequence [
cdev "hw:rockchipes8326c"
]
DisableSequence [
cdev "hw:rockchipes8326c"
]
Value {
CapturePCM "hw:rockchipes8326c"
CaptureChannels "2"
}
} ```
HiFi.conf文件内容分析:
- SectionVerb:平台相关信息
- Comment:pulseaudio识别的输出输入设备名称
- EnableSequence:es8326使能,配置音频设备的连接和属性。
- Value:配置音频格式和采样率等参数。
rockchip,es8326-codec.conf
这个是给pulseaudio提供配置文件的地址,一般和HiFi.conf在同一个路径下。
SectionUseCase."HiFi" {
File "HiFi.conf"
Comment "Play HiFi quality Music."
}
5.3、pulseaudio测试
- 静音设置
看是否能够实现静音功能。 - 调节音量功能
使用鼠标拖动滑动条来调节音量大小,播放音频、视频看是否能够调节音量的大小。
5.4、常见的问题
1、pulseaudio配置文件相关路径,这个需要参考 Android 系统文档和设备厂商提供的文档来了解特定版本和设备的配置规则。
2、pulseaudio不能调节引量调节大小,查看Hifi.conf文件是否按要求配置,查看播放、录音的路径是否正确。
3、PulseAudio 和 amixer 都可以改变底层硬件寄存器的值,但它们的实现方式和使用场景有所不同。PulseAudio 提供了更高级的音频管理功能,而 amixer 则提供了更底层和直接的控制能力。选择使用哪个工具取决于你的需求和具体的使用环境。所以测试时会发现两者修改寄存器不是同一个寄存器。