Audio
介绍Audio的功能和使用方法。
模块介绍
Audio模块包含2个I2S,1个HDMIAUDIO。
功能介绍
ALSA音频框架可以分为以下几个层次:
- ALSA Library
对应用程序提供统一的API接口,各个APP应用程序只要调用 alsa-lib 提供的 API接口来实现放音、录音、控制。现在提供了两套基本的库,tinyalsa是一个简化的alsa-lib库,Android系统主要使用 - ALSA CORE
ALSA核心层,向上提供逻辑设备(PCM/CTL/MIDI/TIMER/…)系统调用,向下驱动硬件设备(Machine/I2S/DMA/CODEC) - ASoC Core
ALSA 的标准框架,是 ALSA-driver 的核心部分,提供了各种音频设备驱动的通用方法和数据结构 - Hardware driver
音频硬件设备驱动,由三大部分组成,分别是 Machine、Platform、Codec,提供的 ALSA Driver API 和相应音频设备的初始化及工作流程,实现具体的功能组件,这是驱动开发人员需要具体实现的部分。
Machine:一般是指某款单板,包含特定的外设,为CPU、Codec提供了一个载体,Machine驱动几乎是不可重 用的。Machine驱动将Platform驱动和Codec驱动关联在一起,通过snd_soc_dai_link指定使用哪个Platform驱动,使用哪个Soc端的dai(digital audio interface)接口,使用哪个Codec驱动,使用Codec上的哪个dai接口,同时也做一些特定于单板的操作。
Platform:一般是指某一个SoC平台,可以理解为某款Soc,具有I2S,AC97音频接口等,内部有时钟,DMA单元用于传输音频数据。Platform驱动只与特定的Soc有关,实现Soc的音频DMA驱动和Soc端的dai接口驱动,它只与SoC相关,与Machine无关,这样我们就可以把Platform抽象出来,使得同一款SoC不用做任何的改动,就可以用在不同的Machine中。
Codec:音频编解码器,Codec里面包含了I2S接口、D/A、A/D、Mixer、PA(功放),通常包含多种输入(Mic、Line-in、I2S、PCM)和多个输出(耳机、喇叭、听筒,Line-out),一般Soc可通过I2C来控制codec芯片。Codec驱动只与Codec编解码器驱动有关,与Soc和Machine无关。Codec和Platform一样,要实现为可重用的部件,同一个Codec可以被不同的Machine使用。
音频方案介绍
K1目前支持两种音频声卡方案
方案一:HDMIAUDIO,支持播放
方案二:I2S0搭配一个I2C外挂的Codec ES8326B,支持播放和录制
源码结构介绍
I2S/HDMIAUDIO控制器驱动代码在sound/soc/spacemit目录下:
sound/soc/spacemit
├── Kconfig
├── Makefile
├── spacemit-dummy-codec.c #dummy codec,配合hdmiaudio创建声卡
├── spacemit-snd-card.c #声卡驱动
├── spacemit-snd-i2s.c #i2s驱动
├── spacemit-snd-i2s.h
├── spacemit-snd-pcm-dma.c #platform驱动,主要是pcm相关
├── spacemit-snd-sspa.c #hdmiaudio驱动
├── spacemit-snd-sspa.h
Codec ES8326B驱动代码在sound/soc/codec目录下:
sound/soc/codec
├── es8326.c
├── es8326.h
I2S
关键特性
支持48000采样率,16bit采样深度,2声道
支持播放和录制功能
支持全双工