前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tina_Linux_音频_开发指南

Tina_Linux_音频_开发指南

作者头像
韦东山
发布2023-02-25 10:08:01
7.2K0
发布2023-02-25 10:08:01
举报
文章被收录于专栏:韦东山嵌入式韦东山嵌入式

文章目录

OpenRemoved_Tina_Linux_音频_开发指南

1 概述

1.1 编写目的

介绍Tina平台音频模块的使用方法。

1.2 适用范围

Allwinner软件平台Tina。

Allwinner 硬件平台R6, R7s, R11, R16, R18, R30, R58, R328, R332, R333, R311, MR133, T7, R329, MR813, R818, R818B, R528, H133, V853, F133。

1.3 相关人员

Tina平台下进行音频模块开发的工程师。

1.4 相关术语

术语

解释说明

ALSA

Advanced Linux Sound Architecture

DMA

直接内存存取,指数据不经cpu,直接在设备和内存,内存和内存,设备和设备之间传输

ASoC

ALSA System on Chip

样本长度sample

样本是记录音频数据最基本的单位,常使用 16 位

通道数channel

该参数为 1 表示单声道, 2 则是立体声

帧frame

帧记录了一个声音单元,其长度为样本长度与通道数的乘积

采样率rate

每秒钟采样次数,该次数是针对帧而言

周期period

音频设备一次处理所需要的帧数,对于音频设备的数据访问以及音频数据的存储,都是以此为单位

交错模式interleaved

是一种音频数据的记录模式,在交错模式下,数据以连续帧的形式存放,即首先记录完帧1 的左声道样本和右声道样本(假设为立体声格式),再开始帧2 的记录,而在非交错模式下,首先记录的是一个周期内所有帧的左声道样本,再记录右声道样本,数据是以连续通道的方式存储。不过多数情况下,我们只需要使用交错模式就可以了

AudioCodec

芯片内置音频接口

Daudio

数字音频接口,可配置成I2S/PCM 标准音频接口

Dmic

数字麦接口

MAD

Mic Activity Detector, 语音能量检测模块

AGC

Automatic Gain Control

DRC

Dynamic Range Control

2 模块介绍

Linux中的音频子系统采用ALSA架构实现。ALSA目前已经成为了Linux的主流音频体系结构。在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。

2.1 驱动框架

Tina SDK对各个平台的音频设备驱动均采用ASoC架构实现。ASoC是建立在标准alsa驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频codec的一套软件体系,ASoC将音频系统分为 3 部分:Codec,Platform和Machine。

Codec驱动

ASoC中的一个重要设计原则就是要求Codec驱动是平台无关的,它包含了一些音频的控件 (Controls),音频接口,DAMP(动态音频电源管理)的定义和某些Codec IO功能。为了保证 硬件无关性,任何特定于平台和机器的代码都要移到Platform和Machine驱动中。 所有的Codec驱动都要提供以下特性:

代码语言:javascript
复制
 - 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-1: ASoC框图
图2-1: ASoC框图

2.2 音频接口介绍.

我们提供的音频接口有:

  • AudioCodec
  • Daudio(I2S)
  • Dmic
  • Spdif
  • MAD

不同芯片平台的音频接口资源会有差异;不同版本的内核,对应的ALSA驱动也有所不同;下面会对各个芯片作详细介绍。

2.3 R6音频接口

2.3.1 硬件资源

R6包含 2 个音频模块,分别是内置audiocodec以及daudio0。

图2-2: R6音频硬件框图
图2-2: R6音频硬件框图
2.3.2 时钟源

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

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

图2-3: R6时钟源
图2-3: R6时钟源
2.3.3 代码结构
代码语言:javascript
复制
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 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[sndcodec]
sndcodec_used = 0x1
;------------------------------------------------------------------------------
[cpudai]
cpudai_used = 0x1
;------------------------------------------------------------------------------
[codec]
codec_used = 0x1
headphonevol = 0x3b
maingain = 0
pa_sleep_time = 30
gpio-spk = port:PD03<1><1><default><default>
gpio_shdn = 1

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

sndcodec配置

sndcodec配置说明

sndcodec_used

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

cpudai配置,即platform驱动的相关配置。

cpudai配置

cpudai配置说明

cpudai_used 是否使用cpudai驱动。

0 :不使用; 1 :使用

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

codec配置

codec配置说明

codec_used

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

headphonevol

headphone volume,可设定范围0~0x3f, 0表示mute, 163表示-62dB0dB, 1dB/step

micgain

mic增益,可设定范围0~0x7, 0:0dB, 17:1533dB, 3dB/step,一般设置0x4,即24dB.如果作为aec回路,则需要设置为0dB

pa_sleep_time

操作PA之后的延时时间(用来避免pop音),单位ms

gpio-spk

PA使能引脚

gpio_shdn

PA引脚使能方式。0:低电平有效; 1 :高电平有效

说明

  • 如果想要正常加载audiocodec 声卡, 需要把codec,platform,machine 驱动都选上, 即codec_used,cpudai_used,sndcodec_used 都置为1;
  • headphonevol 等值会在驱动初始化的时候设置,进入系统后还可以通过amixer 工具对应控件进行再次修改;
  • 注意gpio-spk 是否配置正确,是否有其他模块复用了该gpio;
  • 除了gpio-spk 指定pa 使能引脚外,驱动中也会检测gpio_num 字段,所以可以直接将gpio 号赋值gpio_num;
  • 注意gpio_shdn,实际功放的PA 引脚是高电平有效,还是低电平有效
2.3.4.3 codec数据通路
图2-4: R6音频通路
图2-4: R6音频通路

R6平台的audiocodec驱动会在播歌的时候自动设置相关通路,默认audio map:

代码语言:javascript
复制
播歌
DACL --> HP_L Mux --> HPOUTL
DACR --> HP_R Mux --> HPOUTR

录音功能则根据需要操作对应空间使能通路:

代码语言:javascript
复制
录制单MIC数据
MICIN --> ADC Mixer -> ADC

录制内部AEC数据(不需要外围回采电路)
Left Output Mixer --> ADC Mixer -> ADC
Right Output Mixer --> ADC Mixer -> ADC

R6相关控件如下表:

控件名称

功能

数值

ADC INPUT GAIN control

ADC增益

0–7,表示-4.5–6dB

ADC MIC Boost AMP

enMIC Boost AMP使能

0:关闭; 1:开启

ADC MIC Boost AMP

gain control MIC增益

0–7, 0:0dB, 1~7:15–33dB

ADC PA speed select

PA速度选择 0:normal; 1:fast

ADC mixer mute for FML

ADC Mixer设置,使能FML通路

0:关闭; 1:开启

ADC mixer mute for FMR

ADC Mixer设置,使能FMR通路

0:关闭; 1:开启

ADC mixer mute for left output

ADC Mixer设置,使能left output Mixer通路

0:关闭; 1:开启

ADC mixer mute for linein

ADC Mixer设置,使能linein通路

0:关闭; 1:开启

ADC mixer mute for mic

ADC Mixer设置,使能mic通路

0:关闭; 1:开启

ADC mixer mute for right output

ADC Mixer设置,使能right output Mixer通路

LINEIN GAIN control

linein到output mixer的增益

0–7, 0~7:0–14dB,2dB/step

MICIN GAIN control

MIC到outpu mixer的增益 0–7,表示-4.5–6dB

dac digital volume

DAC数字音量 063,表示0-73.08dB,-1.16dB/step

head phone volume

headphone音量

0 表示mute, 163表示-62dB0dB, -1dB/step

录音通路设置举例:

  1. 录音单声道数据
代码语言:javascript
复制
通过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
  1. 内部AEC(可省去外部AEC电路)
代码语言:javascript
复制
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 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[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 内核配置
代码语言:javascript
复制
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进行配置:

代码语言:javascript
复制
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的配置

代码语言:javascript
复制
[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工具进行播放即可,如:

代码语言:javascript
复制
aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav

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

代码语言:javascript
复制
amixer -Dhw:audiocodec cset name='headphone volume' 50
2.3.7.2 录音

标案使用AC101进行双声道录音录音前需要配置AC101的音频通路,SDK默认在启动时会进行设置,相关配置脚本在:

代码语言:javascript
复制
/etc/init.d/rc.final

可以直接通过arecord命令进行录音:

代码语言:javascript
复制
arecord -Dhw:sndac1011001a -f S16_LE -r 16000 -c 2 /tmp/test.wav

2.4 R7s音频接口

2.4.1 硬件资源

R7s包含 2 个音频模块,分别是内置AudioCodec以及Daudio0。

图2-5: R7s音频硬件框图
图2-5: R7s音频硬件框图
2.4.2 时钟源

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

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

图2-6: R7s时钟源
图2-6: R7s时钟源
2.4.3 代码结构
代码语言:javascript
复制
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 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[codec]
headphone_vol = 0x3b
lineout_vol = 0x1a
audio_pa_ctrl = port:PB05<1><default><default><0>
adcagc_used = 0
adcdrc_used = 0
dacdrc_used = 0
adchpf_used = 0
dachpf_used = 0

codec配置

codec配置说明

headphone_vol

headphone volume,可设定范围0~0x3f, 0表示mute, 163表示-62dB0dB, 1dB/step

audio_pa_ctrl

PA使能引脚

adcagc_used

1:use adcagc 0:no use

adcdrc_used

1:use adcdrc 0:no use

dacdrc_used

1:use dacdrc 0:no use

adchpf_used

1:use adchpf 0:no use

dachpf_used

1:use dachpf 0:no use

2.4.4.3 codec数据通路
图2-7: R7s音频通路
图2-7: R7s音频通路
代码语言:javascript
复制
播歌
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

通路设置举例:

  1. 播放通路
代码语言:javascript
复制
通过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
  1. 录音通路
代码语言:javascript
复制
通过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 内核配置
代码语言:javascript
复制
Device Drivers --->
    <*> Sound card support --->
        <*> Advanced Linux Sound Architecture --->
            <*> ALSA for SoC audio support --->
                <*> Allwinner Digital Audio Support
2.4.5.2 sys_config配置.
代码语言:javascript
复制
[tdm0]
daudio_used = 0
daudio_master = 4
daudio_select = 1
audio_format = 1
signal_inversion = 1
sample_resolution = 16
slot_width_select = 16
pcm_lrck_period = 32
pcm_lrckr_period = 1
msb_lsb_first = 0
sign_extend = 0
tx_data_mode = 0
rx_data_mode = 0
;i2s_mclk = port:PB08<2><1><default><default>
i2s_bclk = port:PG11<2><1><default><default>
i2s_lrclk = port:PG10<2><1><default><default>
i2s_dout0 = port:PG12<2><1><default><default>
i2s_dout1 =
i2s_dout2 =
i2s_dout3 =
i2s_din = port:PG13<2><1><default><default>

tdm0配置

tdm0配置说明

daudio_master

1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作为slave, codec作为master2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRMmaster),一般不用3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frameslave),一般不用4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作为master, codec作为slave

daudio_select

0: pcm mode; 1: i2s mode

audio_format

1: SND_SOC_DAIFMT_I2S(standard i2s format)2: SND_SOC_DAIFMT_RIGHT_J(right justfied format)3: SND_SOC_DAIFMT_LEFT_J(left justfied format)4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2ndBCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1ndBCLK rising edge after LRC rising edge)

signal_inversion

1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame)2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM)3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM)4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM)

sample_resolution

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

slot_width_select

支持8bit, 16bit, 32bit宽度

pcm_lrck_period

可配置16/32/64/128/256个bclk

pcm_lrckr_period

可配置16/32/64/128/256个bclk

msb_lsb_first

0: msb first; 1: lsb first

sign_extend

0: zero pending; 1: sign extend

tx_data_mode

0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law

rx_data_mode

0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law

i2s_bclk

i2s_bclk引脚

i2s_lrclk

i2s_lrclk引脚

i2s_dout0

i2s_dout引脚

i2s_din

i2s_din引脚

2.4.6 标案音频测试方法

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

2.4.6.1 播放
代码语言:javascript
复制
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

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

代码语言:javascript
复制
amixer -Dhw:audiocodec cset name='Lineout volume' 50
2.4.6.2 录音

表示下使用audiocodec进行MIC1,MIC2录音。

代码语言:javascript
复制
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-8: R11音频硬件框图
图2-8: R11音频硬件框图

2.5.2 时钟源

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

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

图2-9: R11时钟源
图2-9: R11时钟源

2.5.3 代码结构

代码语言:javascript
复制
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 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[audio0]
headphone_vol = 0x3b
lineout_vol = 0x1a
audio_pa_ctrl = port:PB05<1><default><default><0>
audio_pa_active_level = 1
adcagc_used = 0
adcdrc_used = 0
dacdrc_used = 0
adchpf_used = 0
dachpf_used = 0

audio0配置

audio0配置说明

headphone_vol

headphone volume,可设定范围0~0x3f, 0表示mute,163表示-62dB0dB, 1dB/step

lineout_vol

lineout volume,可设定范围0~0x1f, 0或者 1 表示mute,231表示-43.5dB0dB, 1.5dB/step

audio_pa_ctrl

PA使能引脚

audio_pa_active_level

1:high level active; 0:low level active

adcagc_used

1:use adcagc 0:no use

adcdrc_used

1:use adcdrc 0:no use

dacdrc_used

1:use dacdrc 0:no use

adchpf_used

1:use adchpf 0:no use

dachpf_used

1:use dachpf 0:no use

2.5.4.3 codec数据通路
图2-10: R11音频通路
图2-10: R11音频通路
代码语言:javascript
复制
播歌
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

通路设置举例:

  1. 播放通路
代码语言:javascript
复制
通过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
  1. 录音通路
代码语言:javascript
复制
通过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 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[tdm0]
daudio_used = 1
daudio_master = 4
daudio_select = 1
audio_format = 1
signal_inversion = 1
sample_resolution = 16
slot_width_select = 16
pcm_lrck_period = 32
pcm_lrckr_period = 1
msb_lsb_first = 0
sign_extend = 0
tx_data_mode = 0
rx_data_mode = 0
;i2s_mclk = port:PB08<2><1><default><default>
i2s_bclk = port:PG11<2><1><default><default>
i2s_lrclk = port:PG10<2><1><default><default>
i2s_dout0 = port:PG12<2><1><default><default>
i2s_dout1 =
i2s_dout2 =
i2s_dout3 =
i2s_din = port:PG13<2><1><default><default>

tdm0配置

tdm0配置说明

daudio_master

1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作为slave, codec作为master2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRMmaster),一般不用3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frameslave),一般不用4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作为master, codec作为slave

daudio_select

0: pcm mode; 1: i2s mode

deaudio_format

1: SND_SOC_DAIFMT_I2S(standard i2s format)2: SND_SOC_DAIFMT_RIGHT_J(right justfied format)3: SND_SOC_DAIFMT_LEFT_J(left justfied format)4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2ndBCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge)

signal_inversion

1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame)2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM)3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM)4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM)

sample_resolution

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

slot_width_select

支持8bit, 16bit, 32bit宽度

pcm_lrck_period

可配置16/32/64/128/256个bclk

pcm_lrckr_period

可配置16/32/64/128/256个bclk

msb_lsb_first

0: msb first; 1: lsb first

sign_extend

0: zero pending; 1: sign extend

tx_data_mode

0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law

rx_data_mode

0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law

i2s_bclk

i2s_bclk引脚

i2s_lrclk

i2s_lrclk引脚

i2s_dout0

i2s_dout引脚

i2s_din

i2s_din引脚

2.5.6 标案音频测试方法

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

2.5.6.1 播放
代码语言:javascript
复制
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

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

代码语言:javascript
复制
amixer -Dhw:audiocodec cset name='Lineout volume' 50
2.5.6.2 录音

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

代码语言:javascript
复制
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-11: R16音频硬件框图
图2-11: R16音频硬件框图

2.6.2 时钟源

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

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

图2-12: R16时钟源
图2-12: R16时钟源

2.6.3 代码结构

代码语言:javascript
复制
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 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[audio0]
audio_used = 1
headphone_vol = 0x3b
pa_double_used = 1
headphone_direct_used = 1
headset_mic_vol = 3
main_mic_vol = 1
;audio_linein_detect = port:PB07<0><default><default><0>
audio_pa_ctrl = port:PD11<1><default><default><0>
pa_gpio_reverse = 0
aif2_used = 0
aif3_used = 0
headphone_mute_used = 0
aif1_lrlk_div = 0x40

audio0配置

audio0配置说明

audio0

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

headphone_vol

headphone volume,可设定范围0~0x3f, 0表示mute,163表示-62dB0dB, 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数据通路
图2-13: R16音频通路
图2-13: R16音频通路
代码语言:javascript
复制
通过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相关控件如下表:

控件名称

功能

数值

HeadphoneSwitch

Headphone通路使能

0:关闭; 1:开启

ADC input gain

ADC增益

0–7,表示-4.5–6dB

ADC volume

ADCL/ADCR音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

ADCL Mux

ADCL Mux设置,只支持0:ADC

0:ADC

ADCR Mux

ADCR Mux设置,只支持0:ADC

0:ADC

AIF1 AD0L MixerADCL Switch

AIF1 AD0L Mixer设置,使能ADCL通路

0:关闭; 1:开启

AIF1 AD0L MixerAIF1 DA0L Switch

AIF1 AD0L Mixer设置,使能AIF1 DA0L通路

0:关闭; 1:开启

AIF1 AD0L MixerAIF2 DACL Switch

AIF1 AD0L Mixer设置,使能AIF2 DACL通路

0:关闭; 1:开启

AIF1 AD0L MixerAIF2 DACRSwitch

AIF1 AD0L Mixer设置,使能AIF2 DACR通路

0:关闭; 1:开启

AIF1 AD0R MixerADCR Switch

AIF1 AD0R Mixer设置,使能ADCR通路

0:关闭; 1:开启

AIF1 AD0R MixerAIF1 DA0R Switch

AIF1 AD0R Mixer设置,使能AIF1 DA0R通路

0:关闭; 1:开启

AIF1 AD0R MixerAIF2 DACL Switch

AIF1 AD0R Mixer设置,使能AIF2 DACL通路

0:关闭; 1:开启

AIF1 AD0R MixerAIF2 DACRSwitch

AIF1 AD0R Mixer设置,使能AIF2 DACR通路

0:关闭; 1:开启

AIF1 AD1L MixerADCL Switch

AIF1 AD1L Mixer设置,使能ADCL通路

0:关闭; 1:开启

AIF1 AD1L MixerAIF2 DACL Switch

AIF1 AD1L Mixer设置,使能AIF2 DACL通路

0:关闭; 1:开启

AIF1 AD1R MixerADCR Switch

AIF1 AD1R Mixer设置,使能ADCR通路

0:关闭; 1:开启

AIF1 AD1R MixerAIF2 DACR Switch

AIF1 AD1R Mixer设置,使能AIF2 DACR通路

0:关闭; 1:开启

AIF1 ADC timeslot0 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 timeslot0 volume

AIF1 ADC0L/ADC0R音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

AIF1 ADC timeslot1 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 timeslot1 volume

AIF1 ADC1L/ADC1R 音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

AIF1 DAC timeslot0 volume

AIF1 DAC0L/DAC0R 音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

AIF1 DAC timeslot1 volume

AIF1 DAC1L/DAC1R 音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.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, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

DACL MixerADCL Switch

DACL Mixer设置,使能ADCL通路

0:关闭; 1:开启

DACL MixerAIF1DA0L Switch

DACL Mixer设置,使能AIF1DA0L通路

0:关闭; 1:开启

DACL MixerAIF1DA1L Switch

DACL Mixer设置,使能AIF1DA1L通路

0:关闭; 1:开启

DACL MixerAIF2DACL Switch

DACL Mixer设置,使能AIF2DACL通路

0:关闭; 1:开启

DACR MixerADCR Switch

DACR Mixer设置,使能ADCR通路

0:关闭; 1:开启

DACR MixerAIF1DA0R Switch

DACR Mixer设置,使能AIF1DA0R通路

0:关闭; 1:开启

DACR MixerAIF1DA1R Switch

DACR Mixer设置,使能AIF1DA1R通路

0:关闭; 1:开启

DACR MixerAIF2DACR Switch

DACR Mixer设置,使能AIF2DACR通路

0:关闭; 1:开启

External SpeakerSwitch

使能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 inputMixerLout_Mixer_Switch

LEFT ADC input Mixer设置,使能Lout Mixer通路

0:关闭; 1:开启

LEFT ADC inputMixer MIC1 boostSwitch

LEFT ADC input Mixer设置,使能MIC1通路

0:关闭; 1:开启

LEFT ADC inputMixer MIC2 boostSwitch

LEFT ADC input Mixer设置,使能MIC2通路

0:关闭; 1:开启

LEFT ADC inputMixerRout_Mixer_Switch

LEFT ADC input Mixer设置,使能Rout Mixer通路

0:关闭; 1:开启

Left Output MixerDACL Switch

Left Output Mixer设置,使能DACL通路

0:关闭; 1:开启

Left Output MixerDACR Switch

Left Output Mixer设置,使能DACR通路

0:关闭; 1:开启

Left Output MixerMIC1BooststageSwitch

Left Output Mixer设置,使能MIC1通路

0:关闭; 1:开启

Left Output MixerMIC2BooststageSwitch

Left Output Mixer设置,使能MIC2通路

0:关闭; 1:开启

MIC1 boostamplifier gain

MIC1增益

0–7, 0:0dB, 1~7:24–42dB,3dB/step

MIC2 SRC

MIC2 SRC设置

0:MIC3; 1:MIC2

MIC2 boostamplifier gain

MIC2增益

0–7, 0:0dB, 1~7:24–42dB,3dB/step

RIGHT ADC inputMixerLout_Mixer_Switch

RIGHT ADC inputMixer设置,使能LoutMixer通路

0:关闭; 1:开启

RIGHT ADC inputMixer MIC1 boostSwitch

RIGHT ADC inputMixer设置,使能MIC1通路

0:关闭; 1:开启

RIGHT ADC inputMixer MIC2 boostSwitch

RIGHT ADC inputMixer设置,使能MIC2通路

0:关闭; 1:开启

RIGHT ADC inputMixerRout_Mixer_Switch

RIGHT ADC inputMixer设置,使能RoutMixer通路

0:关闭; 1:开启

Right OutputMixer DACLSwitch

Right Output Mixer设置,使能DACL通路

0:关闭; 1:开启

Right OutputMixer DACRSwitch

Right Output Mixer设置,使能DACR通路

0:关闭; 1:开启

Right OutputMixerMIC1BooststageSwitch

Right Output Mixer设置,使能MIC1通路

0:关闭; 1:开启

Right OutputMixerMIC2BooststageSwitch

Right Output Mixer设置,使能MIC2通路

0:关闭; 1:开启

digital volume

数字音量设置

0–63,表示-73.08–0dB

headphonevolume

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 内核配置
代码语言:javascript
复制
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

代码语言:javascript
复制
[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><default><default>
i2s0_lrclk = port:PB04<2><1><default><default>
i2s0_dout0 = port:PB06<2><1><default><default>
i2s0_dout1 =
i2s0_dout2 =
i2s0_dout3 =
i2s0_din = port:PB07<2><1><default><default>

i2s0配置

i2s0配置说明

i2s0_used

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

i2s0_master

1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRMmaster),即daudio接口作为slave, codec作为master2: 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 & FRMslave),即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 availableon 2nd BCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is availableon 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 + invFRM)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 播放
代码语言:javascript
复制
通过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.wav
代码语言:javascript
复制
mixer 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

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

代码语言:javascript
复制
amixer -Dhw:sndcodec cset name='headphone volume' 58
2.6.6.2 录音

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

代码语言:javascript
复制
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-14: R18音频硬件框图
图2-14: R18音频硬件框图

2.7.2 时钟源

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

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

图2-15: R18时钟源
图2-15: R18时钟源

2.7.3 代码结构

代码语言:javascript
复制
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驱动
代码语言:javascript
复制
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 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[sndcodec]
sndcodec_used = 0x1
aif2fmt = 0x3
aif3fmt = 0x3
aif2master = 0x1
linein_detect = port:PH05<6><default><default><default>
hp_detect_case = 0x1
;------------------------------------------------------------------------------
[i2s]
i2s_used = 0x1
;-------------------------------------------------------------------------------
[codec]
codec_used = 0x1
headphonevol = 0x38
代码语言:javascript
复制
spkervol = 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, 163表<br/>示-62dB0dB, 1dB/step

spkervol

spk(lineout) volume,可设定范围0~0x1f, 0或者 1 表示mute, 231<br/>表示-43.5dB0dB, 1.5dB/step

earpiecevol

earpiece volume,可设定范围0~0x1f, 0或者 1 表示mute, 231表<br/>示-43.5dB0dB, 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, 0x10xff表<br/>示-119.25dB71.25dB, 0.75dB/step,如0xA0表示0dB, 0x98表示-6dB

codec配置

codec配置说明

gpio-spk

PA使能引脚

2.7.4.3 codec数据通路
图2-16: R18音频通路
图2-16: R18音频通路
代码语言:javascript
复制
通过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_detectSwitch

Linein检测使能

0:关闭; 1:开启

ADC input gaincontrol

ADC增益

0–7,表示-4.5–6dB

ADC volume

ADCL/ADCR音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

ADCL Mux

ADCL Mux设置,只支持0:ADC

0:ADC

ADCR Mux

ADCR Mux设置,只支持0:ADC

0:ADC

AIF1 AD0L MixerADCL Switch

AIF1 AD0L Mixer设置,使能ADCL通路

0:关闭; 1:开启

AIF1 AD0L MixerAIF1 DA0L Switch

AIF1 AD0L Mixer设置,使能AIF1 DA0L通路

0:关闭; 1:开启

AIF1 AD0L MixerAIF2 DACL Switch

AIF1 AD0L Mixer设置,使能AIF2 DACL通路

0:关闭; 1:开启

AIF1 AD0L MixerAIF2 DACR Switch

AIF1 AD0L Mixer设置,使能AIF2 DACR通路

0:关闭; 1:开启

AIF1 AD0R MixerADCR Switch

AIF1 AD0R Mixer设置,使能ADCR通路

0:关闭; 1:开启

AIF1 AD0R MixerAIF1 DA0R Switch

AIF1 AD0R Mixer设置,使能AIF1 DA0R通路

0:关闭; 1:开启

AIF1 AD0R MixerAIF2 DACL Switch

AIF1 AD0R Mixer设置,使能AIF2 DACL通路

0:关闭; 1:开启

AIF1 AD0R MixerAIF2 DACR Switch

AIF1 AD0R Mixer设置,使能AIF2 DACR通路

0:关闭; 1:开启

AIF1 AD1L MixerADCL Switch

AIF1 AD1L Mixer设置,使能ADCL通路

0:关闭; 1:开启

AIF1 AD1L MixerAIF2 DACL Switch

AIF1 AD1L Mixer设置,使能AIF2 DACL通路

0:关闭; 1:开启

AIF1 AD1R MixerADCR Switch

AIF1 AD1R Mixer设置,使能ADCR通路

0:关闭; 1:开启

AIF1 AD1R MixerAIF2 DACR Switch

AIF1 AD1R Mixer设置,使能AIF2 DACR通路

0:关闭; 1:开启

AIF1 ADC timeslot0 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 timeslot0 volume

AIF1 ADC0L/ADC0R音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

AIF1 ADC timeslot1 mixer gain

AIF1 ADC1L/ADC1RMixer,数字增益

0:0dB; 1:-6dB;

对于ADC1L Mixer,bit0:ADCL;bit1:AIF2 DACL;对于ADC1R Mixer,bit0:ADCR;bit1:AIF2 DACR;

AIF1 ADC timeslot1 volume

AIF1 ADC1L/ADC1R音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

AIF1 DAC timeslot0 volume

AIF1 DAC0L/DAC0R音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

AIF1 DAC timeslot1 volume

AIF1 DAC1L/DAC1R音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.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, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

DACL Mixer ADCLSwitch

DACL Mixer设置,使能ADCL通路

0:关闭; 1:开启

DACL MixerAIF1DA0L Switch

DACL Mixer设置,使能AIF1DA0L通路

0:关闭; 1:开启

DACL MixerAIF1DA1L Switch

DACL Mixer设置,使能AIF1DA1L通路

0:关闭; 1:开启

DACL MixerAIF2DACL Switch

DACL Mixer设置,使能AIF2DACL通路

0:关闭; 1:开启

DACR Mixer ADCRSwitch

DACR Mixer设置,使能ADCR通路

0:关闭; 1:开启

DACR MixerAIF1DA0R Switch

DACR Mixer设置,使能AIF1DA0R通路

0:关闭; 1:开启

DACR MixerAIF1DA1R Switch

DACR Mixer设置,使能AIF1DA1R通路

0:关闭; 1:开启

DACR MixerAIF2DACR Switch

DACR Mixer设置,使能AIF2DACR通路

0:关闭; 1:开启

EAR Mux

EAR Mux设置

0:DACR; 1:DACL; 2:Right AnalogMixer; 3:Left Analog Mixer

Earpiece Switch

Earpiece通路使能

0:关闭; 1:开启

External SpeakerSwitch

使能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 MixerLINEINL

LADC input Mixer设置,使能LINEINL通路

0:关闭; 1:开启

LADC input MixerMIC1 boost Switch

LADC input Mixer设置,使能MIC1通路

0:关闭; 1:开启

LADC input MixerMIC2 boost Switch

LADC input Mixer设置,使能MIC2通路

0:关闭; 1:开启

LADC input Mixerl_output mixerSwitch

LADC input Mixer设置,使能l_outputmixer通路

0:关闭; 1:开启

LADC input Mixerr_output mixerSwitch

LADC input Mixer设置,使能r_outputmixer通路

0:关闭; 1:开启

LINEINL/R to L_Routput mixer gainLeft Output MixerDACL Switch

Left Output Mixer设置,使能DACL通路

0:关闭; 1:开启

Left Output MixerDACR Switch

Left Output Mixer设置,使能DACR通路

0:关闭; 1:开启

Left Output MixerLINEINL Switch

Left Output Mixer设置,使能LINEINL通路

0:关闭; 1:开启

Left Output MixerMIC1BooststageSwitch

Left Output Mixer设置,使能MIC1通路

0:关闭; 1:开启

Left Output MixerMIC2BooststageSwitch

Left Output Mixer设置,使能MIC2通路

0:关闭; 1:开启

MIC1 boostamplifier gain

MIC1增益

0–7, 0:0dB, 1~7:24–42dB,3dB/step

MIC1_G booststage output mixercontrol

MIC1 to L or R outputMixer增益

0–7,表示-4.5–6dB

MIC2 BST stage toL_R outp mixergain

MIC2 to L or R outputMixer增益

0–7,表示-4.5–6dB

MIC2 SRC

MIC2 SRC设置

0:MIC3; 1:MIC2

MIC2 boost AMPgain control

MIC2增益

0–7, 0:0dB, 1~7:24–42dB,3dB/step

RADC input MixerLINEINR Switch

RADC input Mixer设置,使能LINEINR通路

0:关闭; 1:开启

RADC input MixerMIC1 boost Switch

RADC input Mixer设置,使能MIC1通路

0:关闭; 1:开启

RADC input MixerMIC2 boost Switch

RADC input Mixer设置,使能MIC2通路

0:关闭; 1:开启

RADC input Mixerl_output mixerSwitch

RADC input Mixer设置,使能l_outputmixer通路

0:关闭; 1:开启

RADC input Mixerl_output Switch

RADC input Mixer设置,使能l_outputmixer通路

0:关闭; 1:开启

Right Output MixerDACL Switch

Right Output Mixer设置,使能DACL通路

0:关闭; 1:开启

Right Output MixerDACR Switch

Right Output Mixer设置,使能DACR通路

0:关闭; 1:开启

Right Output MixerLINEINR Switch

Right Output Mixer设置,使能LINEINR通路

0:关闭; 1:开启

Right Output MixerMIC1BooststageSwitch

Right Output Mixer设置,使能MIC1通路

0:关闭; 1:开启

Right Output MixerMIC2BooststageSwitch

Right Output Mixer设置,使能MIC2通路

0:关闭; 1:开启

SPK_L Mux

SPK_L Mux设置

0:MIXEL Switch; 1:MIXL MIXRSwitch

SPK_R Mux

SPK_R Mux设置

0:MIXER Switch; 1:MIXR MIXLSwitch

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 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[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 = 0x01
代码语言:javascript
复制
frametype = 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 & FRMmaster),即daudio接口作为slave, codec作为master2: 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 & FRMslave),即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 availableon 2nd BCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is availableon 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 + invFRM)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: 8bita-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 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[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驱动,代码路径:

代码语言:javascript
复制
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 内核配置
代码语言:javascript
复制
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进行配置:

代码语言:javascript
复制
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>;
代码语言:javascript
复制
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驱动的名称,如
代码语言:javascript
复制
snddaudio0:sound@1 {
sunxi,snddaudio-codec = "ac108.1-0035";
sunxi,snddaudio-codec-dai = "ac108-pcm1";
};
2.7.7.3 使用

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

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

代码语言:javascript
复制
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 内核配置
代码语言:javascript
复制
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进行配置:

代码语言:javascript
复制
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驱动的名称,如
代码语言:javascript
复制
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相关声 卡,说明已经正常加载驱动

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

代码语言:javascript
复制
aplay -Dhw:sndtas5731codec /mnt/UDISK/16000-stere-10s.wav

2.7.9 HDMI音频接口

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

2.7.9.1 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[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播放
代码语言:javascript
复制
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

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

代码语言:javascript
复制
amixer -Dhw:audiocodec cset name='headphone volume' 60
2.7.10.2录音
代码语言:javascript
复制
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-17: R30音频硬件框图
图2-17: R30音频硬件框图

2.8.2 时钟源

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

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

图2-18: R30时钟源
图2-18: R30时钟源

2.8.3 代码结构

代码语言:javascript
复制
linux-4.9/sound/soc/sunxi/
├── sun50iw3-codec.c // codec驱动
├── sun50iw3-codec.h
├── sun50iw3-sndcodec.c // codec machine驱动
├── sunxi-inter-i2s.c // codec platform驱动
代码语言:javascript
复制
├── 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 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[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><default><default><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 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)

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

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,可设定范围00x3f,表示0-62dB,-1dB/step

spkervol

初始化speaker volume,可设定范围0~0x1f, 0或者 1 表示mute,231表示-43.5dB0dB, 1.5dB/step

headsetmicgain

指的是MIC2增益,可设定范围0~0x7, 0:0dB, 17:1533dB,3dB/step,一般设置0x4,即24dB

adcinputgain

adc增益,可设定范围00x7,表示-4.56dB, 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数据通路
图2-19: R30音频通路
图2-19: R30音频通路
代码语言:javascript
复制
通过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 gaincontrol

ADC增益

0–7,表示-4.5–6dB

ADC volume

ADCL/ADCR音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

AIF1 AD0L MixerADCL Switch

AIF1 AD0L Mixer设置,使能ADCL通路

0:关闭; 1:开启

AIF1 AD0L MixerAIF1 DA0L Switch

AIF1 AD0L Mixer设置,使能AIF1 DA0L通路

0:关闭; 1:开启

AIF1 AD0L MixerAIF2 DACL Switch

AIF1 AD0L Mixer设置,使能AIF2 DACL通路

0:关闭; 1:开启

AIF1 AD0L MixerAIF2 DACR Switch

AIF1 AD0L Mixer设置,使能AIF2 DACR通路

0:关闭; 1:开启

AIF1 AD0R MixerADCR Switch

AIF1 AD0R Mixer设置,使能ADCR通路

0:关闭; 1:开启

AIF1 AD0R MixerAIF1 DA0R Switch

AIF1 AD0R Mixer设置,使能AIF1 DA0R通路

0:关闭; 1:开启

AIF1 AD0R MixerAIF2 DACL Switch

AIF1 AD0R Mixer设置,使能AIF2 DACL通路

0:关闭; 1:开启

AIF1 AD0R MixerAIF2 DACR Switch

AIF1 AD0R Mixer设置,使能AIF2 DACR通路

0:关闭; 1:开启

AIF1 AD1L MixerADCL Switch

AIF1 AD1L Mixer设置,使能ADCL通路

0:关闭; 1:开启

AIF1 AD1L MixerAIF2 DACL Switch

AIF1 AD1L Mixer设置,使能AIF2 DACL通路

0:关闭; 1:开启

AIF1 AD1R MixerADCR Switch

AIF1 AD1R Mixer设置,使能ADCR通路

0:关闭; 1:开启

AIF1 AD1R MixerAIF2 DACR Switch

AIF1 AD1R Mixer设置,使能AIF2 DACR通路

0:关闭; 1:开启

AIF1 ADC timeslot0 mixer gain

AIF1 ADC0L/ADC0RMixer,数字增益

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 timeslot0 volume

AIF1 ADC0L/ADC0R音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

AIF1 ADC timeslot1 mixer gain

AIF1 ADC1L/ADC1RMixer,数字增益

0:0dB; 1:-6dB;

对于ADC1L Mixer,bit0:ADCL;bit1:AIF2 DACL;对于ADC1R Mixer,bit0:ADCR;bit1:AIF2 DACR;

AIF1 ADC timeslot1 volume

AIF1 ADC1L/ADC1R音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

AIF1 DAC timeslot0 volume

AIF1 DAC0L/DAC0R音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

AIF1 DAC timeslot1 volume

AIF1 DAC1L/DAC1R音量设置

0–0xff, 0表示mute, 0x10xff表<br/>示-119.25dB71.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, 0x10xff表<br/>示-119.25dB71.25dB,0.75dB/step,如0xA0表示0dB

DACL Mixer ADCLSwitch

DACL Mixer设置,使能ADCL通路

0:关闭; 1:开启

DACL MixerAIF1DA0L Switch

DACL Mixer设置,使能AIF1DA0L通路

0:关闭; 1:开启

DACL MixerAIF1DA1L Switch

DACL Mixer设置,使能AIF1DA1L通路

0:关闭; 1:开启

DACL MixerAIF2DACL Switch

DACL Mixer设置,使能AIF2DACL通路

0:关闭; 1:开启

DACR Mixer ADCRSwitch

DACR Mixer设置,使能ADCR通路

0:关闭; 1:开启

DACR MixerAIF1DA0R Switch

DACR Mixer设置,使能AIF1DA0R通路

0:关闭; 1:开启

DACR MixerAIF1DA1R Switch

DACR Mixer设置,使能AIF1DA1R通路

0:关闭; 1:开启

DACR MixerAIF2DACR Switch

DACR Mixer设置,使能AIF2DACR通路

0:关闭; 1:开启

External SpeakerSwitch

使能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 MixerLINEINL

LADC input Mixer设置,使能LINEINL通路

0:关闭; 1:开启

LADC input MixerMIC1 boost Switch

LADC input Mixer设置,使能MIC1通路

0:关闭; 1:开启

LADC input MixerMIC2 boost Switch

LADC input Mixer设置,使能MIC2通路

0:关闭; 1:开启

LADC input Mixerl_output mixerSwitch

LADC input Mixer设置,使能l_outputmixer通路

0:关闭; 1:开启

LADC input Mixerr_output mixerSwitch

LADC input Mixer设置,使能r_outputmixer通路

0:关闭; 1:开启

LINEINL/R to L_Routput mixer gain

LINEINL/R to L or Routput Mixer增益

0–7,表示-4.5–6dB

LINEOUTL Mux

LINEOUTL Mux设置

0:left output mixer; 1:left+rightoutput mixer

LINEOUTR Mux

LINEOUTR Mux设置

0:right output mixer; 1:left+rightoutput mixer

Left Output MixerDACL Switch

Left Output Mixer设置,使能DACL通路

0:关闭; 1:开启

Left Output MixerDACR Switch

Left Output Mixer设置,使能DACR通路

0:关闭; 1:开启

Left Output MixerLINEINL Switch

Left Output Mixer设置,使能LINEINL通路

0:关闭; 1:开启

Left Output MixerMIC1BooststageSwitch

Left Output Mixer设置,使能MIC1通路

0:关闭; 1:开启

Left Output MixerMIC2BooststageSwitch

Left Output Mixer设置,使能MIC2通路

0:关闭; 1:开启

MIC1 boost AMPgain control

MIC1增益

0–7, 0:0dB, 1~7:24–42dB,3dB/step

MIC1_G booststage output mixercontrol

MIC1 to L or R outputMixer增益

0–7,表示-4.5–6dB

MIC2 BST stage toL_R outp mixergain

MIC2 to L or R outputMixer增益

0–7,表示-4.5–6dB

MIC2 SRC

MIC2 SRC设置

0:MIC3; 1:MIC2

MIC2 boost AMPgain control

MIC2增益

0–7, 0:0dB, 1~7:24–42dB,3dB/step

RADC input MixerLINEINR Switch

RADC input Mixer设置,使能LINEINR通路

0:关闭; 1:开启

RADC input MixerMIC1 boost Switch

RADC input Mixer设置,使能MIC1通路

0:关闭; 1:开启

RADC input MixerMIC2 boost Switch

RADC input Mixer设置,使能MIC2通路

0:关闭; 1:开启

RADC input Mixerl_output mixerSwitch

RADC input Mixer设置,使能l_outputmixer通路

0:关闭; 1:开启

RADC input Mixerl_output Switch

RADC input Mixer设置,使能l_outputmixer通路

0:关闭; 1:开启

Right Output MixerDACL Switch

Right Output Mixer设置,使能DACL通路

0:关闭; 1:开启

Right Output MixerDACR Switch

Right Output Mixer设置,使能DACR通路

0:关闭; 1:开启

Right Output MixerLINEINR Switch

Right Output Mixer设置,使能LINEINR通路

0:关闭; 1:开启

Right Output MixerMIC1BooststageSwitch

Right Output Mixer设置,使能MIC1通路

0:关闭; 1:开启

Right Output MixerMIC2BooststageSwitch

Right Output Mixer设置,使能MIC2通路

0:关闭; 1:开启

SPK_L Mux

SPK_L Mux设置

0:MIXEL Switch; 1:MIXL MIXRSwitch

SPK_R Mux

SPK_R Mux设置

0:MIXER Switch; 1:MIXR MIXLSwitch

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 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[snddaudio0]
snddaudio0_used = 1
[daudio0]
pcm_lrck_period = 0x80
slot_width_select = 0x20
pcm_lsb_first = 0x0
tx_data_mode = 0x0
rx_data_mode = 0x0
代码语言:javascript
复制
daudio_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 & FRMmaster),即daudio接口作为slave, codec作为master2: 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 & FRMslave),即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 availableon 2nd BCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is availableon 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 + invFRM)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 = 2clock 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: 8bita-law

rx_data_mode

0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bita-law

2.8.6 DMIC

硬件特性

• 支持 8 路输入

  • 支持8~48KHz采样率
  • 支持16/24bit采样精度
2.8.6.1 内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
[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 播放
代码语言:javascript
复制
通过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
代码语言:javascript
复制
通过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
代码语言:javascript
复制
通过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
代码语言:javascript
复制
可通过下面命令调节硬件上的模拟音量:
代码语言:javascript
复制
amixer -Dhw:audiocodec cset name='headphone volume' 60
2.8.7.2 录音
代码语言:javascript
复制
通过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-34: R328音频硬件框图
图2-34: R328音频硬件框图

2.9.2 时钟源.

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

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

图2-35: R328时钟源
图2-35: R328时钟源

2.9.3 代码结构

代码语言:javascript
复制
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内核配置
代码语言:javascript
复制
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配置
代码语言:javascript
复制
[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 = 0x0
代码语言:javascript
复制
dacdrc_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,可设定范围00x3f,表示0-73.08dB,-1.16dB/step

lineout_vol

lineout volume,可设定范围00x1f,表示-43.5dB0dB, 1.5dB/step

mic1gain

mic1增益,可设定范围0~0x7, 0:0dB, 17:1533dB, 3dB/step,一般设置0x4,即24dB

mic2gain

mic2增益,可设定范围0~0x7, 0:0dB, 17:1533dB, 3dB/step,一般设置0x4,即24dB

mic3gain

mic3增益,可设定范围0~0x7, 0:0dB, 17:1533dB, 3dB/step,一般设置0x4,即24dB.如果作为aec回路,则需要设置为0dB

adcgain

adc增益,可设定范围00x7,表示-4.56dB, 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数据通路
图2-36: R328音频通路
图2-36: R328音频通路
代码语言:javascript
复制
播歌
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 DACLSwitch

Left Input Mixer设置,使能DACL通路

0:关闭; 1:开启

Left Input Mixer MIC1Boost Switch

Left Input Mixer设置,使能MIC1通路

0:关闭; 1:开启

Left Input Mixer MIC2Boost Switch

Left Input Mixer设置,使能MIC2通路

0:关闭; 1:开启

Left Input Mixer MIC3Boost 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 DACLSwitch

Right Input Mixer设置,使能DACL通路

0:关闭; 1:开启

Right Input Mixer MIC1Boost Switch

Right Input Mixer设置,使能MIC1通路

0:关闭; 1:开启

Right Input Mixer MIC2Boost Switch

Right Input Mixer设置,使能MIC2通路

0:关闭; 1:开启

Right Input Mixer MIC3Boost Switch

Right Input Mixer设置,使能MIC3通路

0:关闭; 1:开启

Xadc Input Mixer DACLSwitch

Xadc Input Mixer设置,使能DACL通路

0:关闭; 1:开启

Xadc Input Mixer MIC1Boost Switch

Xadc Input Mixer设置,使能MIC1通路

0:关闭; 1:开启

Xadc Input Mixer MIC2Boost Switch

Xadc Input Mixer设置,使能MIC2通路

0:关闭; 1:开启

Xadc Input Mixer MIC3Boost Switch

Xadc Input Mixer设置,使能MIC3通路

0:关闭; 1:开启

codec hub mode

使能audiocodec hub功能

0:关闭; 1:开启

digital volume

数字端音量设置

0–63,表示-73.08–0dB,具体计算请看注释 4

• 注释 1

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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.8
代码语言:javascript
复制
n = 58
所以应用层上输入下面命令设置为-5.8dB:
amixer -D hw:audiocodec cset name='digital volume' 58

通路设置举例:

  1. 播放通路
代码语言:javascript
复制
通过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
  1. 录音通路
代码语言:javascript
复制
通过模拟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
  1. 常用AEC通路
代码语言:javascript
复制
有两种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内核配置
代码语言:javascript
复制
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配置
代码语言:javascript
复制
[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 & FRMmaster),即daudio接口作为slave, codec作为master2: 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 & FRMslave),即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 availableon 2nd BCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is availableon 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 + invFRM)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 = 2clock 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: 8bita-law

rx_data_mode

0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bita-law

注意事项:

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

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

代码语言:javascript
复制
[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 ```

  1. 例如daudio2与bluetooth模组相连(没有实际的codec驱动),那么这时候codec
代码语言:javascript
复制
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内核配置
代码语言:javascript
复制
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配置

配置如下:

代码语言:javascript
复制
[dmic]
dmic_used = 0
[snddmic]
snddmic_used = 0

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

代码语言:javascript
复制
dmic配置 dmic配置说明
dmic_used 是否使用dmic驱动。 0 :不使用; 1 :使用

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

代码语言:javascript
复制
snddmic配置 snddmic配置说明
snddmic_used 是否使用snddmic驱动。 0 :不使用; 1 :使用
  • sys_config中不需要配置codec驱动相关信息

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

代码语言:javascript
复制
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内核配置
代码语言:javascript
复制
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配置
代码语言:javascript
复制
[sndspdif]
sndspdif_used = 0
[spdif]
spdif_used = 0

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

代码语言:javascript
复制
spdif配置 spdif配置说明|
spdif_used 是否使用spdif驱动。 0 :不使用; 1 :使用|

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

代码语言:javascript
复制
sndspdif配置sndspdif配置说明

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

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

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

代码语言:javascript
复制
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内核配置
代码语言:javascript
复制
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配置
代码语言:javascript
复制
[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控件说明
  1. mad绑定到I2S

控件名称

功能

数值

daudio bind mad Function

是否绑定MAD功能

0:不绑定; 1:绑定

lpsd channel sel Function

选择作为能量唤醒的通道

0:通道0; 1:通道1;

如此类推,最高可指定通道7

mad_standby channel selFunction

设定休眠时mad录音通道数

0:表示使用实际录音通道数;

  1. mad绑定到dmic

控件名称

功能

数值

dmic bind mad Function

是否绑定MAD功能

0:不绑定; 1:绑定

lpsd channel sel Function

选择作为能量唤醒的通道

0:通道0; 1:通道1;

如此类推,最高可指定通道 7

mad_standby channel selFunction

设定休眠时mad录音通道数

0:表示使用实际录音通道数; 1:表示只录制两通道2:表示只录制四通道

2.14.8.4使用说明

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

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

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

代码语言:javascript
复制
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设置举例:

代码语言:javascript
复制
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

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

  1. 暂定录音、播放。snd_pcm_pause将playback,capture均暂停;
  2. 设置wakeup_count。更新当前唤醒次数;
  3. 进入休眠。写mem到/sys/power/state即可;

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

make menuconfig选中mad-demo软件包

代码语言:javascript
复制
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

  1. 瞬时能量检测参数,主要是lpsd_rrun和lpsd_rstop。
  • 一般我们只对stop值进行修改;
  • 如果录音数据经常缺少唤醒词的第一个字,则可以尝试降低stop值,可以有效提高唤醒词数据 的完整性。但同时会提高误唤醒率,环境噪音也会很容易触发能量检测,唤醒系统;
  • 如果想要降低误唤醒率(环境噪音造成唤醒),则可以尝试提高stop值。同样的,这会导致一些 唤醒词录音数据不完整,例如一些音量较低,音调较低的语料;
  • 唤醒词识别率以及误唤醒率无法同时兼得,客户需要根据实际需求、场景,权衡配置参数;
  1. 累积能量检测参数,主要是lpsd_th。

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

2.14.8.6注意事项
  1. MAD绑定动作,需要在应用打开声卡前就设置好;
  2. 应用操作上的一些要求,具体请查看《MAD使用说明》章节;
  3. 如果读取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完整的数据通路:

代码语言:javascript
复制
ADC RxFiFo ---> I2S TxFiFo ---> I2S RxFiFo ---> MAD SRAM ---> MEM
2.14.9.1内核配置
代码语言:javascript
复制
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配置:

代码语言:javascript
复制
[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 selFunction

设定休眠时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;

设置举例:

代码语言:javascript
复制
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的录音通路之外,还需要下面一些配置:

代码语言:javascript
复制
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

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

  1. 暂定录音、播放。snd_pcm_pause将playback,capture均暂停
  2. 设置wakeup_count。更新当前唤醒次数
  3. 进入休眠。写mem到/sys/power/state即可

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

代码语言:javascript
复制
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播放
代码语言:javascript
复制
通过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录音
代码语言:javascript
复制
通过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-48: V853时钟源
图2-48: V853时钟源

2.20.2 代码结构

代码语言:javascript
复制
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内核配置
代码语言:javascript
复制
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

代码语言:javascript
复制
codec:codec@0x02030000 {
#sound-dai-cells = <0>;
compatible = "allwinner,sunxi-snd-codec";
reg = <0x0 0x02030000 0x0 0x34C>;
clocks = <&clk_pll_audio>,
代码语言:javascript
复制
<&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 个设备树节点构建。

  1. ASoC层codec: codec

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

配置项名称

配置项说明

#sound-dai-cells

machine层检测codec和platform节点的标志

reg

设置audiocodec寄存器起始地址和地址长度

clocks

设置audiocodec所需的时钟源和模块时钟

  1. 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寄存器地址)

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

代码语言:javascript
复制
&codec {
/* external-avcc; */
/* avcc-supply = <&reg_aldo1>; */
avcc-vol = <1800000>; /* uv */
lineout_vol = <31>;
mic1gain = <31>;
mic2gain = <31>;
代码语言:javascript
复制
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数据通路
代码语言:javascript
复制
通过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;10xFF:-119.25dB 71.24dB,0.75dB/step,默认0xA0=0dB

ADC2 volume

ADC2数字音量设置

0~0xFF, 0:Mute;10xFF:-119.25dB 71.24dB,0.75dB/step,默认0xA0=0dB

ADCDRC

开启ADC DRC功能

ADCHPF

开启adc hpf功能

DAC volume

DACL,DACR音量设置

0~0xFF, 0:Mute;10xFF:-119.25dB 71.24dB,0.75dB/step,默认0xA0=0dB

DACDRC

开启dac drc功能

DACHPF

开启dac hpf功能

LINEIN Switch

是否使能ADC->LINEIN的通路

0:关闭; 1:使能

LINEINL gainvolume

LINEINL增益

0:0dB; 1:6dB

LINEINR gainvolume

LINEINR增益

0:0dB; 1:6dB

LINEOUT OutputSelect

Lineout输出选择

0:单端; 1:差分

LINEOUT Switch

是否使能Lineout通路

0:关闭; 1:使能

LINEOUT volume

Lineout音量设置

031,表示-43.50dB

MIC1 Input Select

MIC1输入模式

0:差分输入; 1:单端输入

MIC1 Switch

是否使能ADC1->MIC1的通路

0:关闭; 1:使能

MIC1 gain volume

MIC1增益

031,表示036dB, 0:0dB,13:6dB,<br/>431:9~36dB, 1dB/step

MIC2 Input Select

MIC2输入模式

0:差分输入; 1:单端输入

MIC2 Switch

是否使能ADC2->MIC2的通路

0:关闭; 1:使能

MIC2 gain volume

MIC2增益

031,表示036dB, 0:0dB,13:6dB,<br/>431:9~36dB, 1dB/step

SPK Switch

是否使能Speaker通路(使用功放)

0:关闭; 1:使能

digital volume

数字端音量设置

063,表示-73.080dB

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内核配置
代码语言:javascript
复制
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

代码语言:javascript
复制
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";
代码语言:javascript
复制
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 个设备树节点构建。

  1. ASoC层codec:非必须节点,若无,则绑定虚拟codec节点。
  2. 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

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

代码语言:javascript
复制
&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 {
代码语言:javascript
复制
};
};
&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内核配置
代码语言:javascript
复制
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

代码语言:javascript
复制
dmic_plat:dmic_plat@0x02031000 {
#sound-dai-cells = <0>;
compatible = "allwinner,sunxi-snd-plat-dmic";
代码语言:javascript
复制
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 个设备树节点构建。

  1. ASoC层codec:无,绑定虚拟codec节点。
  2. 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

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

代码语言:javascript
复制
&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内核配置
代码语言:javascript
复制
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>字段:

代码语言:javascript
复制
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播放
代码语言:javascript
复制
通过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录音
代码语言:javascript
复制
通过内部的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配置

代码语言:javascript
复制
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板级配置

代码语言:javascript
复制
&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 = <&reg_aldo1>; */
/* hpvcc-supply = <&reg_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配置

代码语言:javascript
复制
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板级配置

代码语言:javascript
复制
&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";
代码语言:javascript
复制
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

代码语言:javascript
复制
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:longframe(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:reserved2:8bit u-law 3:8bit a-law

rx_data_mode

0/1/2/3

0:16bit linear PCM 1:reserved2: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内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
&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内核配置
代码语言:javascript
复制
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配置.
代码语言:javascript
复制
&spdif {
pinctrl-names = "default","sleep";
pinctrl-0 = <&spdif_pins_a>;
pinctrl-1 = <&spdif_pins_b>;
代码语言:javascript
复制
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播放
代码语言:javascript
复制
通过Headphone播放
1.开机后推送测试音频48000.wav到小机端,pc命令:adb push 48000.wav /tmp/
2.播放该音频文件, aplay /tmp/48000.wav
2.21.6.2录音
代码语言:javascript
复制
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

设定指定控件的值

举例:

代码语言:javascript
复制
获取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文件,可以解析头部,识别通道数,采样率等参数。

举例:

代码语言:javascript
复制
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

举例:

代码语言:javascript
复制
录制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。

代码语言:javascript
复制
@hooks [
{
func load
files [
{
@func concat
strings [
{ @func datadir }
"/alsa.conf.d/"
]
}
"/etc/asound.conf"
"~/.asoundrc"
]
errors false
}
]

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

代码语言:javascript
复制
/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软件包。

3-1-4-1
3-1-4-1
3-1-4-2
3-1-4-2

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

代码语言:javascript
复制
设定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

设定指定控件的值

举例:

代码语言:javascript
复制
获取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文件,可以解析头部,识别通道数,采样率等参数

举例:

代码语言:javascript
复制
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

指定采样精度

举例:

代码语言:javascript
复制
录制通道数为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驱动的寄存器调试节点位于:

代码语言:javascript
复制
/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

举例:

查看所有寄存器状态:

代码语言:javascript
复制
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:0x0
代码语言:javascript
复制
SUNXI_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

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

改写某个数字寄存器:

代码语言:javascript
复制
echo 1,1,0x24,0 > /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg
表示将0x24数字寄存器写为0x0

改写某个模拟寄存器:

代码语言:javascript
复制
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模块的寄存器基地址

代码语言:javascript
复制
i2s0: 0x05090000
i2s1: 0x05091000
i2s2: 0x05092000

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

代码语言:javascript
复制
cd /sys/class/sunxi_dump
echo 0x05090000,0x050900a0 > dump
cat dump
3.3.3 3.3.3 dump dmic寄存器

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

代码语言:javascript
复制
dmic: 0x05095000

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

代码语言:javascript
复制
cd /sys/class/sunxi_dump
echo 0x05095000,0x05095050 > dump
cat dump
3.3.4 3.3.4 dump spdif寄存器

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

代码语言:javascript
复制
spdif: 0x05093000

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

代码语言:javascript
复制
cd /sys/class/sunxi_dump
echo 0x05093000,0x05093040 > dump
cat dump

3.4 3.4 sound procfs.

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

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

代码语言:javascript
复制
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
[*] Sound Proc FS Support
[*] Verbose procfs contents

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

代码语言:javascript
复制
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都能拿到比较有用的信息:

代码语言:javascript
复制
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

主要涉及到的接口:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>
#include <alsa/asoundlib.h>
#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;
代码语言:javascript
复制
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: %s\n”, volume_control); goto failed; } err = snd_ctl_open(&handle, card, 0); if (err < 0) { fprintf(stderr, “Control device %s open error:%s\n”, 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 %s\n”, 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 %s\n”, 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: %s\n”, card, snd_strerror(err)); goto failed; } err = snd_ctl_elem_write(handle, control);

代码语言:javascript
复制
if (err < 0) {
fprintf(stderr, "Control %s write error: %s\n", 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)去实现播放、录音功能。

主要涉及到的接口:

代码语言:javascript
复制
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 配置方法

  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驱动以及开机音乐功能
5-1-1
5-1-1
  1. 修改sys_config文件
代码语言:javascript
复制
配置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
代码语言:javascript
复制
另外codec节点也需要配置正确,下面是部分重要配置
[codec]
codec_used = 0x1
lineout_vol =0x1a
gpio-spk = port:PH9<1><1><1><1>
  1. 创建boottone分区
代码语言:javascript
复制
开机音乐的音频文件需要放置在单独一个分区中,例如boottone分区,修改sys_partition.fex
文件:
[partition]
name = boottone
size = 2048
downloadfile = "boottone.fex"
user_type = 0x8000
代码语言:javascript
复制
上述 2048 表示1M的空间,注意根据实际音频文件大小填写合适的size
然后将音频文件重命名为boottone.fex,并放置到方案配置目录下,以cowbell-perf1方案
为例:
mv kaiji.wav target/allwinner/cowbell-perf1/configs/boottone.fex
  1. 修改env配置文件
代码语言:javascript
复制
主要增下面几行:
uboot_tone_addr=0x4327ffd4
boottone_partition=boottone
load_boottone=sunxi_flash read ${uboot_tone_addr} ${boottone_partition}
代码语言:javascript
复制
uboot_tone_addr用于指定音频文件加载到dram的地址
boottone_partition用于指定音频文件所在分区名
load_boottone用于加载音频文件到dram的命令
  1. 将内核AudioCodec驱动编译成模块
代码语言:javascript
复制
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
代码语言:javascript
复制
-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=y
代码语言:javascript
复制
make 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 注意事项

  1. uboot退出时,不能关掉dma。如果发生在跳转kenrel时声音变化或消失,请确认跳转到内 核前是否调用了sunxi_dma_exit();
  2. 内核并不知道uboot将音频加载到dram的位置。理论上,kernel可能会在初始化过程中, 用到那片内存,导致音乐播放不正常。
    • 可以在dts中,将该片内存改为reserve属性,可以确保kernel不会使用到。
    • 选用kernel初始化不会用到的内存块
  3. 可以在uboot命令行下执行boottone命令进行调试

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

6.1 R328.

  1. 只有一个DAC,所以在播放两通道数据的时候,硬件上会将第二个通道的数据丢掉。如果想
代码语言:javascript
复制
要将两通道数据都完成播放出来,需要在软件上将两通道合成,可利用alsa插件实现,例如下
面配置:
pcm.playback {
type plug
slave {
pcm "hw:audiocodec,0"
rate 48000
channels 1
}
}
代码语言:javascript
复制
alsa插件会将两通道数据的幅度衰减为由原来的一半(如果直接相加,幅度为原来的两倍,有
可能造成削顶),再组合为一通道写入声卡中。
  1. 使用模拟mic作AEC时,需要将该MIC gain设置为0dB.如果有增益,则会导致录音开始及结束时产生pop音(开关PA产生的pop音,经过差分MIC消除后仍然存在极小的杂音,如果再经过MIC增益放大,则会变为明显的pop音) rintf(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: %s\n”, card, snd_strerror(err)); goto failed; } err = snd_ctl_elem_write(handle, control);
代码语言:javascript
复制
if (err < 0) {
fprintf(stderr, "Control %s write error: %s\n", 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)去实现播放、录音功能。

主要涉及到的接口:

代码语言:javascript
复制
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 配置方法

  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驱动以及开机音乐功能

[外链图片转存中…(img-SbAophv6-1677205397769)]

  1. 修改sys_config文件
代码语言:javascript
复制
配置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
代码语言:javascript
复制
另外codec节点也需要配置正确,下面是部分重要配置
[codec]
codec_used = 0x1
lineout_vol =0x1a
gpio-spk = port:PH9<1><1><1><1>
  1. 创建boottone分区
代码语言:javascript
复制
开机音乐的音频文件需要放置在单独一个分区中,例如boottone分区,修改sys_partition.fex
文件:
[partition]
name = boottone
size = 2048
downloadfile = "boottone.fex"
user_type = 0x8000
代码语言:javascript
复制
上述 2048 表示1M的空间,注意根据实际音频文件大小填写合适的size
然后将音频文件重命名为boottone.fex,并放置到方案配置目录下,以cowbell-perf1方案
为例:
mv kaiji.wav target/allwinner/cowbell-perf1/configs/boottone.fex
  1. 修改env配置文件
代码语言:javascript
复制
主要增下面几行:
uboot_tone_addr=0x4327ffd4
boottone_partition=boottone
load_boottone=sunxi_flash read ${uboot_tone_addr} ${boottone_partition}
代码语言:javascript
复制
uboot_tone_addr用于指定音频文件加载到dram的地址
boottone_partition用于指定音频文件所在分区名
load_boottone用于加载音频文件到dram的命令
  1. 将内核AudioCodec驱动编译成模块
代码语言:javascript
复制
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
代码语言:javascript
复制
-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=y
代码语言:javascript
复制
make 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 注意事项

  1. uboot退出时,不能关掉dma。如果发生在跳转kenrel时声音变化或消失,请确认跳转到内 核前是否调用了sunxi_dma_exit();
  2. 内核并不知道uboot将音频加载到dram的位置。理论上,kernel可能会在初始化过程中, 用到那片内存,导致音乐播放不正常。
    • 可以在dts中,将该片内存改为reserve属性,可以确保kernel不会使用到。
    • 选用kernel初始化不会用到的内存块
  3. 可以在uboot命令行下执行boottone命令进行调试

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

6.1 R328.

  1. 只有一个DAC,所以在播放两通道数据的时候,硬件上会将第二个通道的数据丢掉。如果想
代码语言:javascript
复制
要将两通道数据都完成播放出来,需要在软件上将两通道合成,可利用alsa插件实现,例如下
面配置:
pcm.playback {
type plug
slave {
pcm "hw:audiocodec,0"
rate 48000
channels 1
}
}
代码语言:javascript
复制
alsa插件会将两通道数据的幅度衰减为由原来的一半(如果直接相加,幅度为原来的两倍,有
可能造成削顶),再组合为一通道写入声卡中。
  1. 使用模拟mic作AEC时,需要将该MIC gain设置为0dB.如果有增益,则会导致录音开始及结束时产生pop音(开关PA产生的pop音,经过差分MIC消除后仍然存在极小的杂音,如果再经过MIC增益放大,则会变为明显的pop音)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • OpenRemoved_Tina_Linux_音频_开发指南
    • 1 概述
      • 1.1 编写目的
      • 1.2 适用范围
      • 1.3 相关人员
      • 1.4 相关术语
    • 2 模块介绍
      • 2.1 驱动框架
      • 2.2 音频接口介绍.
      • 2.3 R6音频接口
      • 2.4 R7s音频接口
    • 2.5 R11音频接口
      • 2.5.1 硬件资源
      • 2.5.2 时钟源
      • 2.5.3 代码结构
      • 2.5.4 AudioCodec
      • 2.5.5 Daudio.
      • 2.5.6 标案音频测试方法
    • 2.6 R16音频接口
      • 2.6.1 硬件资源
      • 2.6.2 时钟源
      • 2.6.3 代码结构
      • 2.6.4 AudioCodec
      • 2.6.5 Daudio.
      • 2.6.6 标案音频测试方法
    • 2.7 R18音频接口
      • 2.7.1 硬件资源
      • 2.7.2 时钟源
      • 2.7.3 代码结构
      • 2.7.4 AudioCodec
      • 2.75 Daudio.
      • 2.7.6 SPDIF
      • 2.7.7 外挂codec:AC108
      • 2.7.8 外挂数字功放TAS5731.
      • 2.7.9 HDMI音频接口
      • 2.7.10 标案音频测试方法.
    • 2.8 R30音频接口
      • 2.8.1 硬件资源
      • 2.8.2 时钟源
      • 2.8.3 代码结构
      • 2.8.4 AudioCodec
      • 2.8.5 Daudio.
      • 2.8.6 DMIC
      • 2.8.7 标案音频测试方法
    • 2.9 R328音频接口.
      • 2.9.1 硬件资源
      • 2.9.2 时钟源.
      • 2.9.3 代码结构
      • 2.9.4 AudioCodec
      • 2.14.5 Daudio
      • 2.14.6 Dmic
      • 2.14.7 SPDIF
      • 2.14.8 MAD
      • 2.14.9 VAD.
      • 2.14.10标案音频测试方法.
    • 2.20 V853音频接口
      • 2.20.1 时钟源.
      • 2.20.2 代码结构
      • 2.20.3 AudioCodec
      • 2.20.4 Daudio
      • 2.20.5 DMIC.
      • 2.20.6 RX_SYNC多声卡同步功能
      • 2.20.7 标案音频测试方法.
    • 2.21 F133音频接口
      • 2.21.1 时钟源.
      • 2.21.2 AudioCodec
      • 2.21.3 Daudio
      • 2.21.4 DMIC.
      • 2.21.5 SPDIF
      • 2.21.6 标案音频测试方法.
    • 3 3常用工具及调试方法
      • 3.1 3.1 alsa-utils
      • 3.2 3.2 tinyalsa-utils.
      • 3.3 3.3 dump寄存器
      • 3.4 3.4 sound procfs.
    • 4 4常用接口说明
      • 4.1 4.1 control接口
      • 4.2 4.2 PCM接口.
    • 5 开机音乐功能
      • 5.1 配置方法
      • 5.2 注意事项
    • 6 各平台音频模块注意事项
      • 6.1 R328.
      • 4.2 4.2 PCM接口.
    • 5 开机音乐功能
      • 5.1 配置方法
      • 5.2 注意事项
    • 6 各平台音频模块注意事项
      • 6.1 R328.
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档