Tina Linux音频开发指南

描述

Tina_Linux音频开发指南

1 概述

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驱动都要提供以下特性:

  1. - 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>

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, 1~63表示-62dB~0dB, 1dB/step
micgain mic增益,可设定范围0~0x7, 0:0dB, 1~7:15~33dB, 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数字音量 0~63,表示0~-73.08dB,-1.16dB/step| |head phone volume |headphone音量 |0 表示mute, 1~63表示-62dB~0dB, -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><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, 1~63表示-62dB~0dB, 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> i2s_bclk = port:PG11<2><1> i2s_lrclk = port:PG10<2><1> i2s_dout0 = port:PG12<2><1> i2s_dout1 = i2s_dout2 = i2s_dout3 = i2s_din = port:PG13<2><1>

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><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,1~63表示-62dB~0dB, 1dB/step
lineout_vol lineout volume,可设定范围0~0x1f, 0或者 1 表示mute,2~31表示-43.5dB~0dB, 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> i2s_bclk = port:PG11<2><1> i2s_lrclk = port:PG10<2><1> i2s_dout0 = port:PG12<2><1> i2s_dout1 = i2s_dout2 = i2s_dout3 = i2s_din = port:PG13<2><1>

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><0> audio_pa_ctrl = port:PD11<1><0> pa_gpio_reverse = 0 aif2_used = 0 aif3_used = 0 headphone_mute_used = 0 aif1_lrlk_div = 0x40

audio0配置 audio0配置说明
audio0 是否使用audiocodec驱动。 0 :不使用; 1 :使用
headphone_vol headphone volume,可设定范围0~0x3f, 0表示mute,1~63表示-62dB~0dB, 1dB/step
pa_double_used 是否同时使用两个DAC, 0 :不使用; 1 :使用
headphone_direct_used 是否使用headphone输出, 0 :不使用; 1 :使用
main_mic_vol MIC1默认增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step
headset_mic_vol MIC2默认增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step
audio_pa_ctrl PA使能引脚
pa_gpio_reverse PA使能引脚是否颠倒, 0:正常,即high level active; 1:颠倒,即low level active
aif1_lrlk_div aif1的lrck分频系数

2.6.4.3 codec数据通路

开发指南

通过HPOUTL/R播歌 AIF1DACL --> AIF1IN0L Mux --> DACL Mixer --> Left Output Mixer --> HP_L Mux --> HPOUTL AIF1DACR --> AIF1IN0R Mux --> DACR Mixer --> Right Output Mixer --> HP_R Mux --> HPOUTR 通过MIC1录音 AIF1ADCL <-- AIF1OUT0L Mux <-- AIF1 AD0L Mixer <-- ADCL Mux <-- LEFT ADC input Mixer <-- MIC1 PGA <-- MIC1P/N

R16相关控件如下表:

 

控件名称 功能 数值
Headphone Switch Headphone通路使能 0:关闭; 1:开启
ADC input gain ADC增益 0–7,表示-4.5–6dB
ADC volume ADCL/ADCR音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
ADCL Mux ADCL Mux设置,只支持0:ADC 0:ADC
ADCR Mux ADCR Mux设置,只支持0:ADC 0:ADC
AIF1 AD0L Mixer ADCL Switch AIF1 AD0L Mixer设 置,使能ADCL通路 0:关闭; 1:开启
AIF1 AD0L Mixer AIF1 DA0L Switch AIF1 AD0L Mixer设置,使能AIF1 DA0L通路 0:关闭; 1:开启
AIF1 AD0L Mixer AIF2 DACL Switch AIF1 AD0L Mixer设置,使能AIF2 DACL通路 0:关闭; 1:开启
AIF1 AD0L Mixer AIF2 DACR Switch AIF1 AD0L Mixer设置,使能AIF2 DACR通路 0:关闭; 1:开启
AIF1 AD0R Mixer ADCR Switch AIF1 AD0R Mixer设置,使能ADCR通路 0:关闭; 1:开启
AIF1 AD0R Mixer AIF1 DA0R Switch AIF1 AD0R Mixer设置,使能AIF1 DA0R通路 0:关闭; 1:开启
AIF1 AD0R Mixer AIF2 DACL Switch AIF1 AD0R Mixer设置,使能AIF2 DACL通路 0:关闭; 1:开启
AIF1 AD0R Mixer AIF2 DACR Switch AIF1 AD0R Mixer设置,使能AIF2 DACR通路 0:关闭; 1:开启
AIF1 AD1L Mixer ADCL Switch AIF1 AD1L Mixer设置,使能ADCL通路 0:关闭; 1:开启
AIF1 AD1L Mixer AIF2 DACL Switch AIF1 AD1L Mixer设置,使能AIF2 DACL通路 0:关闭; 1:开启
AIF1 AD1R Mixer ADCR Switch AIF1 AD1R Mixer设置,使能ADCR通路 0:关闭; 1:开启
AIF1 AD1R Mixer AIF2 DACR Switch AIF1 AD1R Mixer设置,使能AIF2 DACR通路 0:关闭; 1:开启
AIF1 ADC timeslot 0 mixer gain AIF1 ADC0L/ADC0R Mixer,数字增益 0:0dB; 1:-6dB;
    对于ADC0L Mixer, bit0:AIF2 DACR; bit1:ADCL; bit2:AIF2 DACL; bit3:AIF2 DA0L; 对于ADC0R Mixer, bit0:AIF2 DACL; bit1:ADCR; bit2:AIF2 DACR; bit3:AIF2 DA0R;
AIF1 ADC timeslot 0 volume AIF1 ADC0L/ADC0R音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 ADC timeslot 1 mixer gain AIF1 ADC1L/ADC1R Mixer,数字增益 0:0dB; 1:-6dB;
    对于ADC1L Mixer, bit0:ADCL; bit1:AIF2 DACL; 对于ADC1R Mixer, bit0:ADCR; bit1:AIF2 DACR;
AIF1 ADC timeslot 1 volume AIF1 ADC1L/ADC1R 音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 DAC timeslot 0 volume AIF1 DAC0L/DAC0R 音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 DAC timeslot 1 volume AIF1 DAC1L/DAC1R 音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1IN0L Mux AIF1IN0L Mux设置 0:AIF1_DA0L; 1:AIF1_DA0R; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R
AIF1IN0R Mux AIF1IN0R Mux设置 0:AIF1_DA0R; 1:AIF1_DA0L; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R
AIF1IN1L Mux AIF1IN1L Mux设置 0:AIF1_DA1L; 1:AIF1_DA1R; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R
AIF1IN1R Mux AIF1IN1R Mux设置 0:AIF1_DA1R; 1:AIF1_DA1L; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R
AIF1OUT0L Mux AIF1OUT0L Mux设置 0:AIF1_AD0L; 1:AIF1_AD0R; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R
AIF1OUT0R Mux AIF1OUT0R Mux设置 0:AIF1_AD0R; 1:AIF1_AD0L; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R
AIF1OUT1L Mux AIF1OUT1L Mux设置 0:AIF1_AD1L; 1:AIF1_AD1R; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R
AIF1OUT1R Mux AIF1OUT1R Mux设置 0:AIF1_AD1R; 1:AIF1_AD1L; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R
DAC mixer gain DAC mixer增益 0:0dB; 1:-6dB;
    对于DACL Mixer, bit0:ADCL; bit1:AIF2 DACL; bit2:AIF1 DAC1L; bit3:AIF1 DAC0L; 对于DACR Mixer, bit0:ADCR; bit1:AIF2 DACR; bit2:AIF1 DAC1R; bit3:AIF1 DAC0R;
DAC volume DACL/DACR音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
DACL Mixer ADCL Switch DACL Mixer设置,使能 ADCL通路 0:关闭; 1:开启
DACL Mixer AIF1DA0L Switch DACL Mixer设置,使能 AIF1DA0L通路 0:关闭; 1:开启
DACL Mixer AIF1DA1L Switch DACL Mixer设置,使能 AIF1DA1L通路 0:关闭; 1:开启
DACL Mixer AIF2DACL Switch DACL Mixer设置,使能 AIF2DACL通路 0:关闭; 1:开启
DACR Mixer ADCR Switch DACR Mixer设置,使 能ADCR通路 0:关闭; 1:开启
DACR Mixer AIF1DA0R Switch DACR Mixer设置,使 能AIF1DA0R通路 0:关闭; 1:开启
DACR Mixer AIF1DA1R Switch DACR Mixer设置,使 能AIF1DA1R通路 0:关闭; 1:开启
DACR Mixer AIF2DACR Switch DACR Mixer设置,使 能AIF2DACR通路 0:关闭; 1:开启
External Speaker Switch 使能Headphone以及 PA 0:关闭; 1:开启
HP_L Mux HP_L Mux设置 0:DACL ; 1:Left Output Mixer
HP_R Mux HP_R Mux设置 0:DACR ; 1:Right Output Mixer
LEFT ADC input Mixer Lout_Mixer_Switch LEFT ADC input Mixer 设置,使能Lout Mixer通路 0:关闭; 1:开启
LEFT ADC input Mixer MIC1 boost Switch LEFT ADC input Mixer 设置,使能MIC1通路 0:关闭; 1:开启
LEFT ADC input Mixer MIC2 boost Switch LEFT ADC input Mixer 设置,使能MIC2通路 0:关闭; 1:开启
LEFT ADC input Mixer Rout_Mixer_Switch LEFT ADC input Mixer 设置,使能Rout Mixer 通路 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 amplifier gain MIC1增益 0–7, 0:0dB, 1~7:24–42dB,3dB/step
MIC2 SRC MIC2 SRC设置 0:MIC3; 1:MIC2
MIC2 boost amplifier gain MIC2增益 0–7, 0:0dB, 1~7:24–42dB,3dB/step
RIGHT ADC input Mixer Lout_Mixer_Switch RIGHT ADC input Mixer设置,使能Lout Mixer通路 0:关闭; 1:开启
RIGHT ADC input Mixer MIC1 boost Switch RIGHT ADC input Mixer设置,使能MIC1 通路 0:关闭; 1:开启
RIGHT ADC input Mixer MIC2 boost Switch RIGHT ADC input Mixer设置,使能MIC2 通路 0:关闭; 1:开启
RIGHT ADC input Mixer Rout_Mixer_Switch RIGHT ADC input Mixer设置,使能Rout Mixer通路 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:开启
digital volume 数字音量设置 0–63,表示-73.08–0dB
headphone volume headphone音量设置 0–63,0表示mute; 1~63表 示-62dB–0dB

2.6.5 Daudio.

硬件特性

• 两路I2S/PCM;

• 支持主从模式

支持Left-justified,Right-justified,Standar mode I2S,PCM mode

支持i2s,pcm协议格式配置

支持mono和stereo模式,支持 8 通道输出和 2 通道输入

支持同时playback和record(全双工模式)

支持8~192KHz采样率

支持16,24,32bit采样精度

2.6.5.1 内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> <*> SoC i2s0 interface for SUNXI chips <*> SoC i2s1 interface for SUNXI chips

2.6.5.2 sys_config配置.

I2S0,I2S1的配置方法是一样的,下面仅描述I2S0

[i2s0] i1s0_used = 1 i2s0_channel = 2 i2s0_master = 4 i2s0_select = 1 audio_format = 1 signal_inversion = 1 over_sample_rate = 512 sample_resolution = 16 word_select_size = 32 pcm_sync_period = 256 msb_lsb_first = 0 slot_index = 0 slot_width = 16 frame_width = 1 tx_data_mode = 1 rx_data_mode = 1 i2s0_mclk = i2s0_bclk = port:PB05<2><1> i2s0_lrclk = port:PB04<2><1> i2s0_dout0 = port:PB06<2><1> i2s0_dout1 = i2s0_dout2 = i2s0_dout3 = i2s0_din = port:PB07<2><1>

i2s0配置 i2s0配置说明
i2s0_used 是否使用i2s驱动。 0 :不使用; 1 :使用
i2s0_master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRMmaster), 即daudio接口作为slave, codec作为master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作为master, codec作为slave
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 2nd BCLK 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)
over_sample_rate 支持128fs/192fs/256fs/384fs/512fs/768fs
sample_resolution 采样精度,16bit, 24bit,32bit
word_select_size 支持16bits/20bits/24bits/32bits
pcm_sync_period 16/32/64/128/256
msb_lsb_first 0: msb first; 1: lsb first
slot_index 0: 1st slot; 1: 2nd slot; 2: 3th slot; 3:4th slot
slot_width 8: 8 clocks width; 16: 16 clocks width
frame_width 0: long frame sync; 1: short frame sync
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
i2s0_mclk i2s0_mclk引脚
i2s0_bclk i2s0_bclk引脚
i2s0_lrclk i2s0_lrclk引脚
i2s0_dout0 i2s0_dout引脚
i2s0_din i2s0_din引脚

2.6.6 标案音频测试方法

该章节主要介绍在标案上进行播歌,录音的测试命令。

2.6.6.1 播放

通过speaker播放 amixer cset name='AIF1IN0L Mux' 'AIF1_DA0L'; amixer cset name='AIF1IN0R Mux' 'AIF1_DA0R'; amixer cset name='DACL Mixer AIF1DA0L Switch' 1; amixer cset name='DACR Mixer AIF1DA0R Switch' 1; amixer cset name='HP_L Mux' 'DACL HPL Switch' ; amixer cset name='HP_R Mux' 'DACR HPR Switch'; amixer cset name='External Speaker Switch' 1; aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wavmixer cset name='AIF1IN0L Mux' 'AIF1_DA0L'; amixer cset name='AIF1IN0R Mux' 'AIF1_DA0R'; amixer cset name='DACL Mixer AIF1DA0L Switch' 1; amixer cset name='DACR Mixer AIF1DA0R Switch' 1; amixer cset name='HP_L Mux' 'DACL HPL Switch' ; amixer cset name='HP_R Mux' 'DACR HPR Switch'; amixer cset name='Headphone Switch' 1; aplay -Dhw:sndcodec /mnt/UDISK/1KHz_0dB_16000.wav

可通过下面命令调节硬件上的模拟音量:

amixer -Dhw:sndcodec cset name='headphone volume' 58

2.6.6.2 录音

表示下使用audiocodec进行单声道录音

amixer cset name='LEFT ADC input Mixer MIC1 boost Switch' 1 amixer cset name='AIF1 AD0L Mixer ADCL Switch' 1 amixer cset name='AIF1OUT0L Mux' 'AIF1_AD0L' amixer cset name='MIC1 boost amplifier gain' 4 arecord -Dhw:sndcodec -f S16_LE -r 16000 -c 1 /tmp/test.wav

2.7 R18音频接口

2.7.1 硬件资源

R18包含 4 个音频模块,分别是内置AudioCodec以及Daudio0,Daudio1,Daudio2。

开发指南

2.7.2 时钟源

R18中, 4 个音频模块的时钟源均来自pll_audio

pll_audio可以输出24.576M或者22.5792M的时钟,分别支持48k系列,44.1k系列的播放录音。

开发指南

2.7.3 代码结构

linux-4.4/sound/soc/sunxi/ ├── sun50iw1-codec.c // codec驱动 ├── sun50iw1-codec.h ├── sun50iw1-sndcodec.c // codec machine驱动 ├── sunxi-inter-i2s.c // codec platform驱动 ├── sunxi-daudio.c // daudio platform驱动 ├── sunxi-daudio.h ├── sunxi-snddaudio.c // daudio machine驱动 ├── sunxi-snddaudio.h ├── sunxi-pcm.c //通用文件,提供注册platform驱动的接口及相关函数集 ├── sunxi-pcm.h ├── sunxi_rw_func.c //通用文件,读写模拟/数字寄存器的接口 ├── sunxi_rw_func.h ├── spdif-utils.c // spdif codec驱动 ├── sunxi-sndspdif.c // spdif machine驱动 ├── sunxi-spdif.c // spdif platform驱动 ├── sunxi-spdif.h ├── sunxi-hdmi.c // hdmi codec驱动 └── sunxi-sndhdmi.c // hdmi machine驱动hdmi platform模型使用的是sunxi-daudio.c linux-4.4/sound/soc/soc-utils.c // snd-soc-dummmy驱动,可用于daudio codec模型 linux-4.4/sound/soc/codecs/ac108.c // ac108 codec驱动 linux-4.4/sound/soc/codecs/tas5731.c // tas5731数字功放codec驱动

2.7.4 AudioCodec

硬件特性

• 两路DAC

支持16bit,24bit采样精度

支持8KHz~192KHz采样率

两路ADC

支持16bit,24bit采样精度

支持8KHz~48KHz采样率

四路模拟输出:

一路立体声earpiece输出(EAROUTP,EAROUTN)

一路立体声phoneout输出(PHONEOUTP,PHONEOUTN)

一路立体声headphone输出(HPOUTL,HPOUTR)

一路立体声lineout输出(LINEOUTL,LINEOUTR)

四路路模拟输入:MIC1,MIC2,linein,phonein

支持headphone驱动

支持earpiece驱动

支持同时playback和record(全双工模式)

支持适用于DAC的DRC功能

支持适用于ADC的AGC,DRC功能

2.7.4.1 内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Sun50iw1 Codec Support

2.7.4.2 sys_config配置.

[sndcodec] sndcodec_used = 0x1 aif2fmt = 0x3 aif3fmt = 0x3 aif2master = 0x1 linein_detect = port:PH05<6> hp_detect_case = 0x1 ;------------------------------------------------------------------------------ [i2s] i2s_used = 0x1 ;------------------------------------------------------------------------------- [codec] codec_used = 0x1 headphonevol = 0x38spkervol = 0x1d earpiecevol = 0x1e maingain = 0x4 headsetmicgain = 0x4 adcagc_cfg = 0x0 adcdrc_cfg = 0x0 adchpf_cfg = 0x1 dacdrc_cfg = 0x0 dachpf_cfg = 0x0 aif2config = 0x0 aif3config = 0x0 aif1_lrlk_div = 0x40 aif2_lrlk_div = 0x40 pa_sleep_time = 0x0a dac_digital_vol = 0x9898 gpio-spk =

sndcodec配置,即machine驱动的相关配置

sndcodec配置 sndcodec配置说明
sndcodec_used 是否使用sndcodec驱动。 0 :不使用; 1 :使用
linein_detect linein检测引脚
hp_detect_case jack irq level, 0:low; 1:high

codec配置,即内置audiocodec驱动的相关配置

codec配置 codec配置说明
codec_used 是否使用codec驱动。0 :不使用; 1 :使用
headphonevol headphone volume,可设定范围0~0x3f, 0表示mute, 1~63表 示-62dB~0dB, 1dB/step
spkervol spk(lineout) volume,可设定范围0~0x1f, 0或者 1 表示mute, 2~31 表示-43.5dB~0dB, 1.5dB/step
earpiecevol earpiece volume,可设定范围0~0x1f, 0或者 1 表示mute, 2~31表 示-43.5dB~0dB, 1.5dB/step
maingain MIC1默认增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step
headsetmicgain MIC2默认增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step
adcagc_cfg 是否使用adcagc. 0:不适用; 1 :使用
adcdrc_cfg 是否使用adcdrc. 0:不适用; 1 :使用
adchpf_cfg 是否使用adchpf. 0:不适用; 1 :使用
dacdrc_cfg 是否使用dacdrc. 0:不适用; 1 :使用
dachpf_cfg 是否使用dachpf. 0:不适用; 1 :使用
aif1_lrlk_div aif1的lrck分频系数
pa_sleep_time 使能pa之前等待的时间,单位ms
dac_digital_vol DACL/DACR数字音量,0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB, 0x98表示-6dB
codec配置 codec配置说明
gpio-spk PA使能引脚

2.7.4.3 codec数据通路

开发指南

通过HPOUTL/R播歌 AIF1DACL --> AIF1IN0L Mux --> DACL Mixer --> HP_L Mux --> HPOUTL AIF1DACR --> AIF1IN0R Mux --> DACR Mixer --> HP_R Mux --> HPOUTR 通过MIC1,2录音 AIF1ADCL <-- AIF1OUT0L Mux <-- AIF1 AD0L Mixer <-- ADCL Mux <-- LADC input Mixer <-- MIC1 PGA <-- MIC1P/N AIF1ADCR <-- AIF1OUT0R Mux <-- AIF1 AD0R Mixer <-- ADCR Mux <-- RADC input Mixer <-- MIC2 PGA <-- MIC2P/N

R18相关控件如下表:

控件名称 功能 数值
Headphone Switch Headphone通路使能 0:关闭; 1:开启
Linein_detect Switch Linein检测使能 0:关闭; 1:开启
ADC input gain control ADC增益 0–7,表示-4.5–6dB
ADC volume ADCL/ADCR音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
ADCL Mux ADCL Mux设置,只支持 0:ADC 0:ADC
ADCR Mux ADCR Mux设置,只支持 0:ADC 0:ADC
AIF1 AD0L Mixer ADCL Switch AIF1 AD0L Mixer设 置,使能ADCL通路 0:关闭; 1:开启
AIF1 AD0L Mixer AIF1 DA0L Switch AIF1 AD0L Mixer设 置,使能AIF1 DA0L通路 0:关闭; 1:开启
AIF1 AD0L Mixer AIF2 DACL Switch AIF1 AD0L Mixer设 置,使能AIF2 DACL通路 0:关闭; 1:开启
AIF1 AD0L Mixer AIF2 DACR Switch AIF1 AD0L Mixer设 置,使能AIF2 DACR通路 0:关闭; 1:开启
AIF1 AD0R Mixer ADCR Switch AIF1 AD0R Mixer设 置,使能ADCR通路 0:关闭; 1:开启
AIF1 AD0R Mixer AIF1 DA0R Switch AIF1 AD0R Mixer设 置,使能AIF1 DA0R通路 0:关闭; 1:开启
AIF1 AD0R Mixer AIF2 DACL Switch AIF1 AD0R Mixer设 置,使能AIF2 DACL通路 0:关闭; 1:开启
AIF1 AD0R Mixer AIF2 DACR Switch AIF1 AD0R Mixer设 置,使能AIF2 DACR通路 0:关闭; 1:开启
AIF1 AD1L Mixer ADCL Switch AIF1 AD1L Mixer设 置,使能ADCL通路 0:关闭; 1:开启
AIF1 AD1L Mixer AIF2 DACL Switch AIF1 AD1L Mixer设 置,使能AIF2 DACL通路 0:关闭; 1:开启
AIF1 AD1R Mixer ADCR Switch AIF1 AD1R Mixer设 置,使能ADCR通路 0:关闭; 1:开启
AIF1 AD1R Mixer AIF2 DACR Switch AIF1 AD1R Mixer设 置,使能AIF2 DACR通路 0:关闭; 1:开启
AIF1 ADC timeslot 0 mixer gain AIF1 ADC0L/ADC0R Mixer,数字增益 0:0dB; 1:-6dB;
    对于ADC0L Mixer, bit0:AIF2 DACR; bit1:ADCL; bit2:AIF2 DACL; bit3:AIF2 DA0L; 对于ADC0R Mixer, bit0:AIF2 DACL; bit1:ADCR; bit2:AIF2 DACR; bit3:AIF2 DA0R;
AIF1 ADC timeslot 0 volume AIF1 ADC0L/ADC0R 音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 ADC timeslot 1 mixer gain AIF1 ADC1L/ADC1R Mixer,数字增益 0:0dB; 1:-6dB;
    对于ADC1L Mixer, bit0:ADCL; bit1:AIF2 DACL; 对于ADC1R Mixer, bit0:ADCR; bit1:AIF2 DACR;
AIF1 ADC timeslot 1 volume AIF1 ADC1L/ADC1R 音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 DAC timeslot 0 volume AIF1 DAC0L/DAC0R 音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 DAC timeslot 1 volume AIF1 DAC1L/DAC1R 音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1IN0L Mux AIF1IN0L Mux设置 0:AIF1_DA0L; 1:AIF1_DA0R; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R
AIF1IN0R Mux AIF1IN0R Mux设置 0:AIF1_DA0R; 1:AIF1_DA0L; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R
AIF1IN1L Mux AIF1IN1L Mux设置 0:AIF1_DA1L; 1:AIF1_DA1R; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R
AIF1IN1R Mux AIF1IN1R Mux设置 0:AIF1_DA1R; 1:AIF1_DA1L; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R
AIF1OUT0L Mux AIF1OUT0L Mux设置 0:AIF1_AD0L; 1:AIF1_AD0R; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R
AIF1OUT0R Mux AIF1OUT0R Mux设置 0:AIF1_AD0R; 1:AIF1_AD0L; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R
AIF1OUT1L Mux AIF1OUT1L Mux设置 0:AIF1_AD1L; 1:AIF1_AD1R; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R
AIF1OUT1R Mux AIF1OUT1R Mux设置 0:AIF1_AD1R; 1:AIF1_AD1L; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R
DAC mixer gain DAC mixer增益 0:0dB; 1:-6dB;
    对于DACL Mixer, bit0:ADCL; bit1:AIF2 DACL; bit2:AIF1 DAC1L; bit3:AIF1 DAC0L; 对于DACR Mixer, bit0:ADCR; bit1:AIF2 DACR; bit2:AIF1 DAC1R; bit3:AIF1 DAC0R;
DAC volume DACL/DACR音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
DACL Mixer ADCL Switch DACL Mixer设置,使能 ADCL通路 0:关闭; 1:开启
DACL Mixer AIF1DA0L Switch DACL Mixer设置,使能 AIF1DA0L通路 0:关闭; 1:开启
DACL Mixer AIF1DA1L Switch DACL Mixer设置,使能 AIF1DA1L通路 0:关闭; 1:开启
DACL Mixer AIF2DACL Switch DACL Mixer设置,使能 AIF2DACL通路 0:关闭; 1:开启
DACR Mixer ADCR Switch DACR Mixer设置,使 能ADCR通路 0:关闭; 1:开启
DACR Mixer AIF1DA0R Switch DACR Mixer设置,使 能AIF1DA0R通路 0:关闭; 1:开启
DACR Mixer AIF1DA1R Switch DACR Mixer设置,使 能AIF1DA1R通路 0:关闭; 1:开启
DACR Mixer AIF2DACR Switch DACR Mixer设置,使 能AIF2DACR通路 0:关闭; 1:开启
EAR Mux EAR Mux设置 0:DACR; 1:DACL; 2:Right Analog Mixer; 3:Left Analog Mixer
Earpiece Switch Earpiece通路使能 0:关闭; 1:开启
External Speaker Switch 使能Headphone以及 PA 0:关闭; 1:开启
HP_L Mux HP_L Mux设置 0:DACL ; 1:Left Output Mixer
HP_R Mux HP_R Mux设置 0:DACR ; 1:Right Output Mixer
LADC input Mixer LINEINL LADC input Mixer设 置,使能LINEINL通路 0:关闭; 1:开启
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 mixer通路 0:关闭; 1:开启
LADC input Mixer r_output mixer Switch LADC input Mixer设 置,使能r_output mixer通路 0:关闭; 1:开启
LINEINL/R to L_R output mixer gain 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 LINEINL Switch Left Output Mixer设 置,使能LINEINL通路 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 amplifier gain 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
MIC2 BST stage to L_R outp mixer gain MIC2 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
RADC input Mixer LINEINR Switch RADC input Mixer设 置,使能LINEINR通路 0:关闭; 1:开启
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 mixer通路 0:关闭; 1:开启
RADC input Mixer l_output Switch RADC input Mixer设 置,使能l_output mixer通路 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 LINEINR Switch Right Output Mixer设 置,使能LINEINR通路 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:MIXEL Switch; 1:MIXL MIXR Switch
SPK_R Mux SPK_R Mux设置 0:MIXER Switch; 1:MIXR MIXL Switch
digital volume 数字音量设置 0–63,表示-73.08–0dB
earpiece volume earpiece音量设置 0–31,表示-43.5–0dB
headphone volume headphone音量设置 0–63,0表示mute; 1~63表 示-62dB–0dB
speaker volume speaker(lineout)音量设置 0–31,表示-43.5–0dB

2.75 Daudio.

硬件特性

• 三路I2S/PCM;

• 支持主从模式

支持Left-justified,Right-justified,Standar mode I2S,PCM mode

支持i2s,pcm协议格式配置

支持同时playback和record(全双工模式)

支持8~192KHz采样率

支持16,24,32bit采样精度

2.7.5.1 内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Digital Audio Support

2.7.5.2 sys_config配置.

[snddaudio0] snddaudio0_used = 1 ;----------------------------------------------------------------------------- [daudio0] daudio0_used = 1 pcm_lrck_period = 0x60 pcm_lrckr_period = 0x01 slot_width_select = 0x18 pcm_lsb_first = 0x0 tx_data_mode = 0x0 rx_data_mode = 0x0 daudio_master = 0x04 audio_format = 0x01 signal_inversion = 0x01frametype = 0x0 tdm_config = 0x01 clk_active = 0x0

snddaudio0配置,即daudio0 machine驱动的相关配置

snddaudio配置 snddaudio配置说明
snddaudio0_used 是否使用snddaudio驱动。 0 :不使用; 1 :使用

daudio0配置,即daudio0 platform驱动的相关配置

daudio配置 daudio配置说明
daudio0_used 是否使用daudio驱动。 0 :不使用; 1 :使用
daudio_master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作为slave, codec作为master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作为master, codec作为slave
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 2nd BCLK 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)
slot_width_select 支持8bit, 16bit, 32bit宽度
pcm_lrck_period 一般可配置16/32/64/128/256个bclk
msb_lsb_first 0: msb first; 1: lsb first
frametype 0: short frame = 1 clock width; 1: long frame = 2 clock width
tdm_config 0: pcm mode; 1: i2s mode
tx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
daudio配置 daudio配置说明
rx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law

具体Daudio外接codec,数字功放的配置,可参考《R18外挂codec:ac108》《R18外挂数字功放TAS5731》

2.7.6 SPDIF

硬件特性

• 支持S/PDIF_OUT

支持mono和stereo模式

输出支持22.05kHz, 24kHz, 32kHz, 44.1kHz, 48kHz, 88.2kHz, 96kHz, 176.4kHz, 192kHz采样率

支持16bit,24bit采样精度

2.7.6.1 内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner SPDIF Support

2.7.6.2 sys_config配置.

[spdif] spdif_used = 0 [sndspdif] sndspdif_used = 0

spdif配置,即platform驱动的相关配置

spdif配置 spdif配置说明
spdif_used 是否使用spdif驱动。 0 :不使用; 1 :使用

sndspdif配置,即machine驱动的相关配置

sndspdif配置 sndspdif配置说明
sndspdif_used 是否使用sndspdif驱动。 0 :不使用; 1 :使用

sys_config中不需要配置codec驱动相关信息

因为machine驱动代码中默认配置了”spdif-utils”作为codec驱动,代码路径:

linux-4.4/sound/soc/sunxi/spdif-utils.c

2.7.7 外挂codec:AC108

R18标案tulip-noma搭配了MIC子板,含有两片AC108,每片最高可录 4 通道

下面对R18如何配置使用AC108作简单介绍

2.7.7.1 内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Digital Audio Support CODEC drivers ---> <*> Sunxi AC108 Codec

2.7.7.2 sys_config&dts配置.

R18通过twi1控制AC108,而i2s0用于音频数据的传输

twi部分配置,可通过dts进行配置:

twi1: twi@0x01c2b000 { status = "okay"; ac108@35{ compatible = "Allwinnertech,MicArray_1"; debug_mode = <0>; pga_gain = <0x32>; ref_pga_gain = <0x08>; ref_chip_addr = <0x3b>; ref_channel_num = <0x2>; pa_double_used = <0x1>;codec_mic_used = <0x0>; gpio-power = <&r_pio PL 12 1 1 1 1>; twi_bus = <1>; voltage_enable = "nocare"; power_vol = <0x0>; slot_width = <0x18>; reg = <0x35>; }; ac108@3b{ compatible = "Allwinnertech,MicArray_0"; reg = <0x3b>; debug_mode = <0>; pga_gain = <0x32>; ref_pga_gain = <0x08>; ref_chip_addr = <0x3b>; ref_channel_num = <0x2>; pa_double_used = <0x1>; codec_mic_used = <0x0>; twi_bus = <1>; voltage_enable = "nocare"; gpio-power = <&r_pio PL 12 1 1 1 1>; power_vol = <0x0>; slot_width = <0x18>; }; };

I2S部分需要配置sys_config以及dts

sys_config部分主要涉及i2s相关格式,需要根据AC108spec进行配置,sdk默认daudio0 配置可正常运行AC108

dts部分主要需要指定ASOC codec以及codec-dai驱动的名称,如

snddaudio0:sound@1 { sunxi,snddaudio-codec = "ac108.1-0035"; sunxi,snddaudio-codec-dai = "ac108-pcm1"; };

2.7.7.3 使用

进入系统后,通过命令cat /proc/asound/cards列出当前声卡信息,如果发现ac108相关声 卡,说明已经正常加载驱动

无需额外设置音频通路,可直接用下面命令进行录音:

arecord -Dhw:sndac10810035 -f S16_LE -r 16000 -c 8 /tmp/test.wav

2.7.8 外挂数字功放TAS5731.

R18标案tulip-noma搭配了一片数字功放TAS5731

下面对R18如何配置使用tas5731作简单介绍

2.7.8.1 内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Digital Audio Support CODEC drivers ---> <*> TAS5731 PA

2.7.8.2 sys_config&dts配置.

R18通过TWI0控制数字功放,而I2S1用于音频数据的传输

twi部分配置,可通过dts进行配置:

twi0: twi@0x01c2ac00 { status = "okay"; tas5731-codec@1b{ compatible = "Allwinnertech,tas5731_PA"; tas5731_power = <&pio PH 8 1 1 1 1>; tas5731_reset = <&pio PB 2 1 1 1 1>; amp_poweren = <&r_pio PL 7 1 1 1 1>; regulator_name = "vcc-amp"; reg = <0x1b>; }; };

I2S部分需要配置sys_config以及dts

sys_config部分主要涉及i2s相关格式,需要根据具体数字功放进行配置,sdk默认daudio1 配置可正常运行tas5731

dts部分主要需要指定ASOC codec以及codec-dai驱动的名称,如

snddaudio1:sound@2 { sunxi,snddaudio-codec = "tas5731-codec.0-001b"; sunxi,snddaudio-codec-dai = "tas5731_audio"; };

2.7.8.3 使用

进入系统后,通过命令cat /proc/asound/cards列出当前声卡信息,如果发现tas5731相关声 卡,说明已经正常加载驱动

无需额外设置音频通路,可直接用下面命令进行播歌:

aplay -Dhw:sndtas5731codec /mnt/UDISK/16000-stere-10s.wav

2.7.9 HDMI音频接口

R18使用I2S2将音频数据传输到HDMI模块,并且I2S2也只能用于HDMI。

2.7.9.1 内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner HDMI Audio Support <*> Allwinner Digital Audio Support

2.7.9.2 sys_config配置.

[daudio2] daudio2_used = 1 [sndhdmi] sndhdmi_used = 1

daudio2配置,即daudio2 platform驱动的相关配置

daudio2配置 daudio2配置说明
daudio2_used 是否使用daudio2驱动。 0 :不使用; 1 :使用

sndhdmi配置,即sndhdmi machine驱动的相关配置

sndhdmi配置 sndhdmi配置说明
sndhdmi_used 是否使用sndhdmi驱动。 0 :不使用; 1 :使用

2.7.10 标案音频测试方法.

该章节主要介绍在标案上进行播歌,录音的测试命令。

2.7.10.1播放

amixer -Dhw:audiocodec cset name='AIF1IN0L Mux' 'AIF1_DA0L' amixer -Dhw:audiocodec cset name='AIF1IN0R Mux' 'AIF1_DA0R' amixer -Dhw:audiocodec cset name='DACL Mixer AIF1DA0L Switch' 1 amixer -Dhw:audiocodec cset name='DACR Mixer AIF1DA0R Switch' 1 amixer -Dhw:audiocodec cset name='HP_R Mux' 'DACR HPR Switch' amixer -Dhw:audiocodec cset name='HP_L Mux' 'DACL HPL Switch' amixer -Dhw:audiocodec cset name='Headphone Switch' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav

可通过下面命令调节硬件上的模拟音量:

amixer -Dhw:audiocodec cset name='headphone volume' 60

2.7.10.2录音

amixer -Dhw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1 amixer -Dhw:audiocodec cset name='RADC input Mixer MIC2 boost Switch' 1 amixer -Dhw:audiocodec cset name='AIF1 AD0L Mixer ADCL Switch' 1 amixer -Dhw:audiocodec cset name='AIF1 AD0R Mixer ADCR Switch' 1 amixer -Dhw:audiocodec cset name='AIF1OUT0L Mux' 'AIF1_AD0L' amixer -Dhw:audiocodec cset name='AIF1OUT0R Mux' 'AIF1_AD0R' arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 /tmp/test.wav

2.8 R30音频接口

2.8.1 硬件资源

R30包含 5 个音频模块,分别是内置AudioCodec,Daudio0,Daudio1,Daudio2以及Dmic

开发指南

2.8.2 时钟源

R30中, 5 个音频模块的时钟源均来自pll_audio。

pll_audio可以输出24.576M或者22.5792M的时钟,分别支持48k系列,44.1k系列的播 放录音。

开发指南

2.8.3 代码结构

linux-4.9/sound/soc/sunxi/ ├── sun50iw3-codec.c // codec驱动 ├── sun50iw3-codec.h ├── sun50iw3-sndcodec.c // codec machine驱动 ├── sunxi-inter-i2s.c // codec platform驱动├── sunxi-inter-i2s.h ├── sunxi-daudio.c // daudio platform驱动 ├── sunxi-daudio.h ├── sunxi-dmic.c // dmic platform驱动 ├── sunxi-dmic.h ├── sunxi-pcm.c //通用文件,提供注册platform驱动的接口及相关函数集 ├── sunxi-pcm.h ├── sunxi_rw_func.c //通用文件,读写模拟/数字寄存器的接口 ├── sunxi_rw_func.h ├── sunxi-snddaudio.c // daudio machine驱动 ├── sunxi-snddaudio.h ├── sunxi-snddmic.c // dmic machine驱动 └── sunxi-snddmic.h linux-4.9/sound/soc/codecs/dmic.c // dmic codec驱动 linux-4.9/sound/soc/soc-utils.c // daudio codec驱动

2.8.4 AudioCodec

硬件特性

• 两路DAC

支持16bit,24bit采样精度

支持8KHz~192KHz采样率

两路ADC

支持16bit,24bit采样精度

支持8KHz~48KHz采样率

四路模拟输出:

一路立体声earpiece输出(EAROUTP,EAROUTN)

一路立体声phoneout输出(PHONEOUTP,PHONEOUTN)

一路立体声headphone输出(HPOUTL,HPOUTR)

一路立体声lineout输出(LINEOUTL,LINEOUTR)

四路路模拟输入:MIC1,MIC2,linein,phonein

支持headphone驱动

支持earpiece驱动

支持同时playback和record(全双工模式)

支持适用于DAC的DRC功能

支持适用于ADC的AGC,DRC功能

2.8.4.1 内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Sun50iw3 Codec Support

2.8.4.2 sys_config配置.

[sndcodec] sndcodec_used = 0x1 aif2fmt = 0x3 aif3fmt = 0x3 aif2master = 0x1 hp_detect_case = 0x0 ;------------------------------------------------------------------------------ [i2s] i2s_used = 0x1 ;------------------------------------------------------------------------------- [codec] codec_used = 0x1 headphonevol = 0x3b spkervol = 0x1b maingain = 0x4 headsetmicgain = 0x4 adcagc_cfg = 0x0 adcdrc_cfg = 0x0 adchpf_cfg = 0x0 dacdrc_cfg = 0x0 dachpf_cfg = 0x0 aif2config = 0x0 aif3config = 0x0 gpio-spk = port:PB3<1><0>

sndcodec配置,即machine驱动的相关配置

sndcodec配置 sndcodec配置说明
sndcodec_used 是否使用sndcodec驱动。 0 :不使用; 1 :使用
aif2fmt 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 2nd BCLK 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)
aif3fmt 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 2nd BCLK 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)
aif2master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master), 即aif接口选择master模式 2: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即aif 接口选择slave模式
hp_detect_case jack irq level, 0:low; 1:high

I2S配置,即audiocodec platform驱动的相关配置,内部aif接口用的I2S(与I2S0,I2S1接口无关)

i2s配置 i2s配置说明
i2s_used 是否使用i2s驱动。 0 :不使用; 1 :使用

codec配置,即内置audiocodec驱动的相关配置

codec配置 codec配置说明
codec_used 是否使用codec驱动。 0 :不使用; 1 :使用
headphonevol 初始化headphone volume,可设定范围0~0x3f,表示0~-62dB, -1dB/step
spkervol 初始化speaker volume,可设定范围0~0x1f, 0或者 1 表示mute, 2~31表示-43.5dB~0dB, 1.5dB/step
headsetmicgain 指的是MIC2增益,可设定范围0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一般设置0x4,即24dB
adcinputgain adc增益,可设定范围0~0x7,表示-4.5~6dB, 1.5dB/step,一般设置0x3,即0dB
adcagc_cfg 是否使用adcagc. 0:不使用; 1 :使用
adcdrc_cfg 是否使用adcdrc. 0:不使用; 1 :使用
adchpf_cfg 是否使用adchpf. 0:不使用; 1 :使用
dacdrc_cfg 是否使用dacdrc. 0:不使用; 1 :使用
aif2config 是否使用aif2. 0:不使用; 1 :使用
aif3config 是否使用aif3. 0:不使用; 1 :使用
gpio-spk PA使能引脚

2.8.4.3 codec数据通路

开发指南

通过SPKL/R播歌 AIF1DACL --> AIF1IN0L Mux --> DACL Mixer --> Left Output Mixer --> SPK_L Mux --> SPKL AIF1DACR --> AIF1IN0R Mux --> DACR Mixer --> Right Output Mixer --> SPK_R Mux --> SPKR 通过LINEOUTL/R播歌 AIF1DACL --> AIF1IN0L Mux --> DACL Mixer --> Left Output Mixer --> LINEOUTL Mux --> LINEOUTL AIF1DACR --> AIF1IN0R Mux --> DACR Mixer --> Right Output Mixer --> LINEOUTR Mux --> LINEOUTR 通过HPOUTL/R播歌 AIF1DACL --> AIF1IN0L Mux --> DACL Mixer --> HP_L Mux --> HPOUTL AIF1DACR --> AIF1IN0R Mux --> DACR Mixer --> HP_R Mux --> HPOUTR 通过MIC1,2录音 AIF1ADCL <-- AIF1OUT0L Mux <-- AIF1 AD0L Mixer <-- LADC input Mixer <-- MIC1 PGA <-- MIC1P/ N AIF1ADCR <-- AIF1OUT0R Mux <-- AIF1 AD0R Mixer <-- RADC input Mixer <-- MIC2 PGA <-- MIC2P/ N 通过LINEINL/R录音 AIF1ADCL <-- AIF1OUT0L Mux <-- AIF1 AD0L Mixer <-- LADC input Mixer <-- LINEINN AIF1ADCR <-- AIF1OUT0R Mux <-- AIF1 AD0R Mixer <-- RADC input Mixer <-- LINEINP

R30相关控件如下表:

控件名称 功能 数值
Headphone Switch Headphone通路使能 0:关闭; 1:开启
Lineout Switch Lineout通路使能 0:关闭; 1:开启
ADC input gain control ADC增益 0–7,表示-4.5–6dB
ADC volume ADCL/ADCR音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 AD0L Mixer ADCL Switch AIF1 AD0L Mixer设 置,使能ADCL通路 0:关闭; 1:开启
AIF1 AD0L Mixer AIF1 DA0L Switch AIF1 AD0L Mixer设 置,使能AIF1 DA0L通 0:关闭; 1:开启
AIF1 AD0L Mixer AIF2 DACL Switch AIF1 AD0L Mixer设 置,使能AIF2 DACL通 0:关闭; 1:开启
AIF1 AD0L Mixer AIF2 DACR Switch AIF1 AD0L Mixer设 置,使能AIF2 DACR通 0:关闭; 1:开启
AIF1 AD0R Mixer ADCR Switch AIF1 AD0R Mixer设 置,使能ADCR通路 0:关闭; 1:开启
AIF1 AD0R Mixer AIF1 DA0R Switch AIF1 AD0R Mixer设 置,使能AIF1 DA0R通 0:关闭; 1:开启
AIF1 AD0R Mixer AIF2 DACL Switch AIF1 AD0R Mixer设 置,使能AIF2 DACL通 0:关闭; 1:开启
AIF1 AD0R Mixer AIF2 DACR Switch AIF1 AD0R Mixer设 置,使能AIF2 DACR通 0:关闭; 1:开启
AIF1 AD1L Mixer ADCL Switch AIF1 AD1L Mixer设 置,使能ADCL通路 0:关闭; 1:开启
AIF1 AD1L Mixer AIF2 DACL Switch AIF1 AD1L Mixer设 置,使能AIF2 DACL通 0:关闭; 1:开启
AIF1 AD1R Mixer ADCR Switch AIF1 AD1R Mixer设 置,使能ADCR通路 0:关闭; 1:开启
AIF1 AD1R Mixer AIF2 DACR Switch AIF1 AD1R Mixer设 置,使能AIF2 DACR通 0:关闭; 1:开启
AIF1 ADC timeslot 0 mixer gain AIF1 ADC0L/ADC0R Mixer,数字增益 0:0dB; 1:-6dB;
    对于ADC0L Mixer, bit0:AIF2 DACR; bit1:ADCL; bit2:AIF2 DACL; bit3:AIF2 DA0L; 对于ADC0R Mixer, bit0:AIF2 DACL; bit1:ADCR; bit2:AIF2 DACR; bit3:AIF2 DA0R;
AIF1 ADC timeslot 0 volume AIF1 ADC0L/ADC0R 音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 ADC timeslot 1 mixer gain AIF1 ADC1L/ADC1R Mixer,数字增益 0:0dB; 1:-6dB;
    对于ADC1L Mixer, bit0:ADCL; bit1:AIF2 DACL; 对于ADC1R Mixer, bit0:ADCR; bit1:AIF2 DACR;
AIF1 ADC timeslot 1 volume AIF1 ADC1L/ADC1R 音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 DAC timeslot 0 volume AIF1 DAC0L/DAC0R 音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 DAC timeslot 1 volume AIF1 DAC1L/DAC1R 音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1IN0L Mux AIF1IN0L Mux设置 0:AIF1_DA0L; 1:AIF1_DA0R; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R
AIF1IN0R Mux AIF1IN0R Mux设置 0:AIF1_DA0R; 1:AIF1_DA0L; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R
AIF1IN1L Mux AIF1IN1L Mux设置 0:AIF1_DA1L; 1:AIF1_DA1R; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R
AIF1IN1R Mux AIF1IN1R Mux设置 0:AIF1_DA1R; 1:AIF1_DA1L; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R
AIF1OUT0L Mux AIF1OUT0L Mux设置 0:AIF1_AD0L; 1:AIF1_AD0R; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R
AIF1OUT0R Mux AIF1OUT0R Mux设置 0:AIF1_AD0R; 1:AIF1_AD0L; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R
AIF1OUT1L Mux AIF1OUT1L Mux设置 0:AIF1_AD1L; 1:AIF1_AD1R; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R
AIF1OUT1R Mux AIF1OUT1R Mux设置 0:AIF1_AD1R; 1:AIF1_AD1L; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R
DAC mixer gain DAC mixer增益 0:0dB; 1:-6dB;
    对于DACL Mixer, bit0:ADCL; bit1:AIF2 DACL; bit2:AIF1 DAC1L; bit3:AIF1 DAC0L; 对于DACR Mixer, bit0:ADCR; bit1:AIF2 DACR; bit2:AIF1 DAC1R; bit3:AIF1 DAC0R;
DAC volume DACL/DACR音量设置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
DACL Mixer ADCL Switch DACL Mixer设置,使能 ADCL通路 0:关闭; 1:开启
DACL Mixer AIF1DA0L Switch DACL Mixer设置,使能 AIF1DA0L通路 0:关闭; 1:开启
DACL Mixer AIF1DA1L Switch DACL Mixer设置,使能 AIF1DA1L通路 0:关闭; 1:开启
DACL Mixer AIF2DACL Switch DACL Mixer设置,使能 AIF2DACL通路 0:关闭; 1:开启
DACR Mixer ADCR Switch DACR Mixer设置,使 能ADCR通路 0:关闭; 1:开启
DACR Mixer AIF1DA0R Switch DACR Mixer设置,使 能AIF1DA0R通路 0:关闭; 1:开启
DACR Mixer AIF1DA1R Switch DACR Mixer设置,使 能AIF1DA1R通路 0:关闭; 1:开启
DACR Mixer AIF2DACR Switch DACR Mixer设置,使 能AIF2DACR通路 0:关闭; 1:开启
External Speaker Switch 使能Headphone以及 PA 0:关闭; 1:开启
HP_L Mux HP_L Mux设置 0:DACL ; 1:Left Output Mixer
HP_R Mux HP_R Mux设置 0:DACR ; 1:Right Output Mixer
LADC input Mixer LINEINL LADC input Mixer设 置,使能LINEINL通路 0:关闭; 1:开启
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 mixer通路 0:关闭; 1:开启
LADC input Mixer r_output mixer Switch LADC input Mixer设 置,使能r_output mixer通路 0:关闭; 1:开启
LINEINL/R to L_R output mixer gain LINEINL/R to L or R output Mixer增益 0–7,表示-4.5–6dB
LINEOUTL Mux LINEOUTL Mux设置 0:left output mixer; 1:left+right output mixer
LINEOUTR Mux LINEOUTR Mux设置 0:right output mixer; 1:left+right output mixer
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 LINEINL Switch Left Output Mixer设 置,使能LINEINL通路 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 stage output mixer control MIC1 to L or R output Mixer增益 0–7,表示-4.5–6dB
MIC2 BST stage to L_R outp mixer gain MIC2 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
RADC input Mixer LINEINR Switch RADC input Mixer设 置,使能LINEINR通路 0:关闭; 1:开启
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 mixer通路 0:关闭; 1:开启
RADC input Mixer l_output Switch RADC input Mixer设 置,使能l_output mixer通路 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 LINEINR Switch Right Output Mixer设 置,使能LINEINR通路 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:MIXEL Switch; 1:MIXL MIXR Switch
SPK_R Mux SPK_R Mux设置 0:MIXER Switch; 1:MIXR MIXL Switch
digital volume 数字音量设置 0–63,表示-73.08–0dB
headphone volume headphone音量设置 0–63,0表示mute; 1~63表 示-62dB–0dB
lineout volume lineout音量设置 0–31,表示-43.5–0dB
speaker volume speaker(lineout)音量 设置 0–31,表示-43.5–0dB

2.8.5 Daudio.

硬件特性

• 三路I2S/PCM;

• 支持主从模式

支持Left-justified,Right-justified,Standar mode I2S,PCM mode

支持i2s,pcm协议格式配置

支持同时playback和record(全双工模式)

支持8~192KHz采样率

支持16,24,32bit采样精度

2.8.5.1 内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Digital Audio Support

2.8.5.2 sys_config配置.

[snddaudio0] snddaudio0_used = 1 [daudio0] pcm_lrck_period = 0x80 slot_width_select = 0x20 pcm_lsb_first = 0x0 tx_data_mode = 0x0 rx_data_mode = 0x0daudio_master = 0x04 audio_format = 0x01 signal_inversion = 0x01 frametype = 0x0 tdm_config = 0x01 mclk_div = 0x1 daudio0_used = 1

snddaudio0配置,即daudio0 machine驱动的相关配置

snddaudio配置 snddaudio配置说明
snddaudio0_used 是否使用snddaudio驱动。 0 :不使用; 1 :使用

daudio0配置,即daudio0 platform驱动的相关配置

daudio配置 daudio配置说明
daudio0_used 是否使用daudio驱动。 0 :不使用; 1 :使用
daudio_master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作为slave, codec作为master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作为master, codec作为slave
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 2nd BCLK 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)
slot_width_select 支持8bit, 16bit, 32bit宽度
pcm_lrck_period 一般可配置16/32/64/128/256个bclk
msb_lsb_first 0: msb first; 1: lsb first
frametype 0: short frame = 1 clock width; 1: long frame = 2 clock width
tdm_config 0: pcm mode; 1: i2s mode
daudio配置 daudio配置说明
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

2.8.6 DMIC

硬件特性

• 支持 8 路输入

支持8~48KHz采样率

支持16/24bit采样精度

2.8.6.1 内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner DMIC Support

2.8.6.2 sys_config配置.

[dmic] dmic_used = 0 [snddmic] snddmic_used = 0

dmic配置,即platform驱动的相关配置

dmic配置 dmic配置说明
dmic_used 是否使用dmic驱动。 0 :不使用; 1 :使用

snddmic配置,即machine驱动的相关配置

snddmic配置 snddmic配置说明
snddmic_used 是否使用snddmic驱动。 0 :不使用; 1 :使用

2.8.7 标案音频测试方法

该章节主要介绍在标案上进行播歌,录音的测试命令。

2.8.7.1 播放

通过SPKL/R播歌,例如喇叭播歌 amixer -Dhw:audiocodec cset name='AIF1IN0L Mux' 'AIF1_DA0L' amixer -Dhw:audiocodec cset name='AIF1IN0R Mux' 'AIF1_DA0R' amixer -Dhw:audiocodec cset name='DACL Mixer AIF1DA0L Switch' 1 amixer -Dhw:audiocodec cset name='DACR Mixer AIF1DA0R Switch' 1 amixer -Dhw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -Dhw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -Dhw:audiocodec cset name='SPK_R Mux' 'MIXER_Switch' amixer -Dhw:audiocodec cset name='SPK_L Mux' 'MIXEL_Switch' amixer -Dhw:audiocodec cset name='External Speaker Switch' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav 可通过下面命令调节硬件上的模拟音量: amixer -Dhw:audiocodec cset name='speaker volume' 28通过LINEOUTL/R播歌 amixer -Dhw:audiocodec cset name='AIF1IN0L Mux' 'AIF1_DA0L' amixer -Dhw:audiocodec cset name='AIF1IN0R Mux' 'AIF1_DA0R' amixer -Dhw:audiocodec cset name='DACL Mixer AIF1DA0L Switch' 1 amixer -Dhw:audiocodec cset name='DACR Mixer AIF1DA0R Switch' 1 amixer -Dhw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -Dhw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -Dhw:audiocodec cset name='LINEOUTL Mux' 'LOMIX' amixer -Dhw:audiocodec cset name='LINEOUTR Mux' 'ROMIX' amixer -Dhw:audiocodec cset name='Lineout Switch' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav 可通过下面命令调节硬件上的模拟音量: amixer -Dhw:audiocodec cset name='lineout volume' 28通过HPOUTL/R播歌,例如耳机 amixer -Dhw:audiocodec cset name='AIF1IN0L Mux' 'AIF1_DA0L' amixer -Dhw:audiocodec cset name='AIF1IN0R Mux' 'AIF1_DA0R' amixer -Dhw:audiocodec cset name='DACL Mixer AIF1DA0L Switch' 1 amixer -Dhw:audiocodec cset name='DACR Mixer AIF1DA0R Switch' 1 amixer -Dhw:audiocodec cset name='HP_R Mux' 'DACR HPR Switch' amixer -Dhw:audiocodec cset name='HP_L Mux' 'DACL HPL Switch' amixer -Dhw:audiocodec cset name='Headphone Switch' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav可通过下面命令调节硬件上的模拟音量:amixer -Dhw:audiocodec cset name='headphone volume' 60

2.8.7.2 录音

通过MIC1,MIC2录音 amixer -Dhw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1 amixer -Dhw:audiocodec cset name='RADC input Mixer MIC2 boost Switch' 1 amixer -Dhw:audiocodec cset name='AIF1 AD0L Mixer ADCL Switch' 1 amixer -Dhw:audiocodec cset name='AIF1 AD0R Mixer ADCR Switch' 1 amixer -Dhw:audiocodec cset name='AIF1OUT0L Mux' 'AIF1_AD0L' amixer -Dhw:audiocodec cset name='AIF1OUT0R Mux' 'AIF1_AD0R' amixer -Dhw:audiocodec cset name='MIC1 boost AMP gain control' 4 amixer -Dhw:audiocodec cset name='MIC2 boost AMP gain control' 4 arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 /tmp/test.wav

2.9 R328音频接口.

2.9.1 硬件资源

R328音频接口丰富,包含 6 个音频模块,分别是内置AudioCodec,Daudio0,Daudio1,Daudio2, Dmic,Spdif。

另外还支持MAD作语音唤醒检测(详细请看R328 MAD章节)。

开发指南

2.9.2 时钟源.

R328中, 6 个音频模块的时钟源均来自pll_audio。

pll_audio可以输出24.576M或者22.5792M的时钟,分别支持48k系列,44.1k系列的播 放录音。

开发指南

2.9.3 代码结构

linux-4.9/sound/soc/sunxi/ ├── spdif-utils.c // spdif codec驱动 ├── sun8iw18-codec.c // codec驱动 ├── sun8iw18-codec.h ├── sun8iw18-sndcodec.c // codec machine驱动 ├── sunxi-cpudai.c // codec platform驱动 ├── sunxi-daudio.c // daudio platform驱动 ├── sunxi-daudio.h ├── sunxi-dmic.c // dmic platform驱动 ├── sunxi-dmic.h ├── sunxi-mad.c //提供MAD相关功能接口 ├── sunxi-mad.h ├── sunxi-pcm.c //通用文件,提供注册platform驱动的接口及相关函数集 ├── sunxi-pcm.h ├── sunxi_rw_func.c //通用文件,读写模拟/数字寄存器的接口 ├── sunxi_rw_func.h ├── sunxi-snddaudio.c // daudio machine驱动 ├── sunxi-snddaudio.h ├── sunxi-snddmic.c // dmic machine驱动 ├── sunxi-snddmic.h ├── sunxi-sndspdif.c // spdif machine驱动 ├── sunxi-spdif.c // spdif platform驱动 └── sunxi-spdif.h linux-4.9/sound/soc/codecs/dmic.c // dmic codec驱动 linux-4.9/sound/soc/soc-utils.c // daudio codec驱动

2.9.4 AudioCodec

硬件特性

• 一路DAC

支持16bit,24bit采样精度

支持8KHz~192KHz采样率

三路ADC

支持16bit,24bit采样精度

支持8KHz~48KHz采样率

一路模拟输出:一路差分输出lineoutP/N,支持单端lineout输出

三路模拟输入:MIC1,MIC2,MIC3

支持同时playback和record(全双工模式)

DAC及ADC均支持 5 段DRC

DAC FIFO长度12824bits, ADC FIFO长度12824bits

2.9.4.1内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Sun8iw18 Codec Support

2.9.4.2 sys_config配置

[sndcodec] sndcodec_used = 0x1 ;------------------------------------------------------------------------------ [cpudai] cpudai_used = 0x1 ;------------------------------------------------------------------------------- [codec] codec_used = 0x1 digital_vol = 0x0 lineout_vol =0x1a mic1gain = 0x4 mic2gain = 0x4 mic3gain = 0x0 adcgain = 0x3 adcagc_cfg = 0x0 adcdrc_cfg = 0x0 adchpf_cfg = 0x0dacdrc_cfg = 0x0 dachpf_cfg = 0x0 pa_ctl_level = 0x1 pa_msleep_time = 160 gpio-spk = port:PH9<1><1><1><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 :使用
digital_vol 初始化digital volume,可设定范围0~0x3f,表示0~-73.08dB, -1.16dB/step
lineout_vol lineout volume,可设定范围0~0x1f,表示-43.5dB~0dB, 1.5dB/step
mic1gain mic1增益,可设定范围0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般设置0x4,即24dB
mic2gain mic2增益,可设定范围0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般设置0x4,即24dB
mic3gain mic3增益,可设定范围0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般设置0x4,即24dB.如果作为aec回路,则需要设置为0dB
adcgain adc增益,可设定范围0~0x7,表示-4.5~6dB, 1.5dB/step,一般设置 0x3,即0dB
adcdrc_cfg 是否使用adcdrc. 0:不适用; 1 :使用
adchpf_cfg 是否使用adchpf. 0:不适用; 1 :使用
dacdrc_cfg 是否使用dacdrc. 0:不适用; 1 :使用
dachpf_cfg 是否使用dachpf. 0:不适用; 1 :使用
pa_ctl_level PA引脚使能方式。0:低电平有效; 1 :高电平有效
pa_msleep_time 操作PA之后的延时时间(用来避免pop音)
gpio-spk PA使能引脚

说明

如果想要正常加载 audiocodec 声卡,需要把 codec,platform,machine 驱动都选上,即 codec_used,cpudai_used,sndcodec_used 都置为 1

digital_vol,lineout_vol 等值会在驱动初始化的时候设置,进入系统后还可以通过 amixer 工具对应控件进行再次修改;

注意 gpio-spk 是否配置正确,是否有其他模块复用了该 gpio;

注意 pa_ctl_level ,实际功放的 PA 引脚是高电平有效,还是低电平有效

2.9.4.3 codec数据通路

开发指南

播歌 Playback --> DACL --> Left LINEOUT Mux --> LINEOUTL --> External Speaker Playback --> DACR --> Right LINEOUT Mux --> LINEOUTR --> External Speaker 录音 MIC1 --> MIC1 PGA ---> Left Input Mixer --> ADCL --> Capture MIC2 --> MIC2 PGA ---> Right Input Mixer --> ADCL --> Capture MIC3 --> MIC3 PGA ---> Xadc Input Mixer --> ADCL --> Capture

R328所有控件如下表:

控件名称 功能 数值
Lineout Switch 使能lineout 0:关闭; 1:开启
ADC gain volume ADC增益 0–7,表示-4.5–6dB,具体计 算请看注释 1
External Speaker Switch 使能lineout以及PA 0:关闭; 1:开启
LINEOUT volume lineout音量设置 0–31,表示-43.5–0dB,具体 计算请看注释 2
Left Input Mixer DACL Switch Left Input Mixer设置,使 能DACL通路 0:关闭; 1:开启
Left Input Mixer MIC1 Boost Switch Left Input Mixer设置,使 能MIC1通路 0:关闭; 1:开启
Left Input Mixer MIC2 Boost Switch Left Input Mixer设置,使 能MIC2通路 0:关闭; 1:开启
Left Input Mixer MIC3 Boost Switch Left Input Mixer设置,使 能MIC3通路 0:关闭; 1:开启
Left LINEOUT Mux Left Lineout Mux设置 0:DACL; 1:NULL(空)
Right LINEOUT Mux Right Lineout Mux设置 0:NULL(空); 1:DACL
MIC1 gain volume MIC1 Boost AMP gain 0–7, 0:0dB, 1~7:15–33dB, 具体计算请看注释 3
MIC2 gain volume MIC2 Boost AMP gain 与MIC1 gain volume设置 一样
MIC3 gain volume MIC3 Boost AMP gain 与MIC1 gain volume设置 一样
Right Input Mixer DACL Switch Right Input Mixer设置, 使能DACL通路 0:关闭; 1:开启
Right Input Mixer MIC1 Boost Switch Right Input Mixer设置, 使能MIC1通路 0:关闭; 1:开启
Right Input Mixer MIC2 Boost Switch Right Input Mixer设置, 使能MIC2通路 0:关闭; 1:开启
Right Input Mixer MIC3 Boost Switch Right Input Mixer设置, 使能MIC3通路 0:关闭; 1:开启
Xadc Input Mixer DACL Switch Xadc Input Mixer设置,使 能DACL通路 0:关闭; 1:开启
Xadc Input Mixer MIC1 Boost Switch Xadc Input Mixer设置,使 能MIC1通路 0:关闭; 1:开启
Xadc Input Mixer MIC2 Boost Switch Xadc Input Mixer设置,使 能MIC2通路 0:关闭; 1:开启
Xadc Input Mixer MIC3 Boost Switch Xadc Input Mixer设置,使 能MIC3通路 0:关闭; 1:开启
codec hub mode 使能audiocodec hub功能 0:关闭; 1:开启
digital volume 数字端音量设置 0–63,表示-73.08–0dB,具 体计算请看注释 4

 

• 注释 1

ADC gain volume计算方法: 应用层可设置范围:0~ 7 对应实际硬件设置的范围:-4.5~6dB, step: 1.5dB 换算方法:-4.5+(n*1.5) 举例,设置0dB: -4.5+(n*1.5) = 0 n = 3 所以应用层上输入下面命令设置为0dB: amixer -D hw:audiocodec cset name='ADC gain volume' 3

• 注释 2

LINEOUT volume计算方法: 应用层可设置范围: 0 ~31 (设置为 0 或者 1 时,就是mute) 对应实际硬件设置的范围:-43.5~0dB, step:1.5dB 换算方法:-43.5+((n-2)*1.5) 举例 1 ,设置0dB: -43.5+((n-2)*1.5) = 0 n = 31 所以应用层上输入下面命令设置为0dB: amixer -D hw:audiocodec cset name='LINEOUT volume' 31 举例 2 ,设置-6dB: -43.5+((n-2)*1.5) = -6 n = 27 所以应用层上输入下面命令设置为-6dB: amixer -D hw:audiocodec cset name='LINEOUT volume' 27

• 注释 3

MIC1 gain volume计算方法: 应用层可设置范围: 0 ~7 (设置为 0 时,就是0dB) 对应实际硬件设置的范围:0dB或者15~33dB, step:3dB 换算方法:15+((n-1)*3) 举例,设置24dB: 15+((n-1)*3) = 24 n = 4 所以应用层上输入下面命令设置为24dB: amixer -D hw:audiocodec cset name='MIC1 gain volume' 4

• 注释 4

digital volume计算方法: 应用层可设置范围: 0 ~ 63 对应实际硬件设置的范围:-73.08~0dB, step:1.16dB 换算方法:-73.08+(n*1.16) 举例 1 ,设置0dB: -73.08+(n*1.16) = 0 n = 63 所以应用层上输入下面命令设置为0dB: amixer -D hw:audiocodec cset name='digital volume' 63 举例 2 ,设置-5.8dB: -73.08+(n*1.16) = -5.8n = 58 所以应用层上输入下面命令设置为-5.8dB: amixer -D hw:audiocodec cset name='digital volume' 58

通路设置举例:

播放通路

通过Speaker播放,差分输出: amixer -D hw:audiocodec cset name='External Speaker Switch' 1 amixer -D hw:audiocodec cset name='digital volume' 63 amixer -D hw:audiocodec cset name='LINEOUT volume' 25 amixer -D hw:audiocodec cset name='Right LINEOUT Mux' 1

录音通路

通过模拟MIC1, MIC2录音: amixer -D hw:audiocodec cset name='Left Input Mixer MIC1 Boost Switch' 1 amixer -D hw:audiocodec cset name='Right Input Mixer MIC2 Boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 gain volume' 4 amixer -D hw:audiocodec cset name='MIC2 gain volume' 4

常用AEC通路

有两种AEC回路方式,具体看硬件如何设计 1)外部AEC MIC1,MIC2录音;MIC3作为AEC,外部SPKP/N连接到MIC3. amixer -D hw:audiocodec cset name='Left Input Mixer MIC1 Boost Switch' 1 amixer -D hw:audiocodec cset name='Right Input Mixer MIC2 Boost Switch' 1 amixer -D hw:audiocodec cset name='Xadc Input Mixer MIC3 Boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 gain volume' 4 amixer -D hw:audiocodec cset name='MIC2 gain volume' 4 amixer -D hw:audiocodec cset name='MIC3 gain volume' 0 2)内部AEC(可省去外部AEC电路) MIC1,MIC2录音;MIC3作为AEC,使能内部DACL到MIC3的通路. amixer -D hw:audiocodec cset name='Left Input Mixer MIC1 Boost Switch' 1 amixer -D hw:audiocodec cset name='Right Input Mixer MIC2 Boost Switch' 1 amixer -D hw:audiocodec cset name='Xadc Input Mixer DACL Switch' 1 amixer -D hw:audiocodec cset name='MIC1 gain volume' 4 amixer -D hw:audiocodec cset name='MIC2 gain volume' 4

2.14.5 Daudio

硬件特性

• 三路I2S/PCM,可用于蓝牙通话,语音采集,数字功放;

• 支持主从模式

支持Left-justified,Right-justified,Standar mode I2S,PCM mode

支持i2s,pcm协议格式配置

支持mono和stereo模式,最高支持 8 通道

支持同时playback和record(全双工模式)

支持8~192KHz采样率

支持16,24,32bit采样精度

支持 3 路MCLK输出

2.14.5.1内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Digital Audio Support

2.14.5.2 sys_config配置

[snddaudio0] snddaudio0_used = 0 daudio_master = 4 audio_format = 1 signal_inversion = 1 [daudio0] daudio0_used = 0 slot_width_select = 32 pcm_lrck_period = 128 msb_lsb_first = 0 sign_extend = 0 frametype = 0 mclk_div = 1 tdm_config = 1 tx_data_mode = 0 rx_data_mode = 0

snddaudio0配置,即daudio0 machine驱动的相关配置

snddaudio配置 snddaudio配置说明
snddaudio0_used 是否使用snddaudio驱动。 0 :不使用; 1 :使用
daudio_master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作为slave, codec作为master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作为master, codec作为slave
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 2nd BCLK 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)

daudio0配置,即daudio0 platform驱动的相关配置

daudio配置 daudio配置说明
daudio0_used 是否使用daudio驱动。 0 :不使用; 1 :使用
slot_width_select 支持8bit, 16bit, 32bit宽度
pcm_lrck_period 一般可配置16/32/64/128/256个bclk
msb_lsb_first 0: msb first; 1: lsb first
sign_extend 0: zero pending; 1: sign extend
frametype 0: short frame = 1 clock width; 1: long frame = 2 clock width
mclk_div 0: not output(normal setting this); 1/2/4/6/8/12/16/24/32/48/64/96/128/176/192:给外部 codec提供时钟,频率是pll_audio/mclk_div
tdm_config 0: pcm mode; 1: i2s mode
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

注意事项:

daudio machine驱动的配置(snddaudio),一般来说还需要配置codec name以及codec dai name

例如daudio0使用了AC108作为外挂codec:

  1. [snddaudio0] snddaudio0_used = 1 sunxi,snddaudio-codec = "ac108.1-003b"; sunxi,snddaudio-codec-dai = "ac108-pcm0"; daudio_master = 4 audio_format = 1 signal_inversion = 2 [daudio0] daudio0_used = 1 slot_width_select = 32 pcm_lrck_period = 128 msb_lsb_first = 0 sign_extend = 0 frametype = 0 mclk_div = 1 tdm_config = 1 tx_data_mode = 0 rx_data_mode = 0 注意名称需要与codec驱动中配置的名称一致,如ac108驱动,路径: linux-4.9/sound/soc/codecs/ac108.c 代码中snd_soc_register_codec注册codec驱动,其中codec device name为ac108.1-003b, codec dai name为ac108-pcm0

 

例如daudio2与bluetooth模组相连(没有实际的codec驱动),那么这时候codec

name, codec dai name需要配置为dummy codec,可以如下配置:   [snddaudio2]   snddaudio2_used = 1   sunxi,snddaudio-codec = "snd-soc-dummy"   sunxi,snddaudio-codec-dai = "snd-soc-dummy-dai"   daudio_master = 1   audio_format = 5   signal_inversion = 2 因为驱动中解析snddaudio-codec等字段时,判断出错的时候则使用默认codec"snd-soc-dummy", 所以如果sunxi,snddaudio-codec和sunxi,snddaudio-codec-dai不配置,或者配置为空的时候, 则默认使用dummy codec: [snddaudio2] snddaudio2_used = 1 daudio_master = 1 audio_format = 5 signal_inversion = 2 或者 [snddaudio2] snddaudio2_used = 1 sunxi,snddaudio-codec = sunxi,snddaudio-codec-dai = daudio_master = 1 audio_format = 5 signal_inversion = 2

2.14.6 Dmic

硬件特性

• 支持 8 路输入

支持8~48KHz采样率

支持16/24bit采样精度

2.14.6.1内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner DMIC Support

2.14.6.2 sys_config配置

配置如下:

[dmic] dmic_used = 0 [snddmic] snddmic_used = 0

dmic配置,即platform驱动的相关配置

dmic配置 dmic配置说明 dmic_used 是否使用dmic驱动。 0 :不使用; 1 :使用

snddmic配置,即machine驱动的相关配置

snddmic配置 snddmic配置说明 snddmic_used 是否使用snddmic驱动。 0 :不使用; 1 :使用

sys_config中不需要配置codec驱动相关信息

因为machine驱动代码中默认配置了”dmic-codec”作为codec驱动,代码路径:

linux-4.9/sound/soc/codecs/dmic.c

2.14.7 SPDIF

硬件特性

• 支持S/PDIF_OUT和S/PDIF_IN

支持mono和stereo模式(mono模式下由硬件自动拓展为stereo)

输出支持22.05kHz, 24kHz, 32kHz, 44.1kHz, 48kHz, 88.2kHz, 96kHz, 176.4kHz, 192kHz采样率

输入支持44.1KHz,48KHz采样率

输出和输入支持16bit,24bit采样精度

2.14.7.1内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner SPDIF Support

2.14.7.2 sys_config配置

[sndspdif] sndspdif_used = 0 [spdif] spdif_used = 0

spdif配置,即platform驱动的相关配置

spdif配置 spdif配置说明| spdif_used 是否使用spdif驱动。 0 :不使用; 1 :使用|

sndspdif配置,即machine驱动的相关配置

sndspdif配置sndspdif配置说明

sndspdif_used是否使用sndspdif驱动。 0 :不使用; 1 :使用

sys_config中不需要配置codec驱动相关信息

因为machine驱动代码中默认配置了”spdif-utils”作为codec驱动,代码路径:

linux-4.9/sound/soc/sunxi/spdif-utils.c

2.14.8 MAD

硬件特性

支持三路I2S,一路DMIC PCM音频传输接口,时分复用,固定16bit

支持16KHz,48KHz采样率

支持基于能量识别的语音检测模块LPSD

支持一块128KB的SRAM,可用于保存音频数据

2.14.8.1内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Mad Support

2.14.8.2 sys_config配置

[mad] mad_used = 1 lpsd_clk_src_cfg = 0 standby_sram_io_type = 1

mad配置 mad配置说明
mad_used 是否使用mad驱动。 0 :不使用; 1 :使用

2.14.8.3 mixer控件说明

mad绑定到I2S

控件名称 功能 数值
daudio bind mad Function 是否绑定MAD功能 0:不绑定; 1:绑定
lpsd channel sel Function 选择作为能量唤醒的通道 0:通道0; 1:通道1;
    如此类推,最高可指定通道7
mad_standby channel sel Function 设定休眠时mad录音通 道数 0:表示使用实际录音通道数;

mad绑定到dmic

控件名称 功能 数值
dmic bind mad Function 是否绑定MAD功能 0:不绑定; 1:绑定
lpsd channel sel Function 选择作为能量唤醒的通道 0:通道0; 1:通道1;
    如此类推,最高可指定通道 7
mad_standby channel sel Function 设定休眠时mad录音通道数 0:表示使用实际录音通道数; 1:表示只录制两通道 2:表示只录制四通道

2.14.8.4使用说明

固件上的配置,只要修改sys_config以及内核配置即可。

应用上需要使能MAD相关的mixer control。

I2S设置举例,例如使用的是AC108:

mad使能,绑定mad到daudio中 amixer -Dhw:sndac1081003b cset name='daudio bind mad Function' 1 设置通道 0 作为唤醒通道 amixer -Dhw:sndac1081003b cset name='lpsd channel sel Function' 0 设定mad standby时,录音的通道数 amixer -Dhw:sndac1081003b cset name='mad_standby channel sel Function' 2

DMIC设置举例:

amixer -Dhw:snddmic cset name='dmic bind mad Function' 1 amixer -Dhw:snddmic cset name='lpsd channel sel Function' 0 amixer -Dhw:snddmic cset name='mad_standby channel sel Function' 0

然后应用正常进行录音即可,如果需要进入休眠,有下面几点必须实现的:

暂定录音、播放。snd_pcm_pause将playback,capture均暂停;

设置wakeup_count。更新当前唤醒次数;

进入休眠。写mem到/sys/power/state即可;

Tina SDK中有一个能量唤醒demo可供参考。

make menuconfig选中mad-demo软件包

Allwinner ---> <*> mad-demo

执行mad-ac108-demo,默认配置(脚本/usr/bin/mad-ac108-demo上设定了默认配置):

• 使用通道 0 作为唤醒通道;

录制 4 通道,16bit, 16K;

每次录音5s后进入休眠,可通过语音能量唤醒;

执行mad-dmic-demo,默认配置(脚本/usr/bin/mad-dmic-demo上设定了默认配置):

• 使用通道 0 作为唤醒通道;

录制 4 通道,16bit, 16K;

每次录音5s后进入休眠,可通过语音能量唤醒;

如果想查看录音数据,可以增加 dump 参数, 例如mad-dmic-demo dump, 录音文件保存 在/mnt/UDISK/目录下。

2.14.8.5能量唤醒阈值参数

能量唤醒模块lpsd,识别能量主要有两个方向,瞬时能量和累计能量(前者比如是关门声,后者 比如是不断说话)能量检测参数配置均在/sys/module/sunxi_mad/parameters/目录下

lpsd_rrun和lpsd_rstop的推荐值:

lpsd_rrun lpsd_rstop
77 88
77 108
77 128
77 148

瞬时能量检测参数,主要是lpsd_rrun和lpsd_rstop。

一般我们只对stop值进行修改;

如果录音数据经常缺少唤醒词的第一个字,则可以尝试降低stop值,可以有效提高唤醒词数据 的完整性。但同时会提高误唤醒率,环境噪音也会很容易触发能量检测,唤醒系统;

如果想要降低误唤醒率(环境噪音造成唤醒),则可以尝试提高stop值。同样的,这会导致一些 唤醒词录音数据不完整,例如一些音量较低,音调较低的语料;

唤醒词识别率以及误唤醒率无法同时兼得,客户需要根据实际需求、场景,权衡配置参数;

累积能量检测参数,主要是lpsd_th。

• 我们建议使用默认值 1200 。建议修改范围50~1200;

2.14.8.6注意事项

MAD绑定动作,需要在应用打开声卡前就设置好;

应用操作上的一些要求,具体请查看《MAD使用说明》章节;

如果读取wakeup_count时一直阻塞,说明当前仍有wake_lock处于激活状态,例如usb 线连接着PC,usb驱动会保持一个wake_lock,不让系统进入休眠,所以需要拔掉usb或 者连接到usb适配器上,或者改动代码,去掉usb驱动中wake_lock的使用;

2.14.9 VAD.

VAD是基于MAD实现的,可以通过内部AudioCodec的ADC采集音频数据,并作能量唤醒。 由于硬件上MAD功能只能用于I2S或者DMIC,内部codec无法直接关联到MAD,因此通 过I2S作为音频数据的桥梁,实现了VAD功能,使得模拟MIC也可以利用MAD功能作能量唤 醒。

VAD完整的数据通路:

ADC RxFiFo ---> I2S TxFiFo ---> I2S RxFiFo ---> MAD SRAM ---> MEM

2.14.9.1内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> [*] Allwinner I2S PCM DMA MAP Support <*> Allwinner Mad Support <*> Allwinner Sun8iw18 Codec Support <*> Allwinner Digital Audio Support

2.14.9.2 sys_config配置

需要使能MAD配置:

[mad] mad_used = 1 lpsd_clk_src_cfg = 0 standby_sram_io_type = 1

mad配置 mad配置说明
mad_used 是否使用mad驱动。 0 :不使用; 1 :使用

2.14.9.3 mixer控件说明

控件名称 功能 数值
codec I2S Port 指定VAD使用的I2S 0:不适用; 1:使用I2S0; 2:使用I2S1; 3:使用I2S2
sndcodec bind mad Function 是否绑定MAD功能 0:不绑定; 1:绑定
lpsd channel sel Function 选择作为能量唤醒的通道 0:通道0; 1:通道1;
    如此类推,最高可指定 通道 7
mad_standby channel sel Function 设定休眠时mad录音通道数 0:表示使用实际录音通 道数; 1:表示只录制两 通道2:表示只录制四通道

注意:

对于控件“codec I2S Port”,需要指定实际没有使用(sys_config没有使能的)的一路I2S。设置举例:

实际没有使用I2S0(sys_config中snddaudio0,audio0均没有配置),那么这里可以设置为1,表示VAD使用I2S0;

实际没有使用I2S1(sys_config中snddaudio1,audio1均没有配置),那么这里可以设置为2,表示VAD使用I2S1;

设置举例:

amixer -Dhw:audiocodec cset name='codec I2S Port' 2 amixer -Dhw:audiocodec cset name='sndcodec bind mad Function' 1 amixer -Dhw:audiocodec cset name='lpsd channel sel Function' 0 amixer -Dhw:audiocodec cset name='mad_standby channel sel Function' 0

2.14.9.4使用说明

VAD的使用与MAD类似。

固件上的配置,只要修改sys_config以及内核配置即可。

应用上除了打开内部audiocodec的录音通路之外,还需要下面一些配置:

vad需要使用一路i2s,这里指定使用i2s1 amixer -Dhw:audiocodec cset name='codec I2S Port' 2 使能mad,绑定mad到audiocodec中 amixer -Dhw:audiocodec cset name='sndcodec bind mad Function' 1 设置通道 0 作为唤醒通道 amixer -Dhw:audiocodec cset name='lpsd channel sel Function' 0

然后应用正常进行录音即可,如果需要进入休眠,有下面几点必须实现的:

暂定录音、播放。snd_pcm_pause将playback,capture均暂停

设置wakeup_count。更新当前唤醒次数

进入休眠。写mem到/sys/power/state即可

Tina SDK中有一个能量唤醒demo可供参考make menuconfig选中mad-demo软件包

Allwinner ---> <*> mad-demo

执行vad-demo,默认配置(脚本/usr/bin/vad-demo上设定了默认配置):

• 使用I2S1

录制 2 通道,16bit, 16K

每次录音5s后进入休眠,可通过语音能量唤醒

如果想查看录音数据,可以执行vad-demo dump,录音文件保存在/mnt/UDISK/vad-test.wav能量唤醒阈值的调整,可以参考《能量唤醒阈值参数》

2.14.9.5注意事项

VAD同样需要注意MAD注意事项章节中提到的几点。

另外需要注意,VAD隐式使用了一路I2S,所以硬件上需要保留一路I2S,并且sys_config中不能使能该I2S配置

2.14.10标案音频测试方法.

该章节主要介绍在标案上进行播歌,录音的测试命令

2.14.10.1播放

通过Speaker播放 amixer -D hw:audiocodec cset name='External Speaker Switch' 1 amixer -D hw:audiocodec cset name='Right LINEOUT Mux' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav

2.14.10.2录音

通过MIC1,MIC2录制两通道 amixer -D hw:audiocodec cset name='Left Input Mixer MIC1 Boost Switch' 1 amixer -D hw:audiocodec cset name='Right Input Mixer MIC2 Boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 boost volume' 4 amixer -D hw:audiocodec cset name='MIC2 boost volume' 4 arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 /tmp/test.wav

####

2.20 V853音频接口

V853包含多个音频模块,分别是内置AudioCodec,I2S0,I2S1,DMIC。

2.20.1 时钟源.

V853中,音频模块的时钟源来自pll_audio0。

pll_audio0可输出22.5792M和24.576M频率的时钟,分别支持44.1k系列、48k系列的播放录音,但无法同时输出。

开发指南

2.20.2 代码结构

linux-4.9/sound/soc/sunxi_v2/ ├── snd_sun8iw21_codec.c // codec驱动 ├── snd_sun8iw21_codec.h ├── snd_sunxi_aaudio.c ├── snd_sunxi_common.c ├── snd_sunxi_common.h ├── snd_sunxi_daudio.c //daudio platform驱动 ├── snd_sunxi_daudio.h ├── snd_sunxi_dmic.c // dmic platform驱动 ├── snd_sunxi_dmic.h ├── snd_sunxi_log.h ├── snd_sunxi_mach.c ├── snd_sunxi_mach.h ├── snd_sunxi_mach_utils.c ├── snd_sunxi_mach_utils.h ├── snd_sunxi_pcm.c ├── snd_sunxi_pcm.h ├── snd_sunxi_rxsync.c ├── snd_sunxi_rxsync.h ├── snd_sunxi_txhub.c └── snd_sunxi_txhub.h

2.20.3 AudioCodec

2.20.3.1硬件特性

• 一路DAC

支持16bit,20bit有效采样精度

支持8KHz~192KHz采样率

两路ADC

支持16bit,20bit有效采样精度

支持8KHz~48KHz采样率

一路模拟输出:

一路立体声输出LINEOUT,支持single/differ

两路模拟输入:MIC1,MIC2

MIC支持single/differ,

支持同时playback和record(全双工模式)

DAC及ADC均支持DRC

支持mono模式,最高支持 2 通道

2.20.3.2内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support V2 ---> <*> Allwinner AAUDIO support <*> Allwinner DAUDIO Support <*> Allwinner Function Components <*> Components Rx Sync

2.20.3.3 DTS配置.

2.20.3.3.1 DeviceTree 配置说明 设备树为芯片平台的模块配置,面对芯片特性进行配 置,设备树文件的路径为:lichee/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi

codec:codec@0x02030000 { #sound-dai-cells = <0>; compatible = "allwinner,sunxi-snd-codec"; reg = <0x0 0x02030000 0x0 0x34C>; clocks = <&clk_pll_audio>,<&clk_codec_dac>, <&clk_codec_adc>; status = "disabled"; }; codec_plat:codec_plat { #sound-dai-cells = <0>; compatible = "allwinner,sunxi-snd-aaudio"; playback_cma = <128>; capture_cma = <128>; tx_fifo_size = <128>; rx_fifo_size = <128>; dac_txdata = <0x02030020>; adc_txdata = <0x02030040>; status = "disabled"; }; codec_mach:codec_mach { compatible = "allwinner,sunxi-snd-mach"; soundcard-mach,name = "audiocodec"; soundcard-mach,pin-switches = "MIC1", "MIC2", "LINEIN", "LINEOUT", "SPK"; soundcard-mach,routing = "MIC1_PIN", "MIC1", "MIC2_PIN", "MIC2", "LINEINL_PIN", "LINEIN", "LINEINR_PIN", "LINEIN", "LINEOUT", "LINEOUTL_PIN", "SPK", "LINEOUTL_PIN"; status = "disabled"; soundcard-mach,cpu { /* pll freq = 24.576M or 22.5792M * pll-fs */ soundcard-mach,pll-fs = <1>; sound-dai = <&codec_plat>; }; soundcard-mach,codec { sound-dai = <&codec>; }; };

配置项说明(仅对常用项进行展开):

AudioCodec模块由 3 个设备树节点构建。

ASoC层codec: codec

表2-128: AudioCodec codec节点配置项(linux4.9)

配置项名称 配置项说明
#sound-dai-cells machine层检测codec和platform节点的标志
reg 设置audiocodec寄存器起始地址和地址长度
clocks 设置audiocodec所需的时钟源和模块时钟

ASoC层platform: codec_plat

表2-129: AudioCodec codec_plat节点配置项(linux4.9)

配置项名称 配置项说明
#sound-dai-cells machine层检测codec和platform节点的标志
playback_cma 设置播放流DMA申请的size大小,必须为(2ˆn)Kbyte,默认 128
capture_cma 设置录音流DMA申请的size大小,必须为(2ˆn)Kbyte,默认 128
tx_fifo_size 设置播放流snd_pcm_runtime的fifo_size大小,用于声卡硬件参数 限定,默认 128
rx_fifo_size 设置录音流snd_pcm_runtime的fifo_size大小,用于声卡硬件参数 限定,默认 128
dac_txdata 设置播放流DMA搬运地址(audiocodec模块的tx_fifo寄存器地址)
adc_txdata 设置录音流DMA搬运地址(audiocodec模块的rx_fifo寄存器地址)

ASoC层machine: codec_mach

表2-130: AudioCodec codec_mach节点配置项(linux4.9)

配置项名称 配置项说明
soundcard- mach machine层配置前缀
name 声卡名字
pin-switches 用于定义模块接口开关(需参考驱动代码dapm进行设定)
routing 用于定义模块接口开关所链接的dapm通路(需参考驱动代码dapm进 行设定)
cpu machine层所绑定的cpu节点(即platform层),用sound-dai属 性指定节点
codec machine层所绑定的codec节点(即codec层),用sound-dai属 性指定节点
pll-fs 指定模块时钟源频率(24.576M or 22.5792M * pll-fs)

2.20.3.3.2 board.dts板级配置说明

board.dts用于保存板级平台设备差异化的信息的补充,面对 板型特性 进行配置,其配置信息会覆盖device tree默认配置信息,board.dts文件的路径为:/device/config/chips/v853/configs/{BOARD}/board.dts

&codec { /* external-avcc; */ /* avcc-supply = <®_aldo1>; */ avcc-vol = <1800000>; /* uv */ lineout_vol = <31>; mic1gain = <31>; mic2gain = <31>;adcdelaytime = <0>; /* lineout-single; */ /* mic1-single; */ /* mic2-single; */ pa_pin_max = <1>; /* set pa */ pa_pin_0 = <&pio PH 4 1 1 1 1>; pa_pin_level_0 = <1>; pa_pin_msleep_0 = <0>; tx_hub_en; rx_sync_en; status = "okay"; }; &codec_plat { status = "okay"; }; &codec_mach { status = "okay"; soundcard-mach,cpu { sound-dai = <&codec_plat>; }; soundcard-mach,codec { sound-dai = <&codec>; }; };

配置项介绍:

表2-131: AudioCodec模块板级配置项

配置项名称 配置值范围 配置项说明
status “okay”, “disabled” 使能或关闭该节点驱动
avcc-external 注释为false,反之为 ture avcc电源是否为外围电路提供
avcc-supply 注释,引用pmu提供的 电源节点 avcc若为外部pmu供电,可选择该项指定 对应的pmu电源
avcc-vol u32 (缺省值: 1800000 ) avcc电压值设定,单位uV,需符合实际硬 件需求
dvcc-external 注释为false,反之为 ture dvcc电源是否为外围电路提供
dvcc-supply 注释,引用pmu提供的 电源节点 dvcc若为外部pmu供电,可选择该项指定 对应的pmu电源
dvcc-vol u32(缺省值: 1800000 ) dvcc电压值设定,单位uV,需符合实际硬 件需求
adc-dig-vol- (n) 0~255 adc(n)数字音量,(n)代表adc序号,从 1 开始递增
mic(n)_vol 0~31 mic(n)默认输入音量(增益),(n)代表 mic序号,从 1 开始递增
dac-dig-vol 0~63 dac 数字总音量
dac-dig-vol- (n) 0~255 dac(n)数字音量,(n)代表dac序号,从 1 开始递增
lineout-vol 0~31 lineout默认输出音量(增益)
hp-vol 0~7 耳机默认输出音量(增益)
pa-pin-max u32(正常为 1 或 2 ) 标定外部功放芯片使能引脚数量
pa-pin-(n) pio提供的引脚节点 指定第(n)个功放使能引脚
pa-pin-level- (n) 0~1 指定功放芯片使能电平
pa-pin- msleep-(n) u32(正常小于 200 ) 设置功放芯片使能所需的sleep时长,用于 规避pop声,单位ms
adcdelaytime u32(需符合IC规格) 设置adc录音延迟时长,单位ms
tx-hub-en 注释为false,反之为 ture 选择是否注册txhub控件
rx-sync-en 注释为false,反之为 ture 选择是否注册rxsync控件

 

2.20.3.4 codec数据通路

通过Lineout播歌 Playback --> DACL --> LINEOUTL Output Select --> LINEOUTL --> LINEOUT Playback --> DACR --> LINEOUTR Output Select --> LINEOUTR --> LINEOUT 录音 MIC1 --> MIC1 Input Select --> ADC1 Input --> ADC1 --> Capture MIC2 --> MIC2 Input Select --> ADC2 Input --> ADC2 --> Capture LINE-in录音 LINEINL --> ADC1 Input --> ADC1 --> Capture LINEINR --> ADC2 Input --> ADC2 --> Capture

V853所有控件如下表:

表2-132: amixer控件表

控件名称 功能 数值
ADC1 ADC2 swap 将adc1和adc2进行通道 交换  
ADC1 volume ADC1数字音量设置 0~0xFF, 0:Mute; 1~0xFF:-119.25dB~ 71.24dB, 0.75dB/step,默认0xA0=0dB
ADC2 volume ADC2数字音量设置 0~0xFF, 0:Mute; 1~0xFF:-119.25dB~ 71.24dB, 0.75dB/step,默认0xA0=0dB
ADCDRC 开启ADC DRC功能  
ADCHPF 开启adc hpf功能  
DAC volume DACL,DACR音量设置 0~0xFF, 0:Mute; 1~0xFF:-119.25dB~ 71.24dB, 0.75dB/step,默认0xA0=0dB
DACDRC 开启dac drc功能  
DACHPF 开启dac hpf功能  
LINEIN Switch 是否使能ADC->LINEIN 的通路 0:关闭; 1:使能
LINEINL gain volume LINEINL增益 0:0dB; 1:6dB
LINEINR gain volume LINEINR增益 0:0dB; 1:6dB
LINEOUT Output Select Lineout输出选择 0:单端; 1:差分
LINEOUT Switch 是否使能Lineout通路 0:关闭; 1:使能
LINEOUT volume Lineout音量设置 0~31,表示-43.5~0dB
MIC1 Input Select MIC1输入模式 0:差分输入; 1:单端输入
MIC1 Switch 是否使能ADC1->MIC1的 通路 0:关闭; 1:使能
MIC1 gain volume MIC1增益 0~31,表示0~36dB, 0:0dB,1~3:6dB, 4~31:9~36dB, 1dB/step
MIC2 Input Select MIC2输入模式 0:差分输入; 1:单端输入
MIC2 Switch 是否使能ADC2->MIC2的 通路 0:关闭; 1:使能
MIC2 gain volume MIC2增益 0~31,表示0~36dB, 0:0dB,1~3:6dB, 4~31:9~36dB, 1dB/step
SPK Switch 是否使能Speaker通路(使 用功放) 0:关闭; 1:使能
digital volume 数字端音量设置 0~63,表示-73.08~0dB
rx sync mode 使能同步录音(和其它开启 rx sync mode的声卡)  
tx hub mode 使能同源播放(和其它开启 tx hub mode的声卡)  

2.20.4 Daudio

2.20.4.1硬件特性

• 两路I2S/PCM,可用于蓝牙通话,语音采集,数字功放;

• 支持主从模式

支持Left-justified,Right-justified,Standar mode I2S,PCM mode

支持i2s,pcm协议格式配置

支持同时playback和record(全双工模式)

支持8~192KHz采样率

支持16,24,32bit采样精度

支持 2 路MCLK输出

2.20.4.2内核配置

Device Drivers --->    <*> Sound card support --->        <*> Advanced Linux Sound Architecture --->            <*> ALSA for SoC audio support --->                Allwinner SoC Audio support V2 --->                <*> Allwinner AAUDIO support                <*> Allwinner DAUDIO Support                <*> Allwinner Function Components                <*> Components Rx Sync

2.20.4.3 DTS配置.

2.20.4.3.1 DeviceTree 配置说明 设备树为芯片平台的模块配置,面对芯片特性进行配置,设备树文件的路径为:lichee/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi

daudio0_plat:daudio0_plat@0x02032000 { #sound-dai-cells = <0>; compatible = "allwinner,sunxi-snd-plat-daudio"; reg = <0x0 0x02032000 0x0 0x7c>; clocks = <&clk_pll_audio>, <&clk_i2s0>; playback_cma = <128>; capture_cma = <128>; tx_fifo_size = <128>; rx_fifo_size = <128>; status = "disabled"; }; daudio0_mach:daudio0_mach{ compatible = "allwinner,sunxi-snd-mach"; soundcard-mach,format = "i2s"; soundcard-mach,name = "snddaudio0";status = "disabled"; soundcard-mach,cpu { sound-dai = <&daudio0_plat>; }; soundcard-mach,codec { }; }; daudio1_plat:daudio1_plat@0x02033000 { #sound-dai-cells = <0>; compatible = "allwinner,sunxi-snd-plat-daudio"; reg = <0x0 0x02033000 0x0 0x7c>; clocks = <&clk_pll_audio>, <&clk_i2s1>; playback_cma = <128>; capture_cma = <128>; tx_fifo_size = <128>; rx_fifo_size = <128>; status = "disabled"; }; daudio1_mach:daudio1_mach{ compatible = "allwinner,sunxi-snd-mach"; soundcard-mach,format = "i2s"; soundcard-mach,name = "snddaudio1"; status = "disabled"; soundcard-mach,cpu { sound-dai = <&daudio1_plat>; }; soundcard-mach,codec { }; };

配置项说明(仅对常用项进行展开):

I2S/PCM模块由 2 个或 3 个设备树节点构建。

ASoC层codec:非必须节点,若无,则绑定虚拟codec节点。

ASoC层platform: daudio(n)_plat

表2-133: I2S/PCM daudio(n)_plat节点配置项(linux4.9)

配置项名称 配置项说明
#sound-dai-cells machine层检测codec和platform节点的标志
reg 设置I2S/PCM寄存器起始地址和地址长度
clocks 设置I2S/PCM所需的时钟源和模块时钟
playback_cma 设置播放流DMA申请的size大小,必须为(2ˆn)Kbyte,默认 128
capture_cma 设置录音流DMA申请的size大小,必须为(2ˆn)Kbyte,默认 128
tx_fifo_size 设置播放流snd_pcm_runtime的fifo_size大小,用于声卡硬件参数 限定,默认 128
rx_fifo_size 设置录音流snd_pcm_runtime的fifo_size大小,用于声卡硬件参数 限定,默认 128

ASoC层machine: daudio(n)_mach

表2-134: I2S/PCM daudio(n)_mach节点配置项(linux4.9)

配置项名称 配置项说明
soundcard-mach machine层配置前缀
name 声卡名字
cpu machine层所绑定的cpu节点(即platform层),用 sound-dai属性指定节点
codec machine层所绑定的codec节点(即codec层),用 sound-dai属性指定节点。若该子节点下无sound-dai属性, 即代表使用虚拟codec,用于辅助生成声卡
pll-fs 指定模块时钟源频率(24.576M or 22.5792M * pll-fs)

 

说明

daudio(n)plat_ 代表 daudio0_plat, daudio1_plat, ···(取决于芯片规格);

daudio(n)mach_ 代表 daudio0_mach, daudio1_mach, ···(取决于芯片规格);

2.20.4.3.2 board.dts板级配置说明 board.dts用于保存板级平台设备差异化的信息的补 充,面对 板型特性 进行配置,其配置信息会覆盖device tree默认配置信息,board.dts文件的 路径为:/device/config/chips/v853/configs/{BOARD}/board.dts

&daudio0_plat { tdm_num = <0>; tx_pin = <0>; rx_pin = <0>; /* pinctrl_used; */ /* pinctrl-names= "default","sleep"; */ /* pinctrl-0 = <&daudio0_pins_a>; */ /* pinctrl-1 = <&daudio0_pins_b>; */ tx_hub_en; rx_sync_en; status = "okay"; }; &daudio0_mach { soundcard-mach,format = "i2s"; soundcard-mach,frame-master = <&daudio0_cpu>; soundcard-mach,bitclock-master = <&daudio0_cpu>; /* soundcard-mach,frame-inversion; */ /* soundcard-mach,bitclock-inversion; */ soundcard-mach,slot-num = <2>; soundcard-mach,slot-width = <32>; status = "okay"; daudio0_cpu: soundcard-mach,cpu { sound-dai = <&daudio0_plat>; soundcard-mach,pll-fs = <1>; /* pll freq = 24.576M or 22.5792M * pll-fs */ soundcard-mach,mclk-fs = <0>; /* mclk freq = pcm rate * mclk-fs */ }; daudio0_codec: soundcard-mach,codec {}; }; &daudio1_plat { tdm_num = <1>; tx_pin = <0>; rx_pin = <0>; /* pinctrl_used; */ /* pinctrl-names= "default","sleep"; */ /* pinctrl-0 = <&daudio1_pins_a>; */ /* pinctrl-1 = <&daudio1_pins_b>; */ tx_hub_en; rx_sync_en; status = "disabled"; }; &daudio1_mach { soundcard-mach,format = "i2s"; soundcard-mach,frame-master = <&daudio1_cpu>; soundcard-mach,bitclock-master = <&daudio1_cpu>; /* soundcard-mach,frame-inversion; */ /* soundcard-mach,bitclock-inversion; */ soundcard-mach,slot-num = <2>; soundcard-mach,slot-width = <32>; status = "disabled"; daudio1_cpu: soundcard-mach,cpu { sound-dai = <&daudio1_plat>; soundcard-mach,pll-fs = <1>; /* pll freq = 24.576M or 22.5792M * pll-fs */ soundcard-mach,mclk-fs = <0>; /* mclk freq = pcm rate * mclk-fs */ }; daudio1_codec: soundcard-mach,codec { }; };

配置项介绍:

表2-135: I2S/PCM模块板级配置项

配置项名称 配置值范围 配置项说明
status “okay”, “disabled” 使能或关闭该节点驱动
tdm-num 0~3 指定I2S序号,需和daudio(n)_plat的(n) 对应
tx-pin 0~3 指定I2S所使用的DOUT引脚序号
rx-pin 0~3 指定I2S所使用的DIN引脚序号
tx-hub-en 注释为false,反之为 ture 选择是否注册txhub控件
rx-sync-en 注释为false,反之为 ture 选择是否注册rxsync控件
format “i2s”,“right_j”,“left_j”, “dsp_a”,“dsp_b” 选择tdm协议格式
frame-master cpu子节点,codec子 节点 选择LRCK信号主模式
bitclock- master cpu子节点,codec子 节点 选择BCLK信号主模式
frame- inversion 注释为false,反之为 ture LRCK信号是否翻转
bitclock- inversion 注释为false,反之为 ture BCLK信号是否翻转
slot-num 1~16 slot数量(可简单理解为支持最大通道数)
slot-width 8, 16, 24, 32 单个slot宽度(可简单理解为支持最大数据精 度)
mclk-fp 注释为false,反之为 ture ture: mclk以固定频段输出;false: mclk以 采样率倍数输出
mclk-fs u32 固定频段:mclk = mclk-fs * 12.288M or 11.2896M 采样率倍数:mclk = mclk-fs * pcm rate

2.20.5 DMIC.

硬件特性

• 支持 4 路输入

支持8~48KHz采样率

支持16/24bit采样精度

2.20.5.1内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support V2 ---> <*> Allwinner DMIC support

2.20.5.2 DTS配置.

2.20.5.2.1 DeviceTree 配置说明 设备树为芯片平台的模块配置,面对芯片特性进行配 置,设备树文件的路径为:lichee/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi

dmic_plat:dmic_plat@0x02031000 { #sound-dai-cells = <0>; compatible = "allwinner,sunxi-snd-plat-dmic";reg = <0x0 0x02031000 0x0 0x50>; clocks = <&clk_pll_audio>, <&clk_dmic>; capture_cma = <128>; rx_fifo_size = <128>; status = "disabled"; }; dmic_mach:dmic_mach{ compatible = "allwinner,sunxi-snd-mach"; soundcard-mach,name = "snddmic"; soundcard-mach,capture_only; status = "disabled"; soundcard-mach,cpu { sound-dai = <&dmic_plat>; }; soundcard-mach,codec { }; };

配置项说明(仅对常用项进行展开):

DMIC模块由 2 个设备树节点构建。

ASoC层codec:无,绑定虚拟codec节点。

ASoC层platform: dmic_plat

表2-136: DMIC dmic_plat节点配置项(linux4.9)

配置项名称 配置项说明
#sound-dai-cells machine层检测codec和platform节点的标志
reg 设置DMIC寄存器起始地址和地址长度
clocks 设置DMIC所需的时钟源和模块时钟
capture_cma 设置录音流DMA申请的size大小,必须为(2ˆn)Kbyte,默认 128
rx_fifo_size 设置录音流snd_pcm_runtime的fifo_size大小,用于声卡硬件参数 限定,默认 128

 

ASoC层machine: dmic_mach

表2-137: DMIC dmic_mach节点配置项(linux4.9)

配置项名称 配置项说明
soundcard- mach machine层配置前缀
name 声卡名字
cpu machine层所绑定的cpu节点(即platform层),用sound-dai属性 指定节点
codec machine层所绑定的codec节点(即codec层),用sound-dai属性 指定节点(使用虚拟codec)
capture_only 设置仅录音,不进行播放流设备创建 pll-fs 指定模块时钟源频率(24.576M or 22.5792M * pll-fs)

 

2.20.5.2.2 board.dts板级配置说明 board.dts用于保存板级平台设备差异化的信息的补 充,面对 板型特性 进行配置,其配置信息会覆盖device tree默认配置信息,board.dts文件的 路径为:/device/config/chips/v853/configs/{BOARD}/board.dts

&dmic_plat {    rx_chmap = <0x76543210>;    data_vol = <0xB0>;    rxdelaytime = <0>;    pinctrl_used;    pinctrl-names = "default","sleep";    pinctrl-0 = <&dmic_pins_a>;    pinctrl-1 = <&dmic_pins_b>;    rx_sync_en;    status = "disabled"; }; &dmic_mach {    status = "disabled";    soundcard-mach,cpu {        sound-dai = <&dmic_plat>;        soundcard-mach,pll-fs = <1>; /* pll freq = 24.576M or 22.5792M * pll-fs */    };    soundcard-mach,codec {    }; };

配置项介绍:

表2-138: DMIC模块板级配置项

配置项名称 配置值范围 配置项说明
status “okay”, “disabled” 使能或关闭该节点驱动
rx-sync-en 注释为false,反之为 ture 选择是否注册rxsync控件
avcc- supply 注释,引用pmu提供的 电源节点 avcc若为外部pmu供电,可选择该项指定对应的 pmu电源

 

2.20.6 RX_SYNC多声卡同步功能

RX_SYNC功能用于同时使用到两个录音声卡(不同音频硬件接口),可以保证两个声卡同时开始录音,保证延迟稳定不变。

例如内部ADC+外部ADC(使用I2S)的语音方案,它就可以保证内部ADC和I2S RX的同步性。

AudioCodec, I2S, DMIC均可以使用RX_SYNC功能,除了它们对应的驱动配置外,还需要额外配置内核,dts等地方。

2.20.6.1内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support V2 ---> <*> Allwinner AAUDIO support <*> Allwinner DAUDIO Support <*> Allwinner Function Components <*> Components Rx Sync

2.20.6.2 dts配置.

在希望使用到rx_sync功能的音频模块上添加rx_sync_en = <1>字段:

codec:codec@2030000 { rx_sync_en = <0x01>; }; dmic:dmic@2031000 { rx_sync_en = <0x01>; }; daudio0:daudio@2032000 { rx_sync_en = <0x01>; };

注意,配置了rx_sync_en字段的模块,需要都开启录音后,才会真正开始录音。

一般我们会使用multi插件将两个声卡数据合并(默认asound.conf中添加了CaptureMulti1可供参考),arecord -DCaptureMulti1 -f S16_LE -r 16000 -c 7 /tmp/test.wav &。

2.20.7 标案音频测试方法.

该章节主要介绍在标案上进行播歌,录音的测试命令

2.20.7.1播放

通过LINEOUT->Speaker播放 amixer -Dhw:audiocodec cset name='LINEOUTL Output Select' 1 amixer -Dhw:audiocodec cset name='LINEOUTR Output Select' 1 amixer -Dhw:audiocodec cset name='LINEOUT Switch' 1 amixer -D hw:audiocodec cset name='LINEOUT volume' 15 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav 或者利用默认/etc/asound.conf配置的pcm设备进行播放: aplay -Ddefault /mnt/UDISK/1KHz_0dB_16000.wav 通过Headphone播放 amixer -D hw:audiocodec cset name='Headphone Switch' 1 amixer -D hw:audiocodec cset name='Headphone volume' 3 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav

2.20.7.2录音

通过内部的MIC1,MIC2录制双通道 amixer -D hw:audiocodec cset name='MIC1 Input Select' 0 amixer -D hw:audiocodec cset name='MIC2 Input Select' 0 amixer -D hw:audiocodec cset name='MIC1 Switch' 1 amixer -D hw:audiocodec cset name='MIC2 Switch' 1 amixer -D hw:audiocodec cset name='MIC1 gain volume' 19 amixer -D hw:audiocodec cset name='MIC2 gain volume' 19 arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 /tmp/test.wav

2.21 F133音频接口

F133包含多个音频模块,分别是内置AudioCodec,I2S1,I2S2,DMIC,SPDIF。

2.21.1 时钟源.

F133中,音频模块的时钟源来自pll_audio0以及pll_audio1_div5。

pll_audio0可以输出22.5792M的时钟,而pll_audio1_div5输出24.576M的时钟,分别支 持44.1k系列,48k系列的播放录音。

2.21.2 AudioCodec

2.21.2.1硬件特性

• 两路DAC

支持16bit,20bit有效采样精度

支持8KHz~192KHz采样率

三路ADC

支持16bit,20bit有效采样精度

支持8KHz~48KHz采样率

模拟输出:

一路立体声输出HPOUTL,HPOUTR

模拟差分输入:

一路差分麦克风输入MIC3P/N

一路立体声line-in输入LINEINL,LINEINR

一路立体声FM-in输入FMINL,FMINR

支持同时playback和record(全双工模式)

DAC及ADC均支持DRC

2.21.2.2内核配置

kernel_menuconfig配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Sun20iw1 Codec Support <*> Allwinner Audio Simple Card [ ] Allwinner RX SYNC Support

配置项名称 配置项说明
Allwinner Sun20iw1 Codec Support audiocodec
Allwinner Audio Simple Card 绑定声卡
Allwinner RX SYNC Support 同步功能组件

2.21.2.3 DTS配置.

board.dts板级配置

&codec { /* MIC and headphone gain setting */ mic1gain = <0x1F>; mic2gain = <0x1F>; mic3gain = <0x1F>; /* ADC/DAC DRC/HPF func enabled */ ¦ /* 0x1:DAP_HP_EN; 0x2:DAP_SPK_EN; 0x3:DAP_HPSPK_EN */ adcdrc_cfg = <0x0>; adchpf_cfg = <0x1>; dacdrc_cfg = <0x0>; dachpf_cfg = <0x0>; /* Volume about */ digital_vol = <0x00>; lineout_vol = <0x1a>; headphonegain = <0x03>; /* Pa enabled about */ pa_level = <0x01>; pa_pwr_level = <0x01>; pa_msleep_time = <0x78>; /* gpio-spk = <&pio PF 2 GPIO_ACTIVE_HIGH>;*/ /* gpio-spk-pwr = <&pio PF 4 GPIO_ACTIVE_HIGH>; */ /* CMA config about */ playback_cma = <128>; capture_cma = <256>; /* regulator about */ /* avcc-supply = <®_aldo1>; */ /* hpvcc-supply = <®_eldo1>; */ status = "okay"; };

部分配置项名称 配置取值 配置项说明
mic3gain 0-31 mic3增益
digital_vol 0-63 DAC数字音量
headphonegain 0-7 耳机播放增益
pa_level 0-1 功放芯片使能电平
pa_pwr_level 0-1 功放供电使能电平
pa_msleep_time u32,一般小于 200 x u32,一般小于 200 设置功放芯片使能所需sleep时间
status “okay”/“disable” 使能或者关闭本节点

 

2.21.3 Daudio

2.21.3.1硬件特性

• 两路I2S/PCM I2S1 I2S2

支持8-192k采样率

支持16 24 32采样精度

支持1-16多通道录音播放

支持 5 种TDM模式

I2S standard mode

Left-justified mode

Right-justified mode

DSP-A mode(short frame PCM mode)

DSP-B mode(long frame PCM mode)

支持回环模式

支持同时playback和capture

支持多声卡同步录音

2.21.3.2内核配置

kernel_menuconfig配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Audio Simple Card <*> Allwinner Digital Audio Support [ ] Allwinner RX SYNC Support

配置项名称 配置项说明
Allwinner Sun20iw1 Codec Support I2S/PCM
Allwinner Audio Simple Card 绑定声卡
Allwinner RX SYNC Support 同步功能组件

2.21.3.3 DTS配置.

board.dts板级配置

&daudio1 { mclk_div = <0x01>; frametype = <0x00>; tdm_config = <0x01>; sign_extend = <0x00>; msb_lsb_first = <0x00>; pcm_lrck_period = <0x80>; slot_width_select = <0x20>; pinctrl-names = "default", "sleep";pinctrl-0 = <&daudio1_pins_a>; pinctrl-1 = <&daudio1_pins_b>; pinctrl_used = <0x0>; status = "disabled"; }; &sounddaudio1 { status = "disabled"; daudio1_master: simple-audio-card,codec { /* sound-dai = <&ac108>; */ }; };

设备树配置sun20iw1p1.dtsi

daudio1:daudio@2033000 { #sound-dai-cells = <0>; compatible = "allwinner,sunxi-daudio"; reg = <0x0 0x02033000 0x0 0xa0>; clocks = <&ccu CLK_PLL_AUDIO0>, ¦<&ccu CLK_I2S1>, ¦<&ccu CLK_BUS_I2S1>; clock-names = "pll_audio", "i2s1", "i2s1_bus"; resets = <&ccu RST_BUS_I2S1>; dmas = <&dma 4>, <&dma 4>; dma-names = "tx", "rx"; interrupts-extended = <&plic0 43 IRQ_TYPE_LEVEL_HIGH>; sign_extend = <0x00>; tx_data_mode = <0x00>; rx_data_mode = <0x00>; msb_lsb_first = <0x00>; pcm_lrck_period = <0x80>; slot_width_select = <0x20>; frametype = <0x00>; tdm_config = <0x01>; tdm_num = <0x01>; mclk_div = <0x00>; clk_parent = <0x01>; capture_cma = <128>; playback_cma = <128>; tx_num = <4>; tx_chmap1 = <0x76543210>; tx_chmap0 = <0xFEDCBA98>; rx_num = <4>; rx_chmap3 = <0x03020100>; rx_chmap2 = <0x07060504>; rx_chmap1 = <0x0B0A0908>; rx_chmap0 = <0x0F0E0D0C>; asrc_function_en = <0x00>; rx_sync_en = <0x00>; device_type = "daudio1"; status = "disabled"; }; sounddaudio1: sounddaudio1@20330a0 { reg = <0x0 0x020330a0 0x0 0x4>; compatible = "sunxi,simple-audio-card"; simple-audio-card,name = "snddaudio1"; simple-audio-card,format = "i2s"; status = "disabled"; simple-audio-card,cpu { sound-dai = <&daudio1>; }; };

部分配置项名称 配置取值 配置项说明
status “okay” “disable” 使能或者关闭snddaudio驱动
mclk_div 0-192 mclk分频系数,取值为 0/1/2/4/8/12/16/24/32/48/64/96/128/176/192
frametype 0-1 0:short frame(1 clock width) 1:long frame(2 clock width)
tdm_config 0-1 0:PCM mode 1:I2S mode
sign_extend 0-1 0:zero pending 1:sign extend
msb_lsb_first 0-1 0:msb first 1:lsb first
pcm_lrck_period 16/32/64/128/256 一般可配置为16/32/64/128/256个 bclk
slot_width_select 8/16/32 slot支持8/16/32bit宽度
tx_data_mode 0/1/2/3 0:16bit linear PCM 1:reserved 2:8bit u-law 3:8bit a-law
rx_data_mode 0/1/2/3 0:16bit linear PCM 1:reserved 2:8bit u-law 3:8bit a-law
simple-audio-card,name string 声卡名称
simple-audio-card,format string I2S tdm模式,取值为 “i2s”/“right_j”/“left_j”/“dsp_a”/“dsp_b”
simple-audio-card,frame- master 注释为false,反 之为true 配置frame clk主从关系,不配置则 soc为主,反之soc为从
simple-audio-card,bitclock- master 注释为false,反 之为true 配置bit clk主从关系,不配置则soc为 主,反之soc为从
simple-audio-card,frame- inversion 注释为false,反 之为true 配置frame clk极性取反;不配置则是正 常极性
simple-audio-card,bitclock- inversion 注释为false,反 之为true 配置bit clk极性取反;不配置则是正常 极性
simple-audio- card,capture_only 注释为false,反 之为true 仅支持录音
simple-audio- card,playback_only 注释为false,反 之为true 仅支持播放

2.21.4 DMIC.

2.21.4.1硬件特性

支持8-48k采样率

支持16 24采样精度

支持1-8多通道录音播放

支持多声卡同步录音

2.21.4.2内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Audio Simple Card <*> Allwinner DMIC Support [ ] Allwinner RX SYNC Support

配置项名称 配置项说明
Allwinner Sun20iw1 Codec Support dmic
Allwinner Audio Simple Card 绑定声卡
Allwinner RX SYNC Support 同步功能组件

2.21.4.3 DTS配置.

&dmic { pinctrl-names = "default","sleep"; pinctrl-0 = <&dmic_pins_a>; pinctrl-1 = <&dmic_pins_b>; rx_sync_en = <0x00>; status = "okay"; }; &dmic_codec { status = "okay"; }; &sounddmic { status = "okay"; };

部分配置项名称 配置取值 配置项说明
status “okay”/“disable” 使能或者关闭本节点
rx_sync_en 注释为false反之为true 是否注册rx_sync组件

2.21.5 SPDIF

2.21.5.1硬件特性

支持22.05-192k采样率

支持16 24采样精度

支持1-2多通道录音播放

支持多声卡同步录音

支持回环模式

支持IEC-60958协议

支持IEC-61937协议

2.21.5.2内核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Audio Simple Card <*> Allwinner SPDIF Support [ ] Allwinner RX SYNC Support

配置项名称 配置项说明
Allwinner Sun20iw1 Codec Support spdif
Allwinner Audio Simple Card 绑定声卡
Allwinner RX SYNC Support 同步功能组件

2.21.5.3 DTS配置.

&spdif { pinctrl-names = "default","sleep"; pinctrl-0 = <&spdif_pins_a>; pinctrl-1 = <&spdif_pins_b>;rx_sync_en = <0x00>; status = "okay"; }; &soundspdif { status = "okay"; };

部分配置项名称 配置取值 配置项说明
status “okay” “disable” 使能或者关闭本节点
rx_sync_en 注释为false反之为true 是否注册rx_sync组件

2.21.6 标案音频测试方法.

该章节主要介绍在标案上进行播歌,录音的测试命令

2.21.6.1播放

通过Headphone播放 1.开机后推送测试音频48000.wav到小机端,pc命令:adb push 48000.wav /tmp/ 2.播放该音频文件, aplay /tmp/48000.wav

2.21.6.2录音

mic: 1.使能mic3通路:amixer set "ADC3 Input MIC3 Boost" on 2.设置mic3增益:amixer cset name="MIC3 gain volume" 31 3.录音5s:arecord -D hw:audiocodec -f S16_LE -r 44100 -c 1 /tmp/test.wav --period-size 1024 --buffer-size 4096 -d 5 linein: 1.使能linein通路:amixer set "ADC1 Input LINEINL" on;amixer set "ADC2 Input LINEINR" on 2.设置linein增益:amixer cset name="LINEINL gain volume" 1;amixer cset name="LINEINR gain volume" 1 3.录音5s:arecord -D hw:audiocodec -f S16_LE -r 44100 -c 2 /tmp/test.wav --period-size 1024 --buffer-size 4096 -d 5 fmin: 1.使能fmin通路:amixer set "ADC1 Input FMINL" on;amixer set "ADC2 Input FMINR" on 2.设置fmin增益:amixer cset name="FMINL gain volume" 1;amixer cset name="FMINR gain volume" 1 3.录音5s:arecord -D hw:audiocodec -f S16_LE -r 44100 -c 2 /tmp/test.wav --period-size 1024 --buffer-size 4096 -d 5 I2S: 1.推送音频文件到小机端:adb push 16000.wav /tmp/16000.wav

2.配置I2S Loopback功能:amixer -D hw:snddaudio2 cset name='sunxi daudio loopback debug' 1 3.开始录音:arecord -D hw:snddaudio2 -f S16_LE -r 44100 -c 2 /tmp/test_su.wav --period-size 1024 --buffer-size 4096 & 4.开始播放:aplay -D hw:snddaudio2 /tmp/16000.wav 5.aplay播放结束后,killall arecord结束录音任务 6.通过adb命令把test_su.wav拉出来,在PC端查看音频数据是否跟播放的内容一致

3 3常用工具及调试方法

3.1 3.1 alsa-utils

标准ALSA工具,它使用到alsa-lib标准库,一般常用到的有amixer,aplay,arecord等。

3.1.1 3.1.1 amixer

amixer是命令行的ALSA声卡驱动调节器工具,用于设置mixer control。

使用方法:

• 常用选项

选项 功能
-D,--device 指定声卡设备,默认使用defaul

• 常用命令

命令 功能
controls 列出指定声卡的所有控件
contents 列出指定声卡的所有控件的具体信息
cget 获取指定控件的信息
cset 设定指定控件的值

举例:

获取audiocodec声卡的所有控件名 amixer -Dhw:audiocodec controls 获取当前硬件音量 amixer -Dhw:audiocodec cget name='LINEOUT volume' 设置当前硬件音量 amixer -Dhw:audiocodec cget name='LINEOUT volume' 25

3.1.2 3.1.2 aplay

aplay是命令行的ALSA声卡驱动的播放工具,用于播放功能。

使用方法:

选项 功能
-D,--device 指定声卡设备,默认使用default
-l,--list-devices 列出当前所有声卡
-t,--file-type 指定播放文件的格式,如voc,wav,raw,不指定的情况下会去读取文件 头部作识别
-c,--channels 指定通道数
-f,--format 指定采样格式
-r,--rate 采样率
-d,--duration 指定播放的时间
--period-size 指定period size
--buffer-size 指定buffer size

如果播放的是wav文件,可以解析头部,识别通道数,采样率等参数。

举例:

aplay -Dhw:audiocodec /mnt/UDISK/test.wav

3.1.3 3.1.3 arecord.

arecord是命令行的ALSA声卡驱动的录音工具,用于录音功能。

使用方法:

选项 功能
-D,--device 指定声卡设备,默认使用default
-l,--list-devices 列出当前所有声卡
-t,--file-type 指定播放文件的格式,如voc,wav,raw,不指定的情况下会去读取文件 头部作识别
-c,--channels 指定通道数
-f,--format 指定采样格式
-r,--rate 采样率
-d,--duration 指定播放的时间
--period-size 指定period size
--buffer-size 指定buffer size

举例:

录制5s,通道数为2,采样率为16000,采样精度为16bit,保存为wav文件 arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 -d 5 /mnt/UDISK/test.wav

3.1.4 3.1.4 alsaconf

alsaconf指的是ALSA configuration file,使用alsa-lib打开声卡,操作pcm, mixer时,会 加载相关位置上的配置文件,用于指导操作pcm,mixer设备。

首先会读取配置文件/usr/share/alsa/alsa.conf,其中有下面一段hooks。

@hooks [ { func load files [ { @func concat strings [ { @func datadir } "/alsa.conf.d/" ] } "/etc/asound.conf" "~/.asoundrc" ] errors false } ]

这里设定了一个钩子,去读取相关目录配置文件:

/usr/share/alsa/alsa.conf.d/ /etc/asound.conf ~/.asoundrc

这些配置文件可以设定defaut声卡,自定义pcm设备,alsa插件等功能,具体可以参考:

https://www.alsa-project.org/alsa-doc/alsa-lib/conf.html

https://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html

tina sdk下有相关软件包会设置/etc/asound.conf,可以用作参考。

使用方法:

tina根目录下执行make menuconfig,选择alsa-conf-aw软件包。

开发指南开发指南

它会生成/etc/asound.conf文件,下面作简单介绍:

设定amixer操作的defautl声卡(执行snd_hctl_open会获取该配置) ctl.!default { type hw card audiocodec } 设定default声卡(执行snd_pcm_open会获取该配置) pcm.!default { type asym playback.pcm "PlaybackDmix" capture.pcm "CaptureDsnoop" } 使用dmix插件,可以混合播歌,即支持多次打开声卡进行播歌 pcm.PlaybackDmix { type plug slave.pcm { type dmix ipc_key 1111 ipc_perm 0666 slave { pcm "hw:audiocodec" rate 48000 channels 2 } } } 使用dsnoop插件,可以混合录音,即支持多次打开声卡进行录音 pcm.CaptureDsnoop { type plug slave.pcm { type dsnoop ipc_key 1111 ipc_perm 0666 slave { pcm "hw:audiocodec,0" rate 48000 channels 2 } } } 使用dmix插件以及softvol插件,softvol插件可以增加一个control,用于控制音量(软件上作调节) pcm.PlaybackDmix { type plug slave.pcm { type softvol slave.pcm { type dmix ipc_key 1111 ipc_perm 0666 slave { pcm "hw:audiocodec,0" rate 48000 channels 1 } } control { name "Soft Volume Master" card audiocodec } min_dB -51.0 max_dB 0.0 resolution 256 } }

 

3.2 3.2 tinyalsa-utils.

tinyalsa是alsa-lib的一个简化版。它提供了pcm和control的基本接口;没有太多太复杂的 操作、功能。可以按需使用接口。tinyalsa-utils是基于tinyalsa的一些工具,下面对几个常用 的工具作介绍。

3.2.1 3.2.1 tinymix

与amixer作用类似,用于操作mixer control。

• 常用选项

选项 功能
-D,–card 指定声卡设备,默认使用card0

• 常用命令

命令 功能
controls 列出指定声卡的所有控件
contents 列出指定声卡的所有控件的具体信息
get 获取指定控件的信息
set 设定指定控件的值

举例:

获取card0的所有控件名 tinymix -D 0 controls 获取card0当前硬件音量 tinymix -D 0 get 'LINEOUT volume' 设置card0当前硬件音量 tinymix -D 0 set 'LINEOUT volume' 25

3.2.2 3.2.2 tinyplay

与aplay作用类似,用于操作声卡设备进行播放

• 常用选项

选项 功能
-D,–card 指定声卡设备,默认使用card0
-p,–period-size 指定period大小,单位为帧
-c,–channels 指定通道数
-r,–rate 指定采样率
-b,–bits 指定采样精度

如果播放的是wav文件,可以解析头部,识别通道数,采样率等参数

举例:

tinyplay -D 0 /tmp/16000-stere-10s.wav

3.2.3 3.2.3 tinycap

与arecord作用类似,用于操作声卡进行录音功能

• 常用选项

选项 功能
-D,–device 指定声卡设备,默认使用card0
-p,–period-size 指定period大小,单位为帧
-c,–channels 指定通道数
-r,–rate 指定采样率
-b,–bits 指定采样精度

举例:

录制通道数为2,采样率为16000,采样精度为16bit,保存为wav文件 tinycap -D 0 -b 16 -r 16000 -c 2 /mnt/UDISK/test.wav

3.3 3.3 dump寄存器

我们sunxi平台均提供了sunxi_dump驱动,用于查看读写寄存器。

节点位于/sys/class/sunxi_dump目录。

但是audiocodec模拟寄存器的操作会有些特殊,我们一般在audio驱动中都会增加相关调试节 点,去操作自己模块的寄存器,以便调试。

3.3.1 3.3.1 dump audiocodec寄存器

audiocodec驱动的寄存器调试节点位于:

/sys/devices/platform/soc/codec/audio_reg_debug/audio_reg

使用方法:

通过echo写入下列参数

参数1: 0-read; 1-write

参数2: 1-digitar reg; 2-analog reg

参数3: reg value

参数4: write value

举例:

查看所有寄存器状态:

cat /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 打印如下(其中地址为0x300以上的寄存器为模拟寄存器,其他均为数字寄存器): dump audio reg: SUNXI_DAC_DPC [0x000]: 0x0 Save:0x0 SUNXI_DAC_FIFO_CTL [0x010]: 0x3004000 Save:0x0 SUNXI_DAC_FIFO_STA [0x014]: 0x80800c Save:0x0 SUNXI_DAC_CNT [0x024]: 0xb4014 Save:0x0 SUNXI_DAC_DG [0x028]: 0x0 Save:0x0 SUNXI_ADC_FIFO_CTL [0x030]: 0xe000400 Save:0x0 SUNXI_ADC_FIFO_STA [0x038]: 0x0 Save:0x0 SUNXI_ADC_CNT [0x044]: 0x0 Save:0x0 SUNXI_ADC_DG [0x04c]: 0x0 Save:0x0 SUNXI_DAC_DAP_CTL [0x0f0]: 0x0 Save:0x0 SUNXI_ADC_DAP_CTL [0x0f8]: 0x0 Save:0x0 SUNXI_HP_CTL [0x300]: 0x0 Save:0x0 SUNXI_MIX_DAC_CTL [0x303]: 0x0 Save:0x0 SUNXI_LINEOUT_CTL0 [0x305]: 0x10 Save:0x0 SUNXI_LINEOUT_CTL1 [0x306]: 0x19 Save:0x0 SUNXI_MIC1_CTL [0x307]: 0x34 Save:0x0 SUNXI_MIC2_MIC3_CTL [0x308]: 0x4 Save:0x0 SUNXI_LADCMIX_SRC [0x309]: 0x4 Save:0x0 SUNXI_RADCMIX_SRC [0x30a]: 0x8 Save:0x0 SUNXI_XADCMIX_SRC [0x30b]: 0x10 Save:0x0SUNXI_ADC_CTL [0x30d]: 0x3 Save:0x0 SUNXI_MBIAS_CTL [0x30e]: 0x21 Save:0x0 SUNXI_APT_REG [0x30f]: 0xd6 Save:0x0 SUNXI_OP_BIAS_CTL0 [0x310]: 0x55 Save:0x0 SUNXI_OP_BIAS_CTL1 [0x311]: 0x55 Save:0x0 SUNXI_ZC_VOL_CTL [0x312]: 0x2 Save:0x0 SUNXI_BIAS_CAL_CTRL [0x315]: 0x0 Save:0x0

查看某个数字寄存器状态:

echo 0,1,0x10 > /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 打印如下: [ 127.036609] sunxi-internal-codec codec: ret:3, reg_group:1, reg_offset:16, reg_val:0x0 [ 127.045557] sunxi-internal-codec codec: [ 127.045557] [ 127.045557] Reg[0x10] : 0x03004000 [ 127.045557] 表示0x10数字寄存器的值为0x03004000

查看某个模拟寄存器状态:

echo 0,2,0x5 > /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 打印如下: [ 306.126103] sunxi-internal-codec codec: ret:3, reg_group:2, reg_offset:5, reg_val:0x0 [ 306.134971] sunxi-internal-codec codec: [ 306.134971] [ 306.134971] Reg[0x05] : 0x10 [ 306.134971] 表示0x05模拟寄存器的值为0x10

改写某个数字寄存器:

echo 1,1,0x24,0 > /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 表示将0x24数字寄存器写为0x0

改写某个模拟寄存器:

echo 1,2,0x3,0x1 > /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 表示将0x03模拟寄存器写为0x1

3.3.2 3.3.2 dump daudio寄存器

查看spec可以知道i2s模块的寄存器基地址

i2s0: 0x05090000 i2s1: 0x05091000 i2s2: 0x05092000

可以通过sunxi_dump节点查询寄存器状态,例如查看i2s0的寄存器:

cd /sys/class/sunxi_dump echo 0x05090000,0x050900a0 > dump cat dump

3.3.3 3.3.3 dump dmic寄存器

查看spec可以知道dmic模块的寄存器基地址

dmic: 0x05095000

可以通过sunxi_dump节点查询寄存器状态:

cd /sys/class/sunxi_dump echo 0x05095000,0x05095050 > dump cat dump

3.3.4 3.3.4 dump spdif寄存器

查看spec可以知道spdif模块的寄存器基地址

spdif: 0x05093000

可以通过sunxi_dump节点查询spdif寄存器状态:

cd /sys/class/sunxi_dump echo 0x05093000,0x05093040 > dump cat dump

3.4 3.4 sound procfs.

通过procfs文件系统下面的声卡相关节点,可以得到各个声卡各个音频流的状态。实际调试中会 非常有用。

内核需要选中下面选项才能在procfs下生成对应节点:

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> [*] Sound Proc FS Support [*] Verbose procfs contents

以card0为例看下提供的节点信息:

ddd /proc/asound/card0/ ├── id /*声卡名称*/ ├── pcm0c /* pcm0录音流*/ │ ├── info /* pcm信息*/ │ └── sub0 │ ├── hw_params /*硬件参数信息*/ │ ├── info /* pcm信息*/ │ ├── status /* pcm流运行状态*/ │ └── sw_params /*软件参数信息*/ └── pcm0p /* pcm0播放流*/ ├── info └── sub0

其中,hw_params, status都能拿到比较有用的信息:

cat /proc/asound/card0/pcm0c/sub0/hw_params access: RW_INTERLEAVED /*交错模式排列通道*/ format: S16_LE /*当前音频流的采样精度*/ subformat: STD channels: 2 /*通道数*/ rate: 16000 (16000/1) /*采样率*/ period_size: 320 /*周期(决定dma中断时间,例如这里period_time=320/16000=20ms) */ buffer_size: 2560 /*内核ALSA框架中环形缓冲区大小,决定能够缓存多少个period */ cat /proc/asound/card0/pcm0c/sub0/status state: RUNNING /*音频流运行状态,RUNNING, SETUP等状态*/ owner_pid : 22653 trigger_time: 81828.078175765 tstamp : 82373.796969347 /*开始运行后的时间戳信息*/ delay : 256 avail : 256 /*当前可用音频数据帧数*/ avail_max : 320 ----- hw_ptr : 8731456 /*硬件逻辑指针,单位(帧) */ appl_ptr : 8731200 /*应用逻辑指针,单位(帧) */

从period_size可以知道当前dma中断频率,太快会影响系统响应速度,太慢可能就存在一 定延时。

buffer_size可以知道缓存区大小,太小容易因调度不及时出现xrun,太大同样存在一定延时。

从hw_ptr, appl_ptr可以知道当前录音/播音的帧数,是否发生过xrun等。

4 4常用接口说明

这里主要介绍alsa-lib中的常用接口

4.1 4.1 control接口

为了方便操作访问,alsa-lib中封装了相关接口,通过control节点(/dev/snd/controlCX)去获 取、设置control elements

主要涉及到的接口:

snd_ctl_open snd_ctl_elem_info_get_id snd_ctl_elem_info_set_id snd_ctl_elem_info snd_ctl_ascii_value_parse snd_ctl_elem_read snd_ctl_elem_write snd_ctl_close

详细control接口说明请查阅:

https://www.alsa-project.org/alsa-doc/alsa-lib/control.html

https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html

下面是一个设置音量接口的例子:

#include #include #include #include #include #include #include #define DEV_NAME "hw:audiocodec" #define VOLUME_CONTROL "name='LINEOUT volume'" /* Fuction to convert from percentage to volume. val = volume */ static int convert_volume(int percent, long min, long max) { long range = max - min;if (range == 0) return 0; return (int)((range * percent / 100) + min);

}

bool controlVolume(int volume_percent) { int err = -1; snd_ctl_t *handle = NULL; char *card = DEV_NAME; char *volume_control = VOLUME_CONTROL; char volume_string[4]; long min, max, raw; snd_ctl_elem_info_t *info = NULL; snd_ctl_elem_id_t *id = NULL; snd_ctl_elem_value_t control = NULL; if (volume_percent > 100 || volume_percent < 0) return false; snd_ctl_elem_info_alloca(&info); snd_ctl_elem_id_alloca(&id); snd_ctl_elem_value_alloca(&control); err = snd_ctl_ascii_elem_id_parse(id, volume_control); if (err < 0) { fprintf(stderr, "Wrong control identifier: %sn", volume_control); goto failed; } err = snd_ctl_open(&handle, card, 0); if (err < 0) { fprintf(stderr, "Control device %s open error:%sn", card, snd_strerror(err)); goto failed; } snd_ctl_elem_info_set_id(info, id); err = snd_ctl_elem_info(handle, info); if (err < 0) { fprintf(stderr, "Cannot find the given element from control %sn", card); goto failed; } snd_ctl_elem_info_get_id(info, id); snd_ctl_elem_value_set_id(control, id); err = snd_ctl_elem_read(handle, control); if (err < 0) { fprintf(stderr, "Cannot read the given element from control %sn", card); goto failed; } min = snd_ctl_elem_info_get_min(info); max = snd_ctl_elem_info_get_max(info); snprintf(volume_string, sizeof(volume_string), "%d", convert_volume(volume_percent, min , max)); /printf("set volume %s, [%u%%]n", volume_string, volume_percent);*/ err = snd_ctl_ascii_value_parse(handle, control, info, volume_string); if (err < 0) { fprintf(stderr, "Control %s parse error: %sn", card, snd_strerror(err)); goto failed; } err = snd_ctl_elem_write(handle, control);

if (err < 0) { fprintf(stderr, "Control %s write error: %sn", card, snd_strerror(err)); goto failed; } failed: if (info) snd_ctl_elem_info_free(info); if (id) snd_ctl_elem_id_free(id); if (control) snd_ctl_elem_value_free(control); if (handle) snd_ctl_close(handle); return ((err < 0)? false : true); }

4.2 4.2 PCM接口.

为了方便操作访问,alsa-lib中封装了相关接口,通过pcmCXDXp/pcmCXDXc节点(/dev/s- nd/pcmCXDXx)去实现播放、录音功能。

主要涉及到的接口:

snd_pcm_open snd_pcm_info snd_pcm_hw_params_any snd_pcm_hw_params_set_access snd_pcm_hw_params_set_format snd_pcm_hw_params_set_channels snd_pcm_hw_params_set_rate_near snd_pcm_hw_params_set_buffer_size_near snd_pcm_hw_params snd_pcm_sw_params_current snd_pcm_sw_params snd_pcm_readi snd_pcm_writei snd_pcm_close

详细pcm接口说明请查阅:

https://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html

https://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html

接口使用例子可以参考aplay,arecord的实现,代码可以在alsa-utils中找到(dl/alsa-utils- 1.1.0.tar.bz2)

5 开机音乐功能

这里开机音乐功能,指的是在uboot阶段开始启动dma将音频数据搬运到AudioCodec的 FIFO中进行播歌,同时CPU继续开机流程进入内核。进入系统后,在合适的启动脚本中加载音 频驱动模块(如果builtin,那么音乐会提前中止),这样开机音乐可以大大的提前,给用户一种迅 速开机的错觉。

目前SDK代码中支持uboot开机音乐功能的平台有:R6,R7s,R11,R16,R328,R311,MR133

配置使用方法都比较类似,下面以R328为例进行说明。

5.1 配置方法

修改uboot配置文件

可修改默认配置configs/sun8iw18p1_defconfig增加下面几项 CONFIG_SOUND_SUNXI_SOC_RWFUNC=y CONFIG_SOUND_SUNXI_SUN8IW18_CODEC=y CONFIG_SOUND_SUNXI_BOOT_TONE=y

也可以通过kconfig进行配置lichee/brandy-2.0/u-boot-2018目录下执行makemenu- config ARCH=arm,选上对应功能项:选中sun8iw18的codec驱动以及开机音乐功能

开发指南

修改sys_config文件

配置boottone_used为1,表示使用开机音乐功能 ;---------------------------------------------------------------------------------- ;boot tone configuration ; ;boottone_used ---boot tone enable ;len_limit ---set size in bytes, normally do not need to set it and driver will use file size ;---------------------------------------------------------------------------------- [boottone] boottone_used = 1另外codec节点也需要配置正确,下面是部分重要配置 [codec] codec_used = 0x1 lineout_vol =0x1a gpio-spk = port:PH9<1><1><1><1>

创建boottone分区

开机音乐的音频文件需要放置在单独一个分区中,例如boottone分区,修改sys_partition.fex 文件: [partition] name = boottone size = 2048 downloadfile = "boottone.fex" user_type = 0x8000上述 2048 表示1M的空间,注意根据实际音频文件大小填写合适的size 然后将音频文件重命名为boottone.fex,并放置到方案配置目录下,以cowbell-perf1方案 为例: mv kaiji.wav target/allwinner/cowbell-perf1/configs/boottone.fex

修改env配置文件

主要增下面几行: uboot_tone_addr=0x4327ffd4 boottone_partition=boottone load_boottone=sunxi_flash read ${uboot_tone_addr} ${boottone_partition}uboot_tone_addr用于指定音频文件加载到dram的地址 boottone_partition用于指定音频文件所在分区名 load_boottone用于加载音频文件到dram的命令

将内核AudioCodec驱动编译成模块

make kernel_menuconfig去除下面几个配置: @@ -702,14 +705,9 @@ CONFIG_SND_SOC_I2C_AND_SPI=y # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8985 is not set-CONFIG_SND_SUN8IW18_CODEC=y # CONFIG_SND_SUNXI_MAD is not set -CONFIG_SND_SUNXI_SOC=y -CONFIG_SND_SUNXI_SOC_CPUDAI=y -CONFIG_SND_SUNXI_SOC_DAUDIO=y -CONFIG_SND_SUNXI_SOC_RWFUNC=y -CONFIG_SND_SUNXI_SOC_SUN8IW18_CODEC=y -CONFIG_SND_SUNXI_SOC_SUNXI_DAUDIO=y +# CONFIG_SND_SUNXI_SOC_SUN8IW18_CODEC is not set +# CONFIG_SND_SUNXI_SOC_SUNXI_DAUDIO is not set # CONFIG_SND_SUNXI_SOC_SUNXI_DMIC is not set # CONFIG_SND_SUNXI_SOC_SUNXI_SPDIF is not set CONFIG_SND_SUPPORT_OLD_API=ymake menuconfig增加驱动模块配置 @@ -2923,7 +2929,7 @@ CONFIG_PACKAGE_kmod-sound-core=y # CONFIG_PACKAGE_kmod-sound-soc-ac97 is not set # CONFIG_PACKAGE_kmod-sound-soc-core is not set # CONFIG_PACKAGE_kmod-sound-via82xx is not set -# CONFIG_PACKAGE_kmod-sunxi-sound is not set +CONFIG_PACKAGE_kmod-sunxi-sound=y

5.2 注意事项

uboot退出时,不能关掉dma。如果发生在跳转kenrel时声音变化或消失,请确认跳转到内 核前是否调用了sunxi_dma_exit();

内核并不知道uboot将音频加载到dram的位置。理论上,kernel可能会在初始化过程中, 用到那片内存,导致音乐播放不正常。

可以在dts中,将该片内存改为reserve属性,可以确保kernel不会使用到。

选用kernel初始化不会用到的内存块

可以在uboot命令行下执行boottone命令进行调试

6 各平台音频模块注意事项

6.1 R328.

只有一个DAC,所以在播放两通道数据的时候,硬件上会将第二个通道的数据丢掉。如果想

要将两通道数据都完成播放出来,需要在软件上将两通道合成,可利用alsa插件实现,例如下 面配置: pcm.playback { type plug slave { pcm "hw:audiocodec,0" rate 48000 channels 1 } }alsa插件会将两通道数据的幅度衰减为由原来的一半(如果直接相加,幅度为原来的两倍,有 可能造成削顶),再组合为一通道写入声卡中。

使用模拟mic作AEC时,需要将该MIC gain设置为0dB.如果有增益,则会导致录音开始及结束时产生pop音(开关PA产生的pop音,经过差分MIC消除后仍然存在极小的杂音,如果再经过MIC增益放大,则会变为明显的pop音)

 

  审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分