Tina_Linux_音频_开发指南

Posted 韦东山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tina_Linux_音频_开发指南相关的知识,希望对你有一定的参考价值。

文章目录

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 相关术语

术语解释说明
ALSAAdvanced Linux Sound Architecture
DMA直接内存存取,指数据不经cpu,直接在设备和内存,内存和内存,设备和设备之间传输
ASoCALSA System on Chip
样本长度sample样本是记录音频数据最基本的单位,常使用 16 位
通道数channel该参数为 1 表示单声道, 2 则是立体声
帧frame帧记录了一个声音单元,其长度为样本长度与通道数的乘积
采样率rate每秒钟采样次数,该次数是针对帧而言
周期period音频设备一次处理所需要的帧数,对于音频设备的数据访问以及音频数据的存储,都是以此为单位
交错模式interleaved是一种音频数据的记录模式,在交错模式下,数据以连续帧的形式存放,即首先记录完帧1 的左声道样本和右声道样本(假设为立体声格式),再开始帧2 的记录,而在非交错模式下,首先记录的是一个周期内所有帧的左声道样本,再记录右声道样本,数据是以连续通道的方式存储。不过多数情况下,我们只需要使用交错模式就可以了
AudioCodec芯片内置音频接口
Daudio数字音频接口,可配置成I2S/PCM 标准音频接口
Dmic数字麦接口
MADMic Activity Detector, 语音能量检测模块
AGCAutomatic Gain Control
DRCDynamic 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。

  1. Codec驱动

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

     - Codec DAI (Digital Audio Interface)和PCM的配置信息;
     - Codec的IO控制方式(I2C,SPI等);
     - Mixer和其他的音频控件;
     - Codec和ALSA音频操作接口;
    
  2. Platform驱动

    它包含了该SoC平台的音频DMA和音频接口的配置和控制(I2S,PCM,AC97等等);
    一般不包含与板子或codec相关的代码。

  3. Machine驱动单独的Platform和Codec驱动是不能工作的,它必须由Machine驱动把它们结合在一起才能完成整个设备的音频处理工作。

2.2 音频接口介绍.

我们提供的音频接口有:

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

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

2.3 R6音频接口

2.3.1 硬件资源

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

2.3.2 时钟源

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

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

2.3.3 代码结构

linux-3.10/sound/soc/sunxi/
├── sun3iw1_ac101.c // daudio+ac101的machine驱动
├── sun3iw1_codec.c // codec 驱动
├── sun3iw1_codec.h
├── sun3iw1_daudio.c // daudio的platform驱动
├── sun3iw1_daudio.h
├── sun3iw1_sndcodec.c // codec machine驱动
├── sunxi_cpudai.c // codec platform驱动
├── sunxi_cpudai.h
├── sunxi_dma.c //通用文件,提供注册platform驱动的接口及相关函数集
├── sunxi_dma.h
├── sunxi_rw_func.c //通用文件,读写模拟/数字寄存器的接口
└── sunxi_rw_func.h

linux-3.10/sound/soc/codecs/
├── ac101.c // daudio+ac101的codec驱动
└── ac101.h

2.3.4 Audiocodec.

硬件特性

  • 两路DAC

    • 支持16bit,24bit采样精度
    • 支持8KHz~192KHz采样率
  • 一路ADC

    • 支持16bit,24bit采样精度
    • 支持8KHz~48KHz采样率
  • 一路模拟输出:一路立体声headphone输出(HPL, HPR)

  • 四路模拟输入:MIC,FMINL,FMINR,LINEIN

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

2.3.4.1 内核配置
Device Drivers --->
<*> Sound card support --->
    <*> Advanced Linux Sound Architecture --->
        <*> ALSA for SoC audio support --->
            <*> ASoC support for SUNXI --->
                <*> ASoC support for sun3iw1 audiocodec
                <*> ASoC support for internal-codec cpudai
                <*> ASoC support for sun3iw1 audiocodec machine
2.3.4.2 sys_config配置.
[sndcodec]
sndcodec_used = 0x1
;------------------------------------------------------------------------------
[cpudai]
cpudai_used = 0x1
;------------------------------------------------------------------------------
[codec]
codec_used = 0x1
headphonevol = 0x3b
maingain = 0
pa_sleep_time = 30
gpio-spk = port:PD03<1><1><default><default>
gpio_shdn = 1

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

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

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

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

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

codec配置codec配置说明
codec_used是否使用codec驱动。 0 :不使用; 1 :使用
headphonevolheadphone volume,可设定范围0~0x3f, 0表示mute, 163表示-62dB0dB, 1dB/step
micgainmic增益,可设定范围0~0x7, 0:0dB, 17:1533dB, 3dB/step,一般设置0x4,即24dB.如果作为aec回路,则需要设置为0dB
pa_sleep_time操作PA之后的延时时间(用来避免pop音),单位ms
gpio-spkPA使能引脚
gpio_shdnPA引脚使能方式。0:低电平有效; 1 :高电平有效

说明

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

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

播歌
DACL --> HP_L Mux --> HPOUTL
DACR --> HP_R Mux --> HPOUTR

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

录制单MIC数据
MICIN --> ADC Mixer -> ADC

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

R6相关控件如下表:

控件名称功能数值
ADC INPUT GAIN controlADC增益0–7,表示-4.5–6dB
ADC MIC Boost AMPenMIC Boost AMP使能0:关闭; 1:开启
ADC MIC Boost AMPgain control MIC增益0–7, 0:0dB, 1~7:15–33dB
ADC PA speed selectPA速度选择 0:normal; 1:fast
ADC mixer mute for FMLADC Mixer设置,使能FML通路0:关闭; 1:开启
ADC mixer mute for FMRADC Mixer设置,使能FMR通路0:关闭; 1:开启
ADC mixer mute for left outputADC Mixer设置,使能left output Mixer通路0:关闭; 1:开启
ADC mixer mute for lineinADC Mixer设置,使能linein通路0:关闭; 1:开启
ADC mixer mute for micADC Mixer设置,使能mic通路0:关闭; 1:开启
ADC mixer mute for right outputADC Mixer设置,使能right output Mixer通路
LINEIN GAIN controllinein到output mixer的增益0–7, 0~7:0–14dB,2dB/step
MICIN GAIN controlMIC到outpu mixer的增益 0–7,表示-4.5–6dB
dac digital volumeDAC数字音量 063,表示0-73.08dB,-1.16dB/step
head phone volumeheadphone音量0 表示mute, 163表示-62dB0dB, -1dB/step

录音通路设置举例:

  1. 录音单声道数据
通过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电路)
amixer -D hw:audiocodec cset name='ADC mixer mute for left ouput' 1

2.3.5 Daudio.

硬件特性

  • 一路I2S/PCM;
  • 支持主从模式
  • 支持Left-justified,Right-justified,Standar mode I2S,PCM mode
  • 支持i2s,pcm协议格式配置
  • 支持mono和stereo模式,最高支持 2 通道
  • 支持同时playback和record(全双工模式)
  • 支持8~192KHz采样率
  • 支持16,24,32bit采样精度
2.3.5.1 内核配置
Device Drivers --->
<*> Sound card support --->
        <*> Advanced Linux Sound Architecture --->
            <*> ALSA for SoC audio support --->
                <*> ASoC support for SUNXI --->
                    <*> ASoC support for daudio platform
                    <*> ASoC support for sun3iw1 & ac101 daudio machine
2.3.5.2 sys_config配置.
[snddaudio0]
snddaudio0_used = 1
over_sample_rate = 128
[daudio0]
daudio0_used = 1
word_select_size = 32
pcm_sync_period = 32
pcm_lsb_first = 0
over_sample_rate = 128
slot_width_select = 16
pcm_sync_type = 0
pcm_start_slot = 0
tdm_config = 1

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

snddaudio配置snddaudio配置说明
snddaudio0_used是否使用snddaudio驱动。 0 :不使用; 1 :使用
over_sample_rate支持128fs/192fs/256fs/384fs/512fs/768fs

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

snddaudio配置snddaudio配置说明
daudio0_used是否使用daudio驱动。 0 :不使用; 1 :使用
word_select_size支持16bits/20bits/24bits/32bits
pcm_sync_period16/32/64/128/256
snddaudio配置snddaudio配置说明
pcm_lsb_first0: msb first; 1: lsb first
over_sample_rate支持128fs/192fs/256fs/384fs/512fs/768fs
slot_width_select16bits/20bits/24bits/32bits
pcm_sync_type0: long frame sync; 1: short frame sync
pcm_start_slot0: 1st slot; 1: 2nd slot; 2: 3th slot; 3:4th slot
tdm_config0:pcm 1:i2s

2.3.6 外挂codec:AC101

R6标案使用的AC101作双声道录音,audiocodec则录制回路作AEC下面对R6如何配置使
用AC101作简单介绍

2.3.6.1 内核配置
Device Drivers --->
    <*> Sound card support --->
        <*> Advanced Linux Sound Architecture --->
            <*> ALSA for SoC audio support --->
                <*> AC101 Codec
                <*> ASoC support for SUNXI --->
                    <*> ASoC support for daudio platform
                    <*> ASoC support for sun3iw1 & ac101 daudio machine
2.3.6.2 sys_config&dts配置.

R6通过TWI1控制AC101,而I2S0用于音频数据的传输

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

linux-3.10/arch/arm/boot/dts/sun3iw1p1-sitar-mic2.dts
twi1: twi@0x01c27400
    ac101@1a 
        compatible = "x-powers,ac101";
        reg = <0x1a>;
        audio_int_ctrl = <&pio PL 12 6 1 1 0>;
        audio_pa_ctrl = <&pio PG 13 1 1 1 0>;
        speaker_val = <0x1b>;
        headset_val = <0x3b>;
        single_speaker_val = <0x19>;
        double_speaker_val = <0x1b>;
        speaker_double_used = <1>;
        earpiece_val = <0x1e>;
        mainmic_val = <0x4>;
        headsetmic_val = <0x4>;
        dmic_used = <0>;
        adc_digital_val = <0xb0b0>;
        agc_used = <0>;
        drc_used = <1>;
        linein_to_spk_used = <0>;
        linein_to_hp_used = <0>;
        linein_to_aif2_used = <0>;
        ;

I2S部分配置可以通过dts配置,也可以通过sys_config覆盖dts的配置

[snddaudio0]
snddaudio0_used = 1
over_sample_rate = 128
sunxi,snddaudio-codec = "ac101.1-001a"
sunxi,snddaudio-codec-dai = "ac101"

[daudio0]
daudio0_used = 1
word_select_size = 32
pcm_sync_period = 32
pcm_lsb_first = 0
over_sample_rate = 128
slot_width_select = 16
pcm_sync_type = 0
pcm_start_slot = 0
tdm_config = 1

i2s相关格式需要根据AC101 spec进行配置

而snddaudio0中,注意codec的名称,需要与实际AC101的dev name相匹配,而codec-dai名称则与AC101驱动中设置的dai name相匹配

2.3.7 标案音频测试方法

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

2.3.7.1 播放

如《R6 AudioCodec数据通路》章节所说,驱动代码中已固定配置了播放通路进入系统后直接通过aplay工具进行播放即可,如:

aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav

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

amixer -Dhw:audiocodec cset name='headphone volume' 50
2.3.7.2 录音

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

/etc/init.d/rc.final

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

arecord -Dhw:sndac1011001a -f S16_LE -r 16000 -c 2 /tmp/test.wav

2.4 R7s音频接口

2.4.1 硬件资源

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

2.4.2 时钟源

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

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

2.4.3 代码结构

linux-4.9/sound/soc/sunxi/
├── sunxi-pcm.c //提供注册platform驱动的接口及相关函数集
├── sunxi-pcm.h
├── sun8iw8
│   ├── sunxi_codec.c // cpudai驱动
│   ├── sunxi_codecdma.c // codec platform驱动
│   ├── sun8iw8_sndcodec_new.c // codec驱动
│   └── sunxi_sndcodec.c // codec machine驱动
├── sunxi-daudio.c // daudio platform驱动
└── sunxi-snddaudio.c // daudio machine驱动

linux-4.9/sound/soc/soc-utils.c // daudio codec驱动

2.4.4 Audiocodec.

硬件特性

  • 两路DAC

    • 支持16bit,24bit采样精度
    • 支持8KHz~192KHz采样率
  • 两路ADC

    • 支持16bit,24bit采样精度
    • 支持8KHz~48KHz采样率
  • 两路模拟输出:

    • 一路立体声LINEOUT输出(LINEOUTP, LINEOUTN)
    • 一路立体声headphone输出(HPOUTL, HPOUTR)
  • 两路模拟输入:MIC1,MIC2

    • 支持同时playback和record(全双工模式)
    • 支持ADC的AGC,DRC功能
    • 支持DAC的DRC功能
2.4.4.1 内核配置
Device Drivers --->
    <*> Sound card support --->
        <*> Advanced Linux Sound Architecture --->
            <*> ALSA for SoC audio support --->
                <*> Audiocodec for the SUNXI chips
2.4.4.2 sys_config配置.
[codec]
headphone_vol = 0x3b
lineout_vol = 0x1a
audio_pa_ctrl = port:PB05<1><default><default><0>
adcagc_used = 0
adcdrc_used = 0
dacdrc_used = 0
adchpf_used = 0
dachpf_used = 0
codec配置codec配置说明
headphone_volheadphone volume,可设定范围0~0x3f, 0表示mute, 163表示-62dB0dB, 1dB/step
audio_pa_ctrlPA使能引脚
adcagc_used1:use adcagc 0:no use
adcdrc_used1:use adcdrc 0:no use
dacdrc_used1:use dacdrc 0:no use
adchpf_used1:use adchpf 0:no use
dachpf_used1:use dachpf 0:no use
2.4.4.3 codec数据通路

播歌
DACL --> Left Output Mixer --> LINEOUTL
DACR --> Right Output Mixer --> LINEOUTR

录音
MIC1P --> LADC input Mixer --> ADCL
MIC2P --> RADC input Mixer --> ADCR
控件名称功能数值
Lineout volumelineout音量设置0–31,表示-43.5–0dB
ADC input gain controlADC增益 0–7,表示-4.5–6dB
HP_L Mux HP_LMux设置0:DACL HPL Switch; 1:MIXER_L Switch
HP_R Mux HP_RMux设置0:DACR HPR Switch; 1:MIXER_R Switch
LADC input Mixer MIC1 boost SwitchLADC input Mixer设置,使能MIC1通路0:关闭; 1:开启
LADC input Mixer MIC2 boost SwitchLADC input Mixer设置,使能MIC2通路0:关闭; 1:开启
LADC input Mixer l_output mixer SwitchLADC input Mixer设置,使能l_output通路0:关闭; 1:开启
LADC input Mixer r_output mixer SwitchLADC input Mixer设置,使能r_output通路0:关闭; 1:开启
Left Output Mixer DACL SwitchLeft Output Mixer设置,使能DACL通路0:关闭; 1:开启
Left Output Mixer DACR SwitchLeft Output Mixer设置,使能DACR通路0:关闭; 1:开启
Left Output Mixer MIC1Booststage SwitchLeft Output Mixer设置,使能MIC1通路0:关闭; 1:开启
Left Output Mixer MIC2Booststage SwitchLeft Output Mixer设置,使能MIC2通路0:关闭; 1:开启
MIC1 boost AMP gain controlMIC1增益0–7, 0:0dB,1~7:24–42dB,3dB/step
MIC1_G boost stageoutput mixer controlMIC1 to L or R output Mixer增益0–7,表示-4.5–6dB
MIC2 SRCMIC2 SRC设置0:MIC3; 1:MIC2
MIC2 boost AMP gain controlMIC2增益0–7, 0:0dB,1~7:24–42dB,3dB/step
MIC2_G boost stage output mixer controlMIC2 to L or R output Mixer增益0–7,表示-4.5–6dB
RADC input Mixer MIC1 boost SwitchRADC input Mixer设置,使能MIC1通路0:关闭; 1:开启
RADC input Mixer MIC2 boost SwitchRADC input Mixer设置,使能MIC2通路0:关闭; 1:开启
RADC input Mixer l_output mixer SwitchRADC input Mixer设置,使能l_output通路0:关闭; 1:开启
RADC input Mixer r_output mixer SwitchRADC input Mixer设置,使能r_output通路0:关闭; 1:开启
Right Output Mixer DACL SwitchRight Output Mixer设置,使能DACL通路0:关闭; 1:开启
Right Output Mixer DACR SwitchRight Output Mixer设置,使能DACR通路0:关闭; 1:开启
Right Output Mixer MIC1Booststage SwitchRight Output Mixer设置, 使能MIC1通路0:关闭; 1:开启
Right Output Mixer MIC2Booststage SwitchRight Output Mixer设置,使能MIC2通路0:关闭; 1:开启
SPK_L MuxSPK_L Mux设置0:MIXER_L Switch; 1:MIXR+MIXL
SPK_R MuxSPK_R Mux设置0:MIXER_L Switch; 1:MIXR+MIXL
digital volume数字音量设置0–63,表示-73.08–0dB
headphone volumeheadphone音量设置0–63,0表示mute; 1~63表示-62dB–0dB

通路设置举例:

  1. 播放通路
通过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. 录音通路
通过MIC1,MIC2录音:
amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1
amixer -D hw:audiocodec cset name='RADC input Mixer MIC2 boost Switch' 1
amixer -D hw:audiocodec cset name='MIC2 SRC' 0
amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4
amixer -D hw:audiocodec cset name='MIC2 boost AMP gain control' 4

2.4.5 Daudio.

硬件特性

  • 一路I2S/PCM;
  • 支持主从模式
  • 支持Left-justified,Right-justified,Standar mode I2S,PCM mode
  • 支持i2s,pcm协议格式配置
  • 支持mono和stereo模式
  • 支持同时playback和record(全双工模式)
  • 支持8~192KHz采样率
  • 支持16,24,32bit采样精度
2.4.5.1 内核配置
Device Drivers --->
    <*> Sound card support --->
        <*> Advanced Linux Sound Architecture --->
            <*> ALSA for SoC audio support --->
                <*> Allwinner Digital Audio Support
2.4.5.2 sys_config配置.
[tdm0]
daudio_used = 0
daudio_master = 4
daudio_select = 1
audio_format = 1
signal_inversion = 1
sample_resolution = 16
slot_width_select = 16
pcm_lrck_period = 32
pcm_lrckr_period = 1
msb_lsb_first = 0
sign_extend = 0
tx_data_mode = 0
rx_data_mode = 0
;i2s_mclk = port:PB08<2><1><default><default>
i2s_bclk = port:PG11<2><1><default><default>
i2s_lrclk = port:PG10<2><1><default><default>
i2s_dout0 = port:PG12<2><1><default><default>
i2s_dout1 =
i2s_dout2 =
i2s_dout3 =
i2s_din = port:PG13<2><1><default><default>
tdm0配置tdm0配置说明
daudio_master1: 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_select0: pcm mode; 1: i2s mode
audio_format1: 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_inversion1: 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_first0: msb first; 1: lsb first
sign_extend0: zero pending; 1: sign extend
tx_data_mode0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
rx_data_mode0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
i2s_bclki2s_bclk引脚
i2s_lrclki2s_lrclk引脚
i2s_dout0i2s_dout引脚
i2s_dini2s_din引脚

2.4.6 标案音频测试方法

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

2.4.6.1 播放

amixer -D hw:audiocodec cset name='SPK_L Mux' 1
amixer -D hw:audiocodec cset name='SPK_R Mux' 1
amixer -D hw:audiocodec cset name='Lineout volume' 24
amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1
amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1
amixer -D hw:audiocodec cset name='digital volume' 0
aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav

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

amixer -Dhw:audiocodec cset name='Lineout volume' 50

2.4.6.2 录音

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

amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1
amixer -D hw:audiocodec cset name='RADC input Mixer MIC2 boost Switch' 1
amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4
amixer -D hw:audiocodec cset name='MIC2 SRC' 0
amixer -D hw:audiocodec cset name='MIC2 boost AMP gain control' 4

arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 /tmp/test.wav

2.5 R11音频接口

2.5.1 硬件资源

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

2.5.2 时钟源

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

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

2.5.3 代码结构

linux-3.4/sound/soc/sunxi/
├── audiocodec
│ ├── sun8iw8_sndcodec_new.c // codec 驱动
│ ├── sun8iw8_sndcodec.h
│ ├── sunxi_codec.c // cpu dai驱动
│ ├── sunxi_sndcodec.c // codec machine驱动
│ ├── sunxi_codecdma.c // codec platform驱动
│ └── sunxi_codecdma.h
└── daudio0
    ├── snddaudio0.c // daudio codec驱动
    ├── sunxi-daudio0.c // daudio cpu dai驱动
    ├── sunxi-daudio0.h
    ├── sunxi-daudiodma0.c // daudio platform 驱动
    ├── sunxi-daudiodma0.h
    └── sunxi-snddaudio0.c // daudio machine驱动

2.5.4 AudioCodec

硬件特性

  • 两路DAC

    • 支持16bit,24bit采样精度
    • 支持8KHz~192KHz采样率
  • 两路ADC

    • 支持16bit,24bit采样精度
    • 支持8KHz~48KHz采样率
  • 一路模拟输出:一路立体声LINEOUT输出(LINEOUTP, LINEOUTN)

  • 一路路模拟输入:MIC1

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

  • 支持ADC的AGC,DRC功能

  • 支持DAC的DRC功能

2.5.4.1 内核配置

Device Drivers --->
<*> Sound card support --->
    <*> Advanced Linux Sound Architecture --->
        <*> ALSA for SoC audio support --->
            <*> Audiocodec for the SUNXI chips
            <*> Audiocodec Machine for codec chips
            <*> Audiocodec for the SUN8IW8 chips

2.5.4.2 sys_config配置.

[audio0]
headphone_vol = 0x3b
lineout_vol = 0x1a
audio_pa_ctrl = port:PB05<1><default><default><0>
audio_pa_active_level = 1
adcagc_used = 0
adcdrc_used = 0
dacdrc_used = 0
adchpf_used = 0
dachpf_used = 0
audio0配置audio0配置说明
headphone_volheadphone volume,可设定范围0~0x3f, 0表示mute,163表示-62dB0dB, 1dB/step
lineout_vollineout volume,可设定范围0~0x1f, 0或者 1 表示mute,231表示-43.5dB0dB, 1.5dB/step
audio_pa_ctrlPA使能引脚
audio_pa_active_level1:high level active; 0:low level active
adcagc_used1:use adcagc 0:no use
adcdrc_used1:use adcdrc 0:no use
dacdrc_used1:use dacdrc 0:no use
adchpf_used1:use adchpf 0:no use
dachpf_used1:use dachpf 0:no use

2.5.4.3 codec数据通路

播歌
DACL --> Left Output Mixer --> LINEOUTL
DACR --> Right Output Mixer --> LINEOUTR

录音
MIC1P --> LADC input Mixer --> ADCL
控件名称功能数值
Lineout volumelineout 音量设置0–31, 表示-43.5–0dB
ADC input gain controlADC 增益0–7, 表示-4.5–6dB
LADC input Mixer MIC1 boost SwitchLADC input Mixer 设置,使能MIC 通路 0: 关闭; 1: 开启
Left Output Mixer DACL SwitchLeft Output Mixer 设置,使能DACL 通路 0: 关闭; 1: 开启
Left Output Mixer DACR SwitchLeft Output Mixer 设置,使能DACR 通路 0: 关闭; 1: 开启
Left Output Mixer MIC1Booststage SwitchLeft Output Mixer 设置,使能MIC1 通路 0: 关闭; 1: 开启
MIC1 boost AMP gain controlMIC1 增益0–7, 0:0dB, 1~7:24–42dB,3dB/step
MIC1_G boost stage output mixer controlMIC1 to L or R output Mixer 增益0–7, 表示-4.5–6dB
Right Output Mixer DACL SwitchRight Output Mixer 设置,使能DACL 通路0: 关闭; 1: 开启
Right Output Mixer DACR SwitchRight Output Mixer 设置, 使能DACR 通路 0: 关闭; 1: 开启
Right Output Mixer MIC1Booststage SwitchRight 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. 播放通路
通过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. 录音通路
通过MIC1录音:
amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1
amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4

2.5.5 Daudio.

硬件特性

  • 一路I2S/PCM;
  • 支持主从模式
  • 支持Left-justified,Right-justified,Standar mode I2S,PCM mode
  • 支持i2s,pcm协议格式配置
  • 支持mono和stereo模式,最高支持 2 通道
  • 支持同时playback和record(全双工模式)
  • 支持8~192KHz采样率
  • 支持16,24,32bit采样精度

2.5.5.1 内核配置

Device Drivers --->
<*> Sound card support --->
    <*> Advanced Linux Sound Architecture --->
        <*> ALSA for SoC audio support --->
            <*> SoC daudio0 tdm interface for SUNXI chips
            <*> Daudio0 Public Machine for SUNXI chips

2.5.5.2 sys_config配置.

[tdm0]
daudio_used = 1
daudio_master = 4
daudio_select = 1
audio_format = 1
signal_inversion = 1
sample_resolution = 16
slot_width_select = 16
pcm_lrck_period = 32
pcm_lrckr_period = 1
msb_lsb_first = 0
sign_extend = 0
tx_data_mode = 0
rx_data_mode = 0
;i2s_mclk = port:PB08<2><1><default><default>
i2s_bclk = port:PG11<2><1><default><default>
i2s_lrclk = port:PG10<2><1><default><default>
i2s_dout0 = port:PG12<2><1><default><default>
i2s_dout1 =
i2s_dout2 =
i2s_dout3 =
i2s_din = port:PG13<2><1><default><default>
tdm0配置tdm0配置说明
daudio_master1: 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_select0: pcm mode; 1: i2s mode
deaudio_format1: 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_inversion1: 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_first0: msb first; 1: lsb first
sign_extend0: zero pending; 1: sign extend
tx_data_mode0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
rx_data_mode0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
i2s_bclki2s_bclk引脚
i2s_lrclki2s_lrclk引脚
i2s_dout0i2s_dout引脚
i2s_dini2s_din引脚

2.5.6 标案音频测试方法

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

2.5.6.1 播放

amixer -D hw:audiocodec cset name='SPK_L Mux' 1
amixer -D hw:audiocodec cset name='SPK_R Mux' 1
amixer -D hw:audiocodec cset name='Lineout volume' 24
amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1
amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1
amixer -D hw:audiocodec cset name='digital volume' 0
aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav

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

amixer -Dhw:audiocodec cset name='Lineout volume' 50

2.5.6.2 录音

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

amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1
amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4

arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 1 /tmp/test.wav

2.6 R16音频接口

2.6.1 硬件资源

R16包含 3 个音频模块,分别是内置AudioCodec,I2S0以及I2S1。

2.6.2 时钟源

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

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

2.6.3 代码结构

linux-3.4/sound/soc/sunxi/
├── audiocodec
│   ├── sun8iw5_machine.c // codec machine驱动
│   ├── sun8iw5_sndcodec.c // codec驱动
│   ├── sun8iw5_sndcodec.h
│   ├── sunxi_codecdma.c // codec platform驱动
│   ├── sunxi_codecdma.h
│   └── sunxi_codec.c // cpu dai驱动
├── i2s0
│ ├── sndi2s0.c // i2s codec驱动
│ ├── sunxi-i2s0dma.c // i2s platform驱动
│ ├── sunxi-i2s0dma.h
│ ├── sunxi-i2s0.c // i2s cpu dai驱动
│ ├── sunxi-i2s0.h
│ └── sunxi-sndi2s0.c // i2s machine驱动
└── i2s1
    ├── sndi2s1.c // i2s codec驱动
    ├── sunxi-i2s1dma.c // i2s platform驱动
    ├── sunxi-i2s1dma.h
    ├── sunxi-i2s1.c // i2s cpu dai驱动
    ├── sunxi-i2s1.h
    └── sunxi-sndi2s1.c // i2s machine驱动

2.6.4 AudioCodec

硬件特性

  • 两路DAC

    • 支持16bit,24bit采样精度
    • 支持8KHz~192KHz采样率
  • 两路ADC

    • 支持16bit,24bit采样精度
    • 支持8KHz~48KHz采样率
  • 两路模拟输出:

    • 一路立体声headphone输出(HPOUTL,HPOUTR)
    • 一路立体声phoneout输出(PHONEOUTP,PHONEOUTN)
  • 四路路模拟输入:MIC1,MIC2,linein,phonein

  • 支持headphone驱动

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

2.6.4.1 内核配置

Device Drivers --->
<*> Sound card support --->
    <*> Advanced Linux Sound Architecture --->
        <*> ALSA for SoC audio support --->
            <*> Audiocodec for the SUNXI chips
            <*> Audiocodec Machine for sun8iw5 chips
            <*> Audiocodec for the SUN8IW5 chips

2.6.4.2 sys_config配置.

[audio0]
audio_used = 1
headphone_vol = 0x3b
pa_double_used = 1
headphone_direct_used = 1
headset_mic_vol = 3
main_mic_vol = 1
;audio_linein_detect = port:PB07<0><default><default><0>
audio_pa_ctrl = port:PD11<1><default><default><0>
pa_gpio_reverse = 0
aif2_used = 0
aif3_used = 0
headphone_mute_used = 0
aif1_lrlk_div = 0x40
audio0配置audio0配置

以上是关于Tina_Linux_音频_开发指南的主要内容,如果未能解决你的问题,请参考以下文章

Tina_Linux_图形系统_开发指南

Tina_Linux_系统裁剪_开发指南

Tina_Linux_安全_开发指南

Tina_Linux_功耗管理_开发指南

Tina_Linux_功耗管理_开发指南

Tina_Linux_系统软件 开发指南

(c)2006-2024 SYSTEM All Rights Reserved IT常识