Tina_Linux_音频_开发指南
Posted 韦东山
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tina_Linux_音频_开发指南相关的知识,希望对你有一定的参考价值。
文章目录
- OpenRemoved_Tina_Linux_音频_开发指南
- 1 概述
- 2 模块介绍
- 2.5 R11音频接口
- 2.6 R16音频接口
- 2.7 R18音频接口
- 2.8 R30音频接口
- 2.9 R328音频接口.
- 2.20 V853音频接口
- 2.21 F133音频接口
- 3 3常用工具及调试方法
- 4 4常用接口说明
- 5 开机音乐功能
- 6 各平台音频模块注意事项
- 5 开机音乐功能
- 6 各平台音频模块注意事项
OpenRemoved_Tina_Linux_音频_开发指南
1 概述
1.1 编写目的
介绍Tina平台音频模块的使用方法。
1.2 适用范围
Allwinner软件平台Tina。
Allwinner 硬件平台R6, R7s, R11, R16, R18, R30, R58, R328, R332, R333, R311, MR133, T7, R329, MR813, R818, R818B, R528, H133, V853, F133。
1.3 相关人员
Tina平台下进行音频模块开发的工程师。
1.4 相关术语
术语 | 解释说明 |
---|---|
ALSA | Advanced Linux Sound Architecture |
DMA | 直接内存存取,指数据不经cpu,直接在设备和内存,内存和内存,设备和设备之间传输 |
ASoC | ALSA System on Chip |
样本长度sample | 样本是记录音频数据最基本的单位,常使用 16 位 |
通道数channel | 该参数为 1 表示单声道, 2 则是立体声 |
帧frame | 帧记录了一个声音单元,其长度为样本长度与通道数的乘积 |
采样率rate | 每秒钟采样次数,该次数是针对帧而言 |
周期period | 音频设备一次处理所需要的帧数,对于音频设备的数据访问以及音频数据的存储,都是以此为单位 |
交错模式interleaved | 是一种音频数据的记录模式,在交错模式下,数据以连续帧的形式存放,即首先记录完帧1 的左声道样本和右声道样本(假设为立体声格式),再开始帧2 的记录,而在非交错模式下,首先记录的是一个周期内所有帧的左声道样本,再记录右声道样本,数据是以连续通道的方式存储。不过多数情况下,我们只需要使用交错模式就可以了 |
AudioCodec | 芯片内置音频接口 |
Daudio | 数字音频接口,可配置成I2S/PCM 标准音频接口 |
Dmic | 数字麦接口 |
MAD | Mic Activity Detector, 语音能量检测模块 |
AGC | Automatic Gain Control |
DRC | Dynamic Range Control |
2 模块介绍
Linux中的音频子系统采用ALSA架构实现。ALSA目前已经成为了Linux的主流音频体系结构。在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。
2.1 驱动框架
Tina SDK对各个平台的音频设备驱动均采用ASoC架构实现。ASoC是建立在标准alsa驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频codec的一套软件体系,ASoC将音频系统分为 3 部分:Codec,Platform和Machine。
-
Codec驱动
ASoC中的一个重要设计原则就是要求Codec驱动是平台无关的,它包含了一些音频的控件
(Controls),音频接口,DAMP(动态音频电源管理)的定义和某些Codec IO功能。为了保证
硬件无关性,任何特定于平台和机器的代码都要移到Platform和Machine驱动中。
所有的Codec驱动都要提供以下特性:- Codec DAI (Digital Audio Interface)和PCM的配置信息; - Codec的IO控制方式(I2C,SPI等); - Mixer和其他的音频控件; - Codec和ALSA音频操作接口;
-
Platform驱动
它包含了该SoC平台的音频DMA和音频接口的配置和控制(I2S,PCM,AC97等等);
一般不包含与板子或codec相关的代码。 -
Machine驱动单独的Platform和Codec驱动是不能工作的,它必须由Machine驱动把它们结合在一起才能完成整个设备的音频处理工作。
2.2 音频接口介绍.
我们提供的音频接口有:
- AudioCodec
- Daudio(I2S)
- Dmic
- Spdif
- MAD
不同芯片平台的音频接口资源会有差异;不同版本的内核,对应的ALSA驱动也有所不同;下面会对各个芯片作详细介绍。
2.3 R6音频接口
2.3.1 硬件资源
R6包含 2 个音频模块,分别是内置audiocodec以及daudio0。
2.3.2 时钟源
R6中, 2 个音频模块的时钟源均来自pll_audio。
pll_audio可以输出24.576M或者22.5792M的时钟,分别支持48k系列,44.1k系列的播放录音。
2.3.3 代码结构
linux-3.10/sound/soc/sunxi/
├── sun3iw1_ac101.c // daudio+ac101的machine驱动
├── sun3iw1_codec.c // codec 驱动
├── sun3iw1_codec.h
├── sun3iw1_daudio.c // daudio的platform驱动
├── sun3iw1_daudio.h
├── sun3iw1_sndcodec.c // codec machine驱动
├── sunxi_cpudai.c // codec platform驱动
├── sunxi_cpudai.h
├── sunxi_dma.c //通用文件,提供注册platform驱动的接口及相关函数集
├── sunxi_dma.h
├── sunxi_rw_func.c //通用文件,读写模拟/数字寄存器的接口
└── sunxi_rw_func.h
linux-3.10/sound/soc/codecs/
├── ac101.c // daudio+ac101的codec驱动
└── ac101.h
2.3.4 Audiocodec.
硬件特性
-
两路DAC
- 支持16bit,24bit采样精度
- 支持8KHz~192KHz采样率
-
一路ADC
- 支持16bit,24bit采样精度
- 支持8KHz~48KHz采样率
-
一路模拟输出:一路立体声headphone输出(HPL, HPR)
-
四路模拟输入:MIC,FMINL,FMINR,LINEIN
-
支持同时playback和record(全双工模式)
2.3.4.1 内核配置
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
<*> ASoC support for SUNXI --->
<*> ASoC support for sun3iw1 audiocodec
<*> ASoC support for internal-codec cpudai
<*> ASoC support for sun3iw1 audiocodec machine
2.3.4.2 sys_config配置.
[sndcodec]
sndcodec_used = 0x1
;------------------------------------------------------------------------------
[cpudai]
cpudai_used = 0x1
;------------------------------------------------------------------------------
[codec]
codec_used = 0x1
headphonevol = 0x3b
maingain = 0
pa_sleep_time = 30
gpio-spk = port:PD03<1><1><default><default>
gpio_shdn = 1
sndcodec配置,即machine驱动的相关配置。
sndcodec配置 | sndcodec配置说明 |
---|---|
sndcodec_used | 是否使用sndcodec驱动。 0 :不使用; 1 :使用 |
cpudai配置,即platform驱动的相关配置。
cpudai配置 | cpudai配置说明 |
---|---|
cpudai_used 是否使用cpudai驱动。 | 0 :不使用; 1 :使用 |
codec配置,即内置audiocodec驱动的相关配置。
codec配置 | codec配置说明 |
---|---|
codec_used | 是否使用codec驱动。 0 :不使用; 1 :使用 |
headphonevol | headphone volume,可设定范围0~0x3f, 0表示mute, 163表示-62dB0dB, 1dB/step |
micgain | mic增益,可设定范围0~0x7, 0:0dB, 17:1533dB, 3dB/step,一般设置0x4,即24dB.如果作为aec回路,则需要设置为0dB |
pa_sleep_time | 操作PA之后的延时时间(用来避免pop音),单位ms |
gpio-spk | PA使能引脚 |
gpio_shdn | PA引脚使能方式。0:低电平有效; 1 :高电平有效 |
说明
- 如果想要正常加载audiocodec 声卡, 需要把codec,platform,machine 驱动都选上, 即codec_used,cpudai_used,sndcodec_used 都置为1;
- headphonevol 等值会在驱动初始化的时候设置,进入系统后还可以通过amixer 工具对应控件进行再次修改;
- 注意gpio-spk 是否配置正确,是否有其他模块复用了该gpio;
- 除了gpio-spk 指定pa 使能引脚外,驱动中也会检测gpio_num 字段,所以可以直接将gpio 号赋值gpio_num;
- 注意gpio_shdn,实际功放的PA 引脚是高电平有效,还是低电平有效
2.3.4.3 codec数据通路
R6平台的audiocodec驱动会在播歌的时候自动设置相关通路,默认audio map:
播歌
DACL --> HP_L Mux --> HPOUTL
DACR --> HP_R Mux --> HPOUTR
录音功能则根据需要操作对应空间使能通路:
录制单MIC数据
MICIN --> ADC Mixer -> ADC
录制内部AEC数据(不需要外围回采电路)
Left Output Mixer --> ADC Mixer -> ADC
Right Output Mixer --> ADC Mixer -> ADC
R6相关控件如下表:
控件名称 | 功能 | 数值 |
---|---|---|
ADC INPUT GAIN control | ADC增益 | 0–7,表示-4.5–6dB |
ADC MIC Boost AMP | enMIC Boost AMP使能 | 0:关闭; 1:开启 |
ADC MIC Boost AMP | gain control MIC增益 | 0–7, 0:0dB, 1~7:15–33dB |
ADC PA speed select | PA速度选择 0:normal; 1:fast | |
ADC mixer mute for FML | ADC Mixer设置,使能FML通路 | 0:关闭; 1:开启 |
ADC mixer mute for FMR | ADC Mixer设置,使能FMR通路 | 0:关闭; 1:开启 |
ADC mixer mute for left output | ADC Mixer设置,使能left output Mixer通路 | 0:关闭; 1:开启 |
ADC mixer mute for linein | ADC Mixer设置,使能linein通路 | 0:关闭; 1:开启 |
ADC mixer mute for mic | ADC Mixer设置,使能mic通路 | 0:关闭; 1:开启 |
ADC mixer mute for right output | ADC Mixer设置,使能right output Mixer通路 | |
LINEIN GAIN control | linein到output mixer的增益 | 0–7, 0~7:0–14dB,2dB/step |
MICIN GAIN control | MIC到outpu mixer的增益 0–7,表示-4.5–6dB | |
dac digital volume | DAC数字音量 063,表示0-73.08dB,-1.16dB/step | |
head phone volume | headphone音量 | 0 表示mute, 163表示-62dB0dB, -1dB/step |
录音通路设置举例:
- 录音单声道数据
通过MICIN录音:
amixer -D hw:audiocodec cset name='ADC MIC Boost AMP en' 1
amixer -D hw:audiocodec cset name='ADC mixer mute for mic' 1
amixer -D hw:audiocodec cset name='ADC MIC Boost AMP gain control' 4
- 内部AEC(可省去外部AEC电路)
amixer -D hw:audiocodec cset name='ADC mixer mute for left ouput' 1
2.3.5 Daudio.
硬件特性
- 一路I2S/PCM;
- 支持主从模式
- 支持Left-justified,Right-justified,Standar mode I2S,PCM mode
- 支持i2s,pcm协议格式配置
- 支持mono和stereo模式,最高支持 2 通道
- 支持同时playback和record(全双工模式)
- 支持8~192KHz采样率
- 支持16,24,32bit采样精度
2.3.5.1 内核配置
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
<*> ASoC support for SUNXI --->
<*> ASoC support for daudio platform
<*> ASoC support for sun3iw1 & ac101 daudio machine
2.3.5.2 sys_config配置.
[snddaudio0]
snddaudio0_used = 1
over_sample_rate = 128
[daudio0]
daudio0_used = 1
word_select_size = 32
pcm_sync_period = 32
pcm_lsb_first = 0
over_sample_rate = 128
slot_width_select = 16
pcm_sync_type = 0
pcm_start_slot = 0
tdm_config = 1
snddaudio0配置,即daudio0 machine驱动的相关配置
snddaudio配置 | snddaudio配置说明 |
---|---|
snddaudio0_used | 是否使用snddaudio驱动。 0 :不使用; 1 :使用 |
over_sample_rate | 支持128fs/192fs/256fs/384fs/512fs/768fs |
daudio0配置,即daudio0 platform驱动的相关配置
snddaudio配置 | snddaudio配置说明 |
---|---|
daudio0_used | 是否使用daudio驱动。 0 :不使用; 1 :使用 |
word_select_size | 支持16bits/20bits/24bits/32bits |
pcm_sync_period | 16/32/64/128/256 |
snddaudio配置 | snddaudio配置说明 |
---|---|
pcm_lsb_first | 0: msb first; 1: lsb first |
over_sample_rate | 支持128fs/192fs/256fs/384fs/512fs/768fs |
slot_width_select | 16bits/20bits/24bits/32bits |
pcm_sync_type | 0: long frame sync; 1: short frame sync |
pcm_start_slot | 0: 1st slot; 1: 2nd slot; 2: 3th slot; 3:4th slot |
tdm_config | 0:pcm 1:i2s |
2.3.6 外挂codec:AC101
R6标案使用的AC101作双声道录音,audiocodec则录制回路作AEC下面对R6如何配置使
用AC101作简单介绍
2.3.6.1 内核配置
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
<*> AC101 Codec
<*> ASoC support for SUNXI --->
<*> ASoC support for daudio platform
<*> ASoC support for sun3iw1 & ac101 daudio machine
2.3.6.2 sys_config&dts配置.
R6通过TWI1控制AC101,而I2S0用于音频数据的传输
TWI部分配置,可通过dts进行配置:
linux-3.10/arch/arm/boot/dts/sun3iw1p1-sitar-mic2.dts
twi1: twi@0x01c27400
ac101@1a
compatible = "x-powers,ac101";
reg = <0x1a>;
audio_int_ctrl = <&pio PL 12 6 1 1 0>;
audio_pa_ctrl = <&pio PG 13 1 1 1 0>;
speaker_val = <0x1b>;
headset_val = <0x3b>;
single_speaker_val = <0x19>;
double_speaker_val = <0x1b>;
speaker_double_used = <1>;
earpiece_val = <0x1e>;
mainmic_val = <0x4>;
headsetmic_val = <0x4>;
dmic_used = <0>;
adc_digital_val = <0xb0b0>;
agc_used = <0>;
drc_used = <1>;
linein_to_spk_used = <0>;
linein_to_hp_used = <0>;
linein_to_aif2_used = <0>;
;
I2S部分配置可以通过dts配置,也可以通过sys_config覆盖dts的配置
[snddaudio0]
snddaudio0_used = 1
over_sample_rate = 128
sunxi,snddaudio-codec = "ac101.1-001a"
sunxi,snddaudio-codec-dai = "ac101"
[daudio0]
daudio0_used = 1
word_select_size = 32
pcm_sync_period = 32
pcm_lsb_first = 0
over_sample_rate = 128
slot_width_select = 16
pcm_sync_type = 0
pcm_start_slot = 0
tdm_config = 1
i2s相关格式需要根据AC101 spec进行配置
而snddaudio0中,注意codec的名称,需要与实际AC101的dev name相匹配,而codec-dai名称则与AC101驱动中设置的dai name相匹配
2.3.7 标案音频测试方法
该章节主要介绍在标案上进行播歌,录音的测试命令。
2.3.7.1 播放
如《R6 AudioCodec数据通路》章节所说,驱动代码中已固定配置了播放通路进入系统后直接通过aplay工具进行播放即可,如:
aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav
可通过下面命令调节硬件上的模拟音量:
amixer -Dhw:audiocodec cset name='headphone volume' 50
2.3.7.2 录音
标案使用AC101进行双声道录音录音前需要配置AC101的音频通路,SDK默认在启动时会进行设置,相关配置脚本在:
/etc/init.d/rc.final
可以直接通过arecord命令进行录音:
arecord -Dhw:sndac1011001a -f S16_LE -r 16000 -c 2 /tmp/test.wav
2.4 R7s音频接口
2.4.1 硬件资源
R7s包含 2 个音频模块,分别是内置AudioCodec以及Daudio0。
2.4.2 时钟源
R7s中, 2 个音频模块的时钟源均来自pll_audio。
pll_audio可以输出24.576M或者22.5792M的时钟,分别支持48k系列,44.1k系列的播放录音。
2.4.3 代码结构
linux-4.9/sound/soc/sunxi/
├── sunxi-pcm.c //提供注册platform驱动的接口及相关函数集
├── sunxi-pcm.h
├── sun8iw8
│ ├── sunxi_codec.c // cpudai驱动
│ ├── sunxi_codecdma.c // codec platform驱动
│ ├── sun8iw8_sndcodec_new.c // codec驱动
│ └── sunxi_sndcodec.c // codec machine驱动
├── sunxi-daudio.c // daudio platform驱动
└── sunxi-snddaudio.c // daudio machine驱动
linux-4.9/sound/soc/soc-utils.c // daudio codec驱动
2.4.4 Audiocodec.
硬件特性
-
两路DAC
- 支持16bit,24bit采样精度
- 支持8KHz~192KHz采样率
-
两路ADC
- 支持16bit,24bit采样精度
- 支持8KHz~48KHz采样率
-
两路模拟输出:
- 一路立体声LINEOUT输出(LINEOUTP, LINEOUTN)
- 一路立体声headphone输出(HPOUTL, HPOUTR)
-
两路模拟输入:MIC1,MIC2
- 支持同时playback和record(全双工模式)
- 支持ADC的AGC,DRC功能
- 支持DAC的DRC功能
2.4.4.1 内核配置
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
<*> Audiocodec for the SUNXI chips
2.4.4.2 sys_config配置.
[codec]
headphone_vol = 0x3b
lineout_vol = 0x1a
audio_pa_ctrl = port:PB05<1><default><default><0>
adcagc_used = 0
adcdrc_used = 0
dacdrc_used = 0
adchpf_used = 0
dachpf_used = 0
codec配置 | codec配置说明 |
---|---|
headphone_vol | headphone volume,可设定范围0~0x3f, 0表示mute, 163表示-62dB0dB, 1dB/step |
audio_pa_ctrl | PA使能引脚 |
adcagc_used | 1:use adcagc 0:no use |
adcdrc_used | 1:use adcdrc 0:no use |
dacdrc_used | 1:use dacdrc 0:no use |
adchpf_used | 1:use adchpf 0:no use |
dachpf_used | 1:use dachpf 0:no use |
2.4.4.3 codec数据通路
播歌
DACL --> Left Output Mixer --> LINEOUTL
DACR --> Right Output Mixer --> LINEOUTR
录音
MIC1P --> LADC input Mixer --> ADCL
MIC2P --> RADC input Mixer --> ADCR
控件名称 | 功能 | 数值 |
---|---|---|
Lineout volume | lineout音量设置 | 0–31,表示-43.5–0dB |
ADC input gain control | ADC增益 0–7,表示-4.5–6dB | |
HP_L Mux HP_L | Mux设置 | 0:DACL HPL Switch; 1:MIXER_L Switch |
HP_R Mux HP_R | Mux设置 | 0:DACR HPR Switch; 1:MIXER_R Switch |
LADC input Mixer MIC1 boost Switch | LADC input Mixer设置,使能MIC1通路 | 0:关闭; 1:开启 |
LADC input Mixer MIC2 boost Switch | LADC input Mixer设置,使能MIC2通路 | 0:关闭; 1:开启 |
LADC input Mixer l_output mixer Switch | LADC input Mixer设置,使能l_output通路 | 0:关闭; 1:开启 |
LADC input Mixer r_output mixer Switch | LADC input Mixer设置,使能r_output通路 | 0:关闭; 1:开启 |
Left Output Mixer DACL Switch | Left Output Mixer设置,使能DACL通路 | 0:关闭; 1:开启 |
Left Output Mixer DACR Switch | Left Output Mixer设置,使能DACR通路 | 0:关闭; 1:开启 |
Left Output Mixer MIC1Booststage Switch | Left Output Mixer设置,使能MIC1通路 | 0:关闭; 1:开启 |
Left Output Mixer MIC2Booststage Switch | Left Output Mixer设置,使能MIC2通路 | 0:关闭; 1:开启 |
MIC1 boost AMP gain control | MIC1增益 | 0–7, 0:0dB,1~7:24–42dB,3dB/step |
MIC1_G boost stageoutput mixer control | MIC1 to L or R output Mixer增益 | 0–7,表示-4.5–6dB |
MIC2 SRC | MIC2 SRC设置 | 0:MIC3; 1:MIC2 |
MIC2 boost AMP gain control | MIC2增益 | 0–7, 0:0dB,1~7:24–42dB,3dB/step |
MIC2_G boost stage output mixer control | MIC2 to L or R output Mixer增益 | 0–7,表示-4.5–6dB |
RADC input Mixer MIC1 boost Switch | RADC input Mixer设置,使能MIC1通路 | 0:关闭; 1:开启 |
RADC input Mixer MIC2 boost Switch | RADC input Mixer设置,使能MIC2通路 | 0:关闭; 1:开启 |
RADC input Mixer l_output mixer Switch | RADC input Mixer设置,使能l_output通路 | 0:关闭; 1:开启 |
RADC input Mixer r_output mixer Switch | RADC input Mixer设置,使能r_output通路 | 0:关闭; 1:开启 |
Right Output Mixer DACL Switch | Right Output Mixer设置,使能DACL通路 | 0:关闭; 1:开启 |
Right Output Mixer DACR Switch | Right Output Mixer设置,使能DACR通路 | 0:关闭; 1:开启 |
Right Output Mixer MIC1Booststage Switch | Right Output Mixer设置, 使能MIC1通路 | 0:关闭; 1:开启 |
Right Output Mixer MIC2Booststage Switch | Right Output Mixer设置,使能MIC2通路 | 0:关闭; 1:开启 |
SPK_L Mux | SPK_L Mux设置 | 0:MIXER_L Switch; 1:MIXR+MIXL |
SPK_R Mux | SPK_R Mux设置 | 0:MIXER_L Switch; 1:MIXR+MIXL |
digital volume | 数字音量设置 | 0–63,表示-73.08–0dB |
headphone volume | headphone音量设置 | 0–63,0表示mute; 1~63表示-62dB–0dB |
通路设置举例:
- 播放通路
通过lineout播放:
amixer -D hw:audiocodec cset name='SPK_L Mux' 1
amixer -D hw:audiocodec cset name='SPK_R Mux' 1
amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1
amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1
amixer -D hw:audiocodec cset name='digital volume' 6
- 录音通路
通过MIC1,MIC2录音:
amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1
amixer -D hw:audiocodec cset name='RADC input Mixer MIC2 boost Switch' 1
amixer -D hw:audiocodec cset name='MIC2 SRC' 0
amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4
amixer -D hw:audiocodec cset name='MIC2 boost AMP gain control' 4
2.4.5 Daudio.
硬件特性
- 一路I2S/PCM;
- 支持主从模式
- 支持Left-justified,Right-justified,Standar mode I2S,PCM mode
- 支持i2s,pcm协议格式配置
- 支持mono和stereo模式
- 支持同时playback和record(全双工模式)
- 支持8~192KHz采样率
- 支持16,24,32bit采样精度
2.4.5.1 内核配置
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
<*> Allwinner Digital Audio Support
2.4.5.2 sys_config配置.
[tdm0]
daudio_used = 0
daudio_master = 4
daudio_select = 1
audio_format = 1
signal_inversion = 1
sample_resolution = 16
slot_width_select = 16
pcm_lrck_period = 32
pcm_lrckr_period = 1
msb_lsb_first = 0
sign_extend = 0
tx_data_mode = 0
rx_data_mode = 0
;i2s_mclk = port:PB08<2><1><default><default>
i2s_bclk = port:PG11<2><1><default><default>
i2s_lrclk = port:PG10<2><1><default><default>
i2s_dout0 = port:PG12<2><1><default><default>
i2s_dout1 =
i2s_dout2 =
i2s_dout3 =
i2s_din = port:PG13<2><1><default><default>
tdm0配置 | tdm0配置说明 |
---|---|
daudio_master | 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作为slave, codec作为master2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRMmaster),一般不用3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frameslave),一般不用4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作为master, codec作为slave |
daudio_select | 0: pcm mode; 1: i2s mode |
audio_format | 1: SND_SOC_DAIFMT_I2S(standard i2s format)2: SND_SOC_DAIFMT_RIGHT_J(right justfied format)3: SND_SOC_DAIFMT_LEFT_J(left justfied format)4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2ndBCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1ndBCLK rising edge after LRC rising edge) |
signal_inversion | 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame)2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM)3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM)4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM) |
sample_resolution | 采样精度,16bit, 24bit,32bit |
slot_width_select | 支持8bit, 16bit, 32bit宽度 |
pcm_lrck_period | 可配置16/32/64/128/256个bclk |
pcm_lrckr_period | 可配置16/32/64/128/256个bclk |
msb_lsb_first | 0: msb first; 1: lsb first |
sign_extend | 0: zero pending; 1: sign extend |
tx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
rx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
i2s_bclk | i2s_bclk引脚 |
i2s_lrclk | i2s_lrclk引脚 |
i2s_dout0 | i2s_dout引脚 |
i2s_din | i2s_din引脚 |
2.4.6 标案音频测试方法
该章节主要介绍在标案上进行播歌,录音的测试命令。
2.4.6.1 播放
amixer -D hw:audiocodec cset name='SPK_L Mux' 1
amixer -D hw:audiocodec cset name='SPK_R Mux' 1
amixer -D hw:audiocodec cset name='Lineout volume' 24
amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1
amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1
amixer -D hw:audiocodec cset name='digital volume' 0
aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav
可通过下面命令调节硬件上的模拟音量:
amixer -Dhw:audiocodec cset name='Lineout volume' 50
2.4.6.2 录音
表示下使用audiocodec进行MIC1,MIC2录音。
amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1
amixer -D hw:audiocodec cset name='RADC input Mixer MIC2 boost Switch' 1
amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4
amixer -D hw:audiocodec cset name='MIC2 SRC' 0
amixer -D hw:audiocodec cset name='MIC2 boost AMP gain control' 4
arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 /tmp/test.wav
2.5 R11音频接口
2.5.1 硬件资源
R11包含 2 个音频模块,分别是内置AudioCodec以及Daudio0。
2.5.2 时钟源
R11中, 2 个音频模块的时钟源均来自pll_audio。
pll_audio可以输出24.576M或者22.5792M的时钟,分别支持48k系列,44.1k系列的播放录音。
2.5.3 代码结构
linux-3.4/sound/soc/sunxi/
├── audiocodec
│ ├── sun8iw8_sndcodec_new.c // codec 驱动
│ ├── sun8iw8_sndcodec.h
│ ├── sunxi_codec.c // cpu dai驱动
│ ├── sunxi_sndcodec.c // codec machine驱动
│ ├── sunxi_codecdma.c // codec platform驱动
│ └── sunxi_codecdma.h
└── daudio0
├── snddaudio0.c // daudio codec驱动
├── sunxi-daudio0.c // daudio cpu dai驱动
├── sunxi-daudio0.h
├── sunxi-daudiodma0.c // daudio platform 驱动
├── sunxi-daudiodma0.h
└── sunxi-snddaudio0.c // daudio machine驱动
2.5.4 AudioCodec
硬件特性
-
两路DAC
- 支持16bit,24bit采样精度
- 支持8KHz~192KHz采样率
-
两路ADC
- 支持16bit,24bit采样精度
- 支持8KHz~48KHz采样率
-
一路模拟输出:一路立体声LINEOUT输出(LINEOUTP, LINEOUTN)
-
一路路模拟输入:MIC1
-
支持同时playback和record(全双工模式)
-
支持ADC的AGC,DRC功能
-
支持DAC的DRC功能
2.5.4.1 内核配置
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
<*> Audiocodec for the SUNXI chips
<*> Audiocodec Machine for codec chips
<*> Audiocodec for the SUN8IW8 chips
2.5.4.2 sys_config配置.
[audio0]
headphone_vol = 0x3b
lineout_vol = 0x1a
audio_pa_ctrl = port:PB05<1><default><default><0>
audio_pa_active_level = 1
adcagc_used = 0
adcdrc_used = 0
dacdrc_used = 0
adchpf_used = 0
dachpf_used = 0
audio0配置 | audio0配置说明 |
---|---|
headphone_vol | headphone volume,可设定范围0~0x3f, 0表示mute,163表示-62dB0dB, 1dB/step |
lineout_vol | lineout volume,可设定范围0~0x1f, 0或者 1 表示mute,231表示-43.5dB0dB, 1.5dB/step |
audio_pa_ctrl | PA使能引脚 |
audio_pa_active_level | 1:high level active; 0:low level active |
adcagc_used | 1:use adcagc 0:no use |
adcdrc_used | 1:use adcdrc 0:no use |
dacdrc_used | 1:use dacdrc 0:no use |
adchpf_used | 1:use adchpf 0:no use |
dachpf_used | 1:use dachpf 0:no use |
2.5.4.3 codec数据通路
播歌
DACL --> Left Output Mixer --> LINEOUTL
DACR --> Right Output Mixer --> LINEOUTR
录音
MIC1P --> LADC input Mixer --> ADCL
控件名称 | 功能 | 数值 |
---|---|---|
Lineout volume | lineout 音量设置0–31, 表示-43.5–0dB | |
ADC input gain control | ADC 增益0–7, 表示-4.5–6dB | |
LADC input Mixer MIC1 boost Switch | LADC input Mixer 设置,使能MIC 通路 0: 关闭; 1: 开启 | |
Left Output Mixer DACL Switch | Left Output Mixer 设置,使能DACL 通路 0: 关闭; 1: 开启 | |
Left Output Mixer DACR Switch | Left Output Mixer 设置,使能DACR 通路 0: 关闭; 1: 开启 | |
Left Output Mixer MIC1Booststage Switch | Left Output Mixer 设置,使能MIC1 通路 0: 关闭; 1: 开启 | |
MIC1 boost AMP gain control | MIC1 增益0–7, 0:0dB, 1~7:24–42dB,3dB/step | |
MIC1_G boost stage output mixer control | MIC1 to L or R output Mixer 增益0–7, 表示-4.5–6dB | |
Right Output Mixer DACL Switch | Right Output Mixer 设置,使能DACL 通路 | 0: 关闭; 1: 开启 |
Right Output Mixer DACR Switch | Right Output Mixer 设置, 使能DACR 通路 0: 关闭; 1: 开启 | |
Right Output Mixer MIC1Booststage Switch | Right Output Mixer 设置, 使能MIC1 通路 0: 关闭; 1: 开启 | |
SPK_L Mux SPK_L Mux | 设置0:MIXER_L Switch; 1:MIXR+MIXL | |
SPK_R Mux SPK_R Mux | 设置0:MIXER_L Switch; 1:MIXR+MIXL | |
digital volume | 数字音量设置0–63, 表示-73.08–0dB |
通路设置举例:
- 播放通路
通过lineout播放:
amixer -D hw:audiocodec cset name='SPK_L Mux' 1
amixer -D hw:audiocodec cset name='SPK_R Mux' 1
amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1
amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1
amixer -D hw:audiocodec cset name='digital volume' 0
- 录音通路
通过MIC1录音:
amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1
amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4
2.5.5 Daudio.
硬件特性
- 一路I2S/PCM;
- 支持主从模式
- 支持Left-justified,Right-justified,Standar mode I2S,PCM mode
- 支持i2s,pcm协议格式配置
- 支持mono和stereo模式,最高支持 2 通道
- 支持同时playback和record(全双工模式)
- 支持8~192KHz采样率
- 支持16,24,32bit采样精度
2.5.5.1 内核配置
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
<*> SoC daudio0 tdm interface for SUNXI chips
<*> Daudio0 Public Machine for SUNXI chips
2.5.5.2 sys_config配置.
[tdm0]
daudio_used = 1
daudio_master = 4
daudio_select = 1
audio_format = 1
signal_inversion = 1
sample_resolution = 16
slot_width_select = 16
pcm_lrck_period = 32
pcm_lrckr_period = 1
msb_lsb_first = 0
sign_extend = 0
tx_data_mode = 0
rx_data_mode = 0
;i2s_mclk = port:PB08<2><1><default><default>
i2s_bclk = port:PG11<2><1><default><default>
i2s_lrclk = port:PG10<2><1><default><default>
i2s_dout0 = port:PG12<2><1><default><default>
i2s_dout1 =
i2s_dout2 =
i2s_dout3 =
i2s_din = port:PG13<2><1><default><default>
tdm0配置 | tdm0配置说明 |
---|---|
daudio_master | 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作为slave, codec作为master2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRMmaster),一般不用3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frameslave),一般不用4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作为master, codec作为slave |
daudio_select | 0: pcm mode; 1: i2s mode |
deaudio_format | 1: SND_SOC_DAIFMT_I2S(standard i2s format)2: SND_SOC_DAIFMT_RIGHT_J(right justfied format)3: SND_SOC_DAIFMT_LEFT_J(left justfied format)4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2ndBCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge) |
signal_inversion | 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame)2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM)3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM)4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM) |
sample_resolution | 采样精度,16bit, 24bit,32bit |
slot_width_select | 支持8bit, 16bit, 32bit宽度 |
pcm_lrck_period | 可配置16/32/64/128/256个bclk |
pcm_lrckr_period | 可配置16/32/64/128/256个bclk |
msb_lsb_first | 0: msb first; 1: lsb first |
sign_extend | 0: zero pending; 1: sign extend |
tx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
rx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
i2s_bclk | i2s_bclk引脚 |
i2s_lrclk | i2s_lrclk引脚 |
i2s_dout0 | i2s_dout引脚 |
i2s_din | i2s_din引脚 |
2.5.6 标案音频测试方法
该章节主要介绍在标案上进行播歌,录音的测试命令。
2.5.6.1 播放
amixer -D hw:audiocodec cset name='SPK_L Mux' 1
amixer -D hw:audiocodec cset name='SPK_R Mux' 1
amixer -D hw:audiocodec cset name='Lineout volume' 24
amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1
amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1
amixer -D hw:audiocodec cset name='digital volume' 0
aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav
可通过下面命令调节硬件上的模拟音量:
amixer -Dhw:audiocodec cset name='Lineout volume' 50
2.5.6.2 录音
表示下使用AudioCodec进行单声道录音
amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1
amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4
arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 1 /tmp/test.wav
2.6 R16音频接口
2.6.1 硬件资源
R16包含 3 个音频模块,分别是内置AudioCodec,I2S0以及I2S1。
2.6.2 时钟源
R16中, 3 个音频模块的时钟源均来自pll_audio。
pll_audio可以输出24.576M或者22.5792M的时钟,分别支持48k系列,44.1k系列的播放录音。
2.6.3 代码结构
linux-3.4/sound/soc/sunxi/
├── audiocodec
│ ├── sun8iw5_machine.c // codec machine驱动
│ ├── sun8iw5_sndcodec.c // codec驱动
│ ├── sun8iw5_sndcodec.h
│ ├── sunxi_codecdma.c // codec platform驱动
│ ├── sunxi_codecdma.h
│ └── sunxi_codec.c // cpu dai驱动
├── i2s0
│ ├── sndi2s0.c // i2s codec驱动
│ ├── sunxi-i2s0dma.c // i2s platform驱动
│ ├── sunxi-i2s0dma.h
│ ├── sunxi-i2s0.c // i2s cpu dai驱动
│ ├── sunxi-i2s0.h
│ └── sunxi-sndi2s0.c // i2s machine驱动
└── i2s1
├── sndi2s1.c // i2s codec驱动
├── sunxi-i2s1dma.c // i2s platform驱动
├── sunxi-i2s1dma.h
├── sunxi-i2s1.c // i2s cpu dai驱动
├── sunxi-i2s1.h
└── sunxi-sndi2s1.c // i2s machine驱动
2.6.4 AudioCodec
硬件特性
-
两路DAC
- 支持16bit,24bit采样精度
- 支持8KHz~192KHz采样率
-
两路ADC
- 支持16bit,24bit采样精度
- 支持8KHz~48KHz采样率
-
两路模拟输出:
- 一路立体声headphone输出(HPOUTL,HPOUTR)
- 一路立体声phoneout输出(PHONEOUTP,PHONEOUTN)
-
四路路模拟输入:MIC1,MIC2,linein,phonein
-
支持headphone驱动
-
支持同时playback和record(全双工模式)
2.6.4.1 内核配置
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
<*> Audiocodec for the SUNXI chips
<*> Audiocodec Machine for sun8iw5 chips
<*> Audiocodec for the SUN8IW5 chips
2.6.4.2 sys_config配置.
[audio0]
audio_used = 1
headphone_vol = 0x3b
pa_double_used = 1
headphone_direct_used = 1
headset_mic_vol = 3
main_mic_vol = 1
;audio_linein_detect = port:PB07<0><default><default><0>
audio_pa_ctrl = port:PD11<1><default><default><0>
pa_gpio_reverse = 0
aif2_used = 0
aif3_used = 0
headphone_mute_used = 0
aif1_lrlk_div = 0x40
audio0配置 | audio0配置 以上是关于Tina_Linux_音频_开发指南的主要内容,如果未能解决你的问题,请参考以下文章 |
---|