0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Tina Linux音頻開發(fā)指南

嵌入式Linux那些事 ? 來源:嵌入式Linux那些事 ? 作者:嵌入式Linux那些事 ? 2023-03-06 11:02 ? 次閱讀

Tina_Linux音頻開發(fā)指南

1 概述

1.4 相關(guān)術(shù)語

術(shù)語 解釋說明
ALSA Advanced Linux Sound Architecture
DMA 直接內(nèi)存存取,指數(shù)據(jù)不經(jīng)cpu,直接在設(shè)備和內(nèi)存,內(nèi)存和內(nèi)存,設(shè)備和設(shè)備之間傳輸
ASoC ALSA System on Chip
樣本長(zhǎng)度sample 樣本是記錄音頻數(shù)據(jù)最基本的單位,常使用 16 位
通道數(shù)channel 參數(shù)為 1 表示單聲道, 2 則是立體聲
幀frame 幀記錄了一個(gè)聲音單元,其長(zhǎng)度為樣本長(zhǎng)度與通道數(shù)的乘積
采樣率rate 每秒鐘采樣次數(shù),該次數(shù)是針對(duì)幀而言
周期period 音頻設(shè)備一次處理所需要的幀數(shù),對(duì)于音頻設(shè)備的數(shù)據(jù)訪問以及音頻數(shù)據(jù)的存儲(chǔ),都是以此為單位

交錯(cuò)模式interleaved| 是一種音頻數(shù)據(jù)的記錄模式,在交錯(cuò)模式下,數(shù)據(jù)以連續(xù)幀的形式存放,即首先記錄完幀1 的左聲道樣本和右聲道樣本(假設(shè)為立體聲格式),再開始幀2 的記錄,而在非交錯(cuò)模式下,首先記錄的是一個(gè)周期內(nèi)所有幀的左聲道樣本,再記錄右聲道樣本,數(shù)據(jù)是以連續(xù)通道的方式存儲(chǔ)。不過多數(shù)情況下,我們只需要使用交錯(cuò)模式就可以了| |AudioCodec |芯片內(nèi)置音頻接口| |Daudio |數(shù)字音頻接口,可配置成I2S/PCM 標(biāo)準(zhǔn)音頻接口| |Dmic |數(shù)字麥接口| |MAD |Mic Activity Detector, 語音能量檢測(cè)模塊| |AGC |Automatic Gain Control| |DRC |Dynamic Range Control|

2 模塊介紹

Linux中的音頻子系統(tǒng)采用ALSA架構(gòu)實(shí)現(xiàn)。ALSA目前已經(jīng)成為了Linux的主流音頻體系結(jié)構(gòu)。在內(nèi)核設(shè)備驅(qū)動(dòng)層,ALSA提供了alsa-driver,同時(shí)在應(yīng)用層,ALSA為我們提供了alsa-lib,應(yīng)用程序只要調(diào)用alsa-lib提供的API,即可以完成對(duì)底層音頻硬件的控制。

2.1 驅(qū)動(dòng)框架

Tina SDK對(duì)各個(gè)平臺(tái)的音頻設(shè)備驅(qū)動(dòng)均采用ASoC架構(gòu)實(shí)現(xiàn)。ASoC是建立在標(biāo)準(zhǔn)alsa驅(qū)動(dòng)層上,為了更好地支持嵌入式處理器和移動(dòng)設(shè)備中的音頻codec的一套軟件體系,ASoC將音頻系統(tǒng)分為 3 部分:Codec,Platform和Machine。

Codec驅(qū)動(dòng)

ASoC中的一個(gè)重要設(shè)計(jì)原則就是要求Codec驅(qū)動(dòng)是平臺(tái)無關(guān)的,它包含了一些音頻的控件 (Controls),音頻接口,DAMP(動(dòng)態(tài)音頻電源管理)的定義和某些Codec IO功能。為了保證 硬件無關(guān)性,任何特定于平臺(tái)和機(jī)器的代碼都要移到Platform和Machine驅(qū)動(dòng)中。 所有的Codec驅(qū)動(dòng)都要提供以下特性:

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

Platform驅(qū)動(dòng)

它包含了該SoC平臺(tái)的音頻DMA和音頻接口的配置和控制(I2S,PCM,AC97等等); 一般不包含與板子或codec相關(guān)的代碼。

Machine驅(qū)動(dòng)單獨(dú)的Platform和Codec驅(qū)動(dòng)是不能工作的,它必須由Machine驅(qū)動(dòng)把它們結(jié)合在一起才能完成整個(gè)設(shè)備的音頻處理工作。

圖2-1: ASoC框圖

2.2 音頻接口介紹.

我們提供的音頻接口有:

AudioCodec

Daudio(I2S)

Dmic

Spdif

MAD

不同芯片平臺(tái)的音頻接口資源會(huì)有差異;不同版本的內(nèi)核,對(duì)應(yīng)的ALSA驅(qū)動(dòng)也有所不同;下面會(huì)對(duì)各個(gè)芯片作詳細(xì)介紹。

2.3 R6音頻接口

2.3.1 硬件資源

R6包含 2 個(gè)音頻模塊,分別是內(nèi)置audiocodec以及daudio0。

圖2-2: R6音頻硬件框圖

2.3.2 時(shí)鐘

R6中, 2 個(gè)音頻模塊的時(shí)鐘源均來自pll_audio。

pll_audio可以輸出24.576M或者22.5792M的時(shí)鐘,分別支持48k系列,44.1k系列的播放錄音。

圖2-3: R6時(shí)鐘源

2.3.3 代碼結(jié)構(gòu)

linux-3.10/sound/soc/sunxi/

├── sun3iw1_ac101.c // daudio+ac101的machine驅(qū)動(dòng)

├── sun3iw1_codec.c // codec 驅(qū)動(dòng)

├── sun3iw1_codec.h

├── sun3iw1_daudio.c // daudio的platform驅(qū)動(dòng)

├── sun3iw1_daudio.h

├── sun3iw1_sndcodec.c // codec machine驅(qū)動(dòng)

├── sunxi_cpudai.c // codec platform驅(qū)動(dòng)

├── sunxi_cpudai.h

├── sunxi_dma.c //通用文件,提供注冊(cè)platform驅(qū)動(dòng)的接口及相關(guān)函數(shù)集

├── sunxi_dma.h

├── sunxi_rw_func.c //通用文件,讀寫模擬/數(shù)字寄存器的接口

└── sunxi_rw_func.h

?

linux-3.10/sound/soc/codecs/

├── ac101.c // daudio+ac101的codec驅(qū)動(dòng)

└── ac101.h

2.3.4 Audiocodec.

硬件特性

兩路DAC

支持16bit,24bit采樣精度

支持8KHz~192KHz采樣率

一路ADC

支持16bit,24bit采樣精度

支持8KHz~48KHz采樣率

一路模擬輸出:一路立體聲headphone輸出(HPL, HPR)

四路模擬輸入:MIC,FMINL,FMINR,LINEIN

支持同時(shí)playback和record(全雙工模式)

2.3.4.1 內(nèi)核配置

Device Drivers --->

<*> Sound card support --->

<*> Advanced Linux Sound Architecture --->

<*> ALSA for SoC audio support --->

<*> ASoC support for SUNXI --->

<*> ASoC support for sun3iw1 audiocodec

<*> ASoC support for internal-codec cpudai

<*> ASoC support for sun3iw1 audiocodec machine

2.3.4.2 sys_config配置.

[sndcodec]

sndcodec_used = 0x1

;------------------------------------------------------------------------------

[cpudai]

cpudai_used = 0x1

;------------------------------------------------------------------------------

[codec]

codec_used = 0x1

headphonevol = 0x3b

maingain = 0

pa_sleep_time = 30

gpio-spk = port:PD03<1><1>

gpio_shdn = 1

sndcodec配置,即machine驅(qū)動(dòng)的相關(guān)配置。

sndcodec配置 sndcodec配置說明
sndcodec_used 是否使用sndcodec驅(qū)動(dòng)。 0 :不使用; 1 :使用

cpudai配置,即platform驅(qū)動(dòng)的相關(guān)配置。

cpudai配置 cpudai配置說明
cpudai_used 是否使用cpudai驅(qū)動(dòng)。 0 :不使用; 1 :使用

codec配置,即內(nèi)置audiocodec驅(qū)動(dòng)的相關(guān)配置。

codec配置 codec配置說明
codec_used 是否使用codec驅(qū)動(dòng)。 0 :不使用; 1 :使用
headphonevol headphone volume,可設(shè)定范圍0~0x3f, 0表示mute, 1~63表示-62dB~0dB, 1dB/step
micgain mic增益,可設(shè)定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一般設(shè)置0x4,即24dB.如果作為aec回路,則需要設(shè)置為0dB
pa_sleep_time 操作PA之后的延時(shí)時(shí)間(用來避免pop音),單位ms
gpio-spk PA使能引腳
gpio_shdn PA引腳使能方式。0:低電平有效; 1 :高電平有效

說明

如果想要正常加載audiocodec 聲卡, 需要把codec,platform,machine 驅(qū)動(dòng)都選上, 即codec_used,cpudai_used,sndcodec_used 都置為1;

headphonevol 等值會(huì)在驅(qū)動(dòng)初始化的時(shí)候設(shè)置,進(jìn)入系統(tǒng)后還可以通過amixer 工具對(duì)應(yīng)控件進(jìn)行再次修改;

注意gpio-spk 是否配置正確,是否有其他模塊復(fù)用了該gpio;

除了gpio-spk 指定pa 使能引腳外,驅(qū)動(dòng)中也會(huì)檢測(cè)gpio_num 字段,所以可以直接將gpio 號(hào)賦值gpio_num;

注意gpio_shdn,實(shí)際功放的PA 引腳是高電平有效,還是低電平有效

2.3.4.3 codec數(shù)據(jù)通路

圖2-4: R6音頻通路

R6平臺(tái)的audiocodec驅(qū)動(dòng)會(huì)在播歌的時(shí)候自動(dòng)設(shè)置相關(guān)通路,默認(rèn)audio map:

播歌

DACL --> HP_L Mux --> HPOUTL

DACR --> HP_R Mux --> HPOUTR

錄音功能則根據(jù)需要操作對(duì)應(yīng)空間使能通路:

錄制單MIC數(shù)據(jù)

MICIN --> ADC Mixer -> ADC

?

錄制內(nèi)部AEC數(shù)據(jù)(不需要外圍回采電路)

Left Output Mixer --> ADC Mixer -> ADC

Right Output Mixer --> ADC Mixer -> ADC

R6相關(guān)控件如下表:

控件名稱 功能 數(shù)值
ADC INPUT GAIN control ADC增益 0–7,表示-4.5–6dB
ADC MIC Boost AMP enMIC Boost AMP使能 0:關(guān)閉; 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設(shè)置,使能FML通路 0:關(guān)閉; 1:開啟
ADC mixer mute for FMR ADC Mixer設(shè)置,使能FMR通路 0:關(guān)閉; 1:開啟
ADC mixer mute for left output ADC Mixer設(shè)置,使能left output Mixer通路 0:關(guān)閉; 1:開啟
ADC mixer mute for linein ADC Mixer設(shè)置,使能linein通路 0:關(guān)閉; 1:開啟
ADC mixer mute for mic ADC Mixer設(shè)置,使能mic通路 0:關(guān)閉; 1:開啟
ADC mixer mute for right output ADC Mixer設(shè)置,使能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數(shù)字音量 0~63,表示0~-73.08dB,-1.16dB/step| |head phone volume |headphone音量 |0 表示mute, 1~63表示-62dB~0dB, -1dB/step|

錄音通路設(shè)置舉例:

錄音單聲道數(shù)據(jù)

通過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

內(nèi)部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協(xié)議格式配置

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

支持同時(shí)playback和record(全雙工模式)

支持8~192KHz采樣率

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

2.3.5.1 內(nèi)核配置

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驅(qū)動(dòng)的相關(guān)配置

snddaudio配置 snddaudio配置說明
snddaudio0_used 是否使用snddaudio驅(qū)動(dòng)。 0 :不使用; 1 :使用
over_sample_rate 支持128fs/192fs/256fs/384fs/512fs/768fs

daudio0配置,即daudio0 platform驅(qū)動(dòng)的相關(guān)配置

snddaudio配置 snddaudio配置說明
daudio0_used 是否使用daudio驅(qū)動(dòng)。 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標(biāo)案使用的AC101作雙聲道錄音,audiocodec則錄制回路作AEC下面對(duì)R6如何配置使 用AC101作簡(jiǎn)單介紹

2.3.6.1 內(nèi)核配置

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用于音頻數(shù)據(jù)的傳輸

TWI部分配置,可通過dts進(jìn)行配置:

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相關(guān)格式需要根據(jù)AC101 spec進(jìn)行配置

而snddaudio0中,注意codec的名稱,需要與實(shí)際AC101的dev name相匹配,而codec-dai名稱則與AC101驅(qū)動(dòng)中設(shè)置的dai name相匹配

2.3.7 標(biāo)案音頻測(cè)試方法

該章節(jié)主要介紹在標(biāo)案上進(jìn)行播歌,錄音的測(cè)試命令。

2.3.7.1 播放

如《R6 AudioCodec數(shù)據(jù)通路》章節(jié)所說,驅(qū)動(dòng)代碼中已固定配置了播放通路進(jìn)入系統(tǒng)后直接通過aplay工具進(jìn)行播放即可,如:

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

可通過下面命令調(diào)節(jié)硬件上的模擬音量:

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

2.3.7.2 錄音

標(biāo)案使用AC101進(jìn)行雙聲道錄音錄音前需要配置AC101的音頻通路,SDK默認(rèn)在啟動(dòng)時(shí)會(huì)進(jìn)行設(shè)置,相關(guān)配置腳本在:

/etc/init.d/rc.final

可以直接通過arecord命令進(jìn)行錄音:

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

2.4 R7s音頻接口

2.4.1 硬件資源

R7s包含 2 個(gè)音頻模塊,分別是內(nèi)置AudioCodec以及Daudio0。

圖2-5: R7s音頻硬件框圖

2.4.2 時(shí)鐘源

R7s中, 2 個(gè)音頻模塊的時(shí)鐘源均來自pll_audio。

pll_audio可以輸出24.576M或者22.5792M的時(shí)鐘,分別支持48k系列,44.1k系列的播放錄音。

圖2-6: R7s時(shí)鐘源

2.4.3 代碼結(jié)構(gòu)

linux-4.9/sound/soc/sunxi/ ├── sunxi-pcm.c //提供注冊(cè)platform驅(qū)動(dòng)的接口及相關(guān)函數(shù)集 ├── sunxi-pcm.h ├── sun8iw8 │ ├── sunxi_codec.c // cpudai驅(qū)動(dòng) │ ├── sunxi_codecdma.c // codec platform驅(qū)動(dòng) │ ├── sun8iw8_sndcodec_new.c // codec驅(qū)動(dòng) │ └── sunxi_sndcodec.c // codec machine驅(qū)動(dòng) ├── sunxi-daudio.c // daudio platform驅(qū)動(dòng) └── sunxi-snddaudio.c // daudio machine驅(qū)動(dòng) linux-4.9/sound/soc/soc-utils.c // daudio codec驅(qū)動(dòng)

2.4.4 Audiocodec.

硬件特性

兩路DAC

支持16bit,24bit采樣精度

支持8KHz~192KHz采樣率

兩路ADC

支持16bit,24bit采樣精度

支持8KHz~48KHz采樣率

兩路模擬輸出:

一路立體聲LINEOUT輸出(LINEOUTP, LINEOUTN)

一路立體聲headphone輸出(HPOUTL, HPOUTR)

兩路模擬輸入:MIC1,MIC2

支持同時(shí)playback和record(全雙工模式)

支持ADC的AGC,DRC功能

支持DAC的DRC功能

2.4.4.1 內(nèi)核配置

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

2.4.4.2 sys_config配置.

[codec] headphone_vol = 0x3b lineout_vol = 0x1a audio_pa_ctrl = port:PB05<1><0> adcagc_used = 0 adcdrc_used = 0 dacdrc_used = 0 adchpf_used = 0 dachpf_used = 0

codec配置 codec配置說明
headphone_vol headphone volume,可設(shè)定范圍0~0x3f, 0表示mute, 1~63表示-62dB~0dB, 1dB/step
audio_pa_ctrl PA使能引腳
adcagc_used 1:use adcagc 0:no use
adcdrc_used 1:use adcdrc 0:no use
dacdrc_used 1:use dacdrc 0:no use
adchpf_used 1:use adchpf 0:no use
dachpf_used 1:use dachpf 0:no use

2.4.4.3 codec數(shù)據(jù)通路

圖2-7: R7s音頻通路

播歌 DACL --> Left Output Mixer --> LINEOUTL DACR --> Right Output Mixer --> LINEOUTR 錄音 MIC1P --> LADC input Mixer --> ADCL MIC2P --> RADC input Mixer --> ADCR

控件名稱 功能 數(shù)值
Lineout volume lineout音量設(shè)置 0–31,表示-43.5–0dB
ADC input gain control ADC增益 0–7,表示-4.5–6dB
HP_L Mux HP_L Mux設(shè)置 0:DACL HPL Switch; 1:MIXER_L Switch
HP_R Mux HP_R Mux設(shè)置 0:DACR HPR Switch; 1:MIXER_R Switch
LADC input Mixer MIC1 boost Switch LADC input Mixer設(shè)置,使能MIC1通路 0:關(guān)閉; 1:開啟
LADC input Mixer MIC2 boost Switch LADC input Mixer設(shè)置,使能MIC2通路 0:關(guān)閉; 1:開啟
LADC input Mixer l_output mixer Switch LADC input Mixer設(shè)置,使能l_output通路 0:關(guān)閉; 1:開啟
LADC input Mixer r_output mixer Switch LADC input Mixer設(shè)置,使能r_output通路 0:關(guān)閉; 1:開啟
Left Output Mixer DACL Switch Left Output Mixer設(shè)置,使能DACL通路 0:關(guān)閉; 1:開啟
Left Output Mixer DACR Switch Left Output Mixer設(shè)置,使能DACR通路 0:關(guān)閉; 1:開啟
Left Output Mixer MIC1Booststage Switch Left Output Mixer設(shè)置,使能MIC1通路 0:關(guān)閉; 1:開啟
Left Output Mixer MIC2Booststage Switch Left Output Mixer設(shè)置,使能MIC2通路 0:關(guān)閉; 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設(shè)置 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設(shè)置,使能MIC1通路 0:關(guān)閉; 1:開啟
RADC input Mixer MIC2 boost Switch RADC input Mixer設(shè)置,使能MIC2通路 0:關(guān)閉; 1:開啟
RADC input Mixer l_output mixer Switch RADC input Mixer設(shè)置,使能l_output通路 0:關(guān)閉; 1:開啟
RADC input Mixer r_output mixer Switch RADC input Mixer設(shè)置,使能r_output通路 0:關(guān)閉; 1:開啟
Right Output Mixer DACL Switch Right Output Mixer設(shè)置,使能DACL通路 0:關(guān)閉; 1:開啟
Right Output Mixer DACR Switch Right Output Mixer設(shè)置,使能DACR通路 0:關(guān)閉; 1:開啟
Right Output Mixer MIC1Booststage Switch Right Output Mixer設(shè)置, 使能MIC1通路 0:關(guān)閉; 1:開啟
Right Output Mixer MIC2Booststage Switch Right Output Mixer設(shè)置,使能MIC2通路 0:關(guān)閉; 1:開啟
SPK_L Mux SPK_L Mux設(shè)置 0:MIXER_L Switch; 1:MIXR+MIXL
SPK_R Mux SPK_R Mux設(shè)置 0:MIXER_L Switch; 1:MIXR+MIXL
digital volume 數(shù)字音量設(shè)置 0–63,表示-73.08–0dB
headphone volume headphone音量設(shè)置 0–63,0表示mute; 1~63表示-62dB–0dB

通路設(shè)置舉例:

播放通路

通過lineout播放: amixer -D hw:audiocodec cset name='SPK_L Mux' 1 amixer -D hw:audiocodec cset name='SPK_R Mux' 1 amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -D hw:audiocodec cset name='digital volume' 6

錄音通路

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

2.4.5 Daudio.

硬件特性

一路I2S/PCM;

支持主從模式

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

支持i2s,pcm協(xié)議格式配置

支持mono和stereo模式

支持同時(shí)playback和record(全雙工模式)

支持8~192KHz采樣率

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

2.4.5.1 內(nèi)核配置

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

2.4.5.2 sys_config配置.

[tdm0] daudio_used = 0 daudio_master = 4 daudio_select = 1 audio_format = 1 signal_inversion = 1 sample_resolution = 16 slot_width_select = 16 pcm_lrck_period = 32 pcm_lrckr_period = 1 msb_lsb_first = 0 sign_extend = 0 tx_data_mode = 0 rx_data_mode = 0 ;i2s_mclk = port:PB08<2><1> i2s_bclk = port:PG11<2><1> i2s_lrclk = port:PG10<2><1> i2s_dout0 = port:PG12<2><1> i2s_dout1 = i2s_dout2 = i2s_dout3 = i2s_din = port:PG13<2><1>

tdm0配置 tdm0配置說明
daudio_master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作為slave, codec作為master2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRMmaster),一般不用3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frameslave),一般不用4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave
daudio_select 0: pcm mode; 1: i2s mode
audio_format 1: SND_SOC_DAIFMT_I2S(standard i2s format)2: SND_SOC_DAIFMT_RIGHT_J(right justfied format)3: SND_SOC_DAIFMT_LEFT_J(left justfied format)4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2ndBCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1ndBCLK rising edge after LRC rising edge)
signal_inversion 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame)2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM)3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM)4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM)
sample_resolution 采樣精度,16bit, 24bit,32bit
slot_width_select 支持8bit, 16bit, 32bit寬度
pcm_lrck_period 可配置16/32/64/128/256個(gè)bclk
pcm_lrckr_period 可配置16/32/64/128/256個(gè)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 標(biāo)案音頻測(cè)試方法

該章節(jié)主要介紹在標(biāo)案上進(jìn)行播歌,錄音的測(cè)試命令。

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

可通過下面命令調(diào)節(jié)硬件上的模擬音量:

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

2.4.6.2 錄音

表示下使用audiocodec進(jìn)行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 個(gè)音頻模塊,分別是內(nèi)置AudioCodec以及Daudio0。

圖2-8: R11音頻硬件框圖

2.5.2 時(shí)鐘源

R11中, 2 個(gè)音頻模塊的時(shí)鐘源均來自pll_audio。

pll_audio可以輸出24.576M或者22.5792M的時(shí)鐘,分別支持48k系列,44.1k系列的播放錄音。

圖2-9: R11時(shí)鐘源

2.5.3 代碼結(jié)構(gòu)

linux-3.4/sound/soc/sunxi/ ├── audiocodec │ ├── sun8iw8_sndcodec_new.c // codec 驅(qū)動(dòng) │ ├── sun8iw8_sndcodec.h │ ├── sunxi_codec.c // cpu dai驅(qū)動(dòng) │ ├── sunxi_sndcodec.c // codec machine驅(qū)動(dòng) │ ├── sunxi_codecdma.c // codec platform驅(qū)動(dòng) │ └── sunxi_codecdma.h └── daudio0 ├── snddaudio0.c // daudio codec驅(qū)動(dòng) ├── sunxi-daudio0.c // daudio cpu dai驅(qū)動(dòng) ├── sunxi-daudio0.h ├── sunxi-daudiodma0.c // daudio platform 驅(qū)動(dòng) ├── sunxi-daudiodma0.h └── sunxi-snddaudio0.c // daudio machine驅(qū)動(dòng)

2.5.4 AudioCodec

硬件特性

兩路DAC

支持16bit,24bit采樣精度

支持8KHz~192KHz采樣率

兩路ADC

支持16bit,24bit采樣精度

支持8KHz~48KHz采樣率

一路模擬輸出:一路立體聲LINEOUT輸出(LINEOUTP, LINEOUTN)

一路路模擬輸入:MIC1

支持同時(shí)playback和record(全雙工模式)

支持ADC的AGC,DRC功能

支持DAC的DRC功能

2.5.4.1 內(nèi)核配置

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

2.5.4.2 sys_config配置.

[audio0] headphone_vol = 0x3b lineout_vol = 0x1a audio_pa_ctrl = port:PB05<1><0> audio_pa_active_level = 1 adcagc_used = 0 adcdrc_used = 0 dacdrc_used = 0 adchpf_used = 0 dachpf_used = 0

audio0配置 audio0配置說明
headphone_vol headphone volume,可設(shè)定范圍0~0x3f, 0表示mute,1~63表示-62dB~0dB, 1dB/step
lineout_vol lineout volume,可設(shè)定范圍0~0x1f, 0或者 1 表示mute,2~31表示-43.5dB~0dB, 1.5dB/step
audio_pa_ctrl PA使能引腳
audio_pa_active_level 1:high level active; 0:low level active
adcagc_used 1:use adcagc 0:no use
adcdrc_used 1:use adcdrc 0:no use
dacdrc_used 1:use dacdrc 0:no use
adchpf_used 1:use adchpf 0:no use
dachpf_used 1:use dachpf 0:no use

2.5.4.3 codec數(shù)據(jù)通路

圖2-10: R11音頻通路

播歌 DACL --> Left Output Mixer --> LINEOUTL DACR --> Right Output Mixer --> LINEOUTR 錄音 MIC1P --> LADC input Mixer --> ADCL

控件名稱 功能 數(shù)值
Lineout volume lineout 音量設(shè)置0–31, 表示-43.5–0dB
ADC input gain control ADC 增益0–7, 表示-4.5–6dB
LADC input Mixer MIC1 boost Switch LADC input Mixer 設(shè)置,使能MIC 通路 0: 關(guān)閉; 1: 開啟
Left Output Mixer DACL Switch Left Output Mixer 設(shè)置,使能DACL 通路 0: 關(guān)閉; 1: 開啟
Left Output Mixer DACR Switch Left Output Mixer 設(shè)置,使能DACR 通路 0: 關(guān)閉; 1: 開啟
Left Output Mixer MIC1Booststage Switch Left Output Mixer 設(shè)置,使能MIC1 通路 0: 關(guān)閉; 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 設(shè)置,使能DACL 通路 0: 關(guān)閉; 1: 開啟
Right Output Mixer DACR Switch Right Output Mixer 設(shè)置, 使能DACR 通路 0: 關(guān)閉; 1: 開啟
Right Output Mixer MIC1Booststage Switch Right Output Mixer 設(shè)置, 使能MIC1 通路 0: 關(guān)閉; 1: 開啟
SPK_L Mux SPK_L Mux 設(shè)置0:MIXER_L Switch; 1:MIXR+MIXL
SPK_R Mux SPK_R Mux 設(shè)置0:MIXER_L Switch; 1:MIXR+MIXL
digital volume 數(shù)字音量設(shè)置0–63, 表示-73.08–0dB

通路設(shè)置舉例:

播放通路

通過lineout播放: amixer -D hw:audiocodec cset name='SPK_L Mux' 1 amixer -D hw:audiocodec cset name='SPK_R Mux' 1 amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -D hw:audiocodec cset name='digital volume' 0

錄音通路

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

2.5.5 Daudio.

硬件特性

一路I2S/PCM;

支持主從模式

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

支持i2s,pcm協(xié)議格式配置

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

支持同時(shí)playback和record(全雙工模式)

支持8~192KHz采樣率

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

2.5.5.1 內(nèi)核配置

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

2.5.5.2 sys_config配置.

[tdm0] daudio_used = 1 daudio_master = 4 daudio_select = 1 audio_format = 1 signal_inversion = 1 sample_resolution = 16 slot_width_select = 16 pcm_lrck_period = 32 pcm_lrckr_period = 1 msb_lsb_first = 0 sign_extend = 0 tx_data_mode = 0 rx_data_mode = 0 ;i2s_mclk = port:PB08<2><1> i2s_bclk = port:PG11<2><1> i2s_lrclk = port:PG10<2><1> i2s_dout0 = port:PG12<2><1> i2s_dout1 = i2s_dout2 = i2s_dout3 = i2s_din = port:PG13<2><1>

tdm0配置 tdm0配置說明
daudio_master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作為slave, codec作為master2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRMmaster),一般不用3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frameslave),一般不用4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave
daudio_select 0: pcm mode; 1: i2s mode

deaudio_format |1: SND_SOC_DAIFMT_I2S(standard i2s format)2: SND_SOC_DAIFMT_RIGHT_J(right justfied format)3: SND_SOC_DAIFMT_LEFT_J(left justfied format)4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2ndBCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge)| |signal_inversion |1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame)2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM)3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM)4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM)| | sample_resolution |采樣精度,16bit, 24bit,32bit| | slot_width_select| 支持8bit, 16bit, 32bit寬度| | pcm_lrck_period |可配置16/32/64/128/256個(gè)bclk| | pcm_lrckr_period |可配置16/32/64/128/256個(gè)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 標(biāo)案音頻測(cè)試方法

該章節(jié)主要介紹在標(biāo)案上進(jìn)行播歌,錄音的測(cè)試命令。

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

可通過下面命令調(diào)節(jié)硬件上的模擬音量:

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

2.5.6.2 錄音

表示下使用AudioCodec進(jìn)行單聲道錄音

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 個(gè)音頻模塊,分別是內(nèi)置AudioCodec,I2S0以及I2S1。

圖2-11: R16音頻硬件框圖

2.6.2 時(shí)鐘源

R16中, 3 個(gè)音頻模塊的時(shí)鐘源均來自pll_audio。

pll_audio可以輸出24.576M或者22.5792M的時(shí)鐘,分別支持48k系列,44.1k系列的播放錄音。

圖2-12: R16時(shí)鐘源

2.6.3 代碼結(jié)構(gòu)

linux-3.4/sound/soc/sunxi/ ├── audiocodec │ ├── sun8iw5_machine.c // codec machine驅(qū)動(dòng) │ ├── sun8iw5_sndcodec.c // codec驅(qū)動(dòng) │ ├── sun8iw5_sndcodec.h │ ├── sunxi_codecdma.c // codec platform驅(qū)動(dòng) │ ├── sunxi_codecdma.h │ └── sunxi_codec.c // cpu dai驅(qū)動(dòng) ├── i2s0 │ ├── sndi2s0.c // i2s codec驅(qū)動(dòng) │ ├── sunxi-i2s0dma.c // i2s platform驅(qū)動(dòng) │ ├── sunxi-i2s0dma.h │ ├── sunxi-i2s0.c // i2s cpu dai驅(qū)動(dòng) │ ├── sunxi-i2s0.h │ └── sunxi-sndi2s0.c // i2s machine驅(qū)動(dòng) └── i2s1 ├── sndi2s1.c // i2s codec驅(qū)動(dòng) ├── sunxi-i2s1dma.c // i2s platform驅(qū)動(dòng) ├── sunxi-i2s1dma.h ├── sunxi-i2s1.c // i2s cpu dai驅(qū)動(dòng) ├── sunxi-i2s1.h └── sunxi-sndi2s1.c // i2s machine驅(qū)動(dòng)

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驅(qū)動(dòng)

支持同時(shí)playback和record(全雙工模式)

2.6.4.1 內(nèi)核配置

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

2.6.4.2 sys_config配置.

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

audio0配置 audio0配置說明
audio0 是否使用audiocodec驅(qū)動(dòng)。 0 :不使用; 1 :使用
headphone_vol headphone volume,可設(shè)定范圍0~0x3f, 0表示mute,1~63表示-62dB~0dB, 1dB/step
pa_double_used 是否同時(shí)使用兩個(gè)DAC, 0 :不使用; 1 :使用
headphone_direct_used 是否使用headphone輸出, 0 :不使用; 1 :使用
main_mic_vol MIC1默認(rèn)增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step
headset_mic_vol MIC2默認(rèn)增益, 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分頻系數(shù)

2.6.4.3 codec數(shù)據(jù)通路

圖2-13: R16音頻通路

通過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相關(guān)控件如下表:

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

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

支持同時(shí)playback和record(全雙工模式)

支持8~192KHz采樣率

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

2.6.5.1 內(nèi)核配置

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

2.6.5.2 sys_config配置.

I2S0,I2S1的配置方法是一樣的,下面僅描述I2S0

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

i2s0配置 i2s0配置說明
i2s0_used 是否使用i2s驅(qū)動(dòng)。 0 :不使用; 1 :使用
i2s0_master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRMmaster), 即daudio接口作為slave, codec作為master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave
audio_format 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge)
signal_inversion 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame) 2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM) 3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM) 4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM)
over_sample_rate 支持128fs/192fs/256fs/384fs/512fs/768fs
sample_resolution 采樣精度,16bit, 24bit,32bit
word_select_size 支持16bits/20bits/24bits/32bits
pcm_sync_period 16/32/64/128/256
msb_lsb_first 0: msb first; 1: lsb first
slot_index 0: 1st slot; 1: 2nd slot; 2: 3th slot; 3:4th slot
slot_width 8: 8 clocks width; 16: 16 clocks width
frame_width 0: long frame sync; 1: short frame sync
tx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
rx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
i2s0_mclk i2s0_mclk引腳
i2s0_bclk i2s0_bclk引腳
i2s0_lrclk i2s0_lrclk引腳
i2s0_dout0 i2s0_dout引腳
i2s0_din i2s0_din引腳

2.6.6 標(biāo)案音頻測(cè)試方法

該章節(jié)主要介紹在標(biāo)案上進(jìn)行播歌,錄音的測(cè)試命令。

2.6.6.1 播放

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

可通過下面命令調(diào)節(jié)硬件上的模擬音量:

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

2.6.6.2 錄音

表示下使用audiocodec進(jìn)行單聲道錄音

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 個(gè)音頻模塊,分別是內(nèi)置AudioCodec以及Daudio0,Daudio1,Daudio2。

圖2-14: R18音頻硬件框圖

2.7.2 時(shí)鐘源

R18中, 4 個(gè)音頻模塊的時(shí)鐘源均來自pll_audio

pll_audio可以輸出24.576M或者22.5792M的時(shí)鐘,分別支持48k系列,44.1k系列的播放錄音。

圖2-15: R18時(shí)鐘源

2.7.3 代碼結(jié)構(gòu)

linux-4.4/sound/soc/sunxi/ ├── sun50iw1-codec.c // codec驅(qū)動(dòng) ├── sun50iw1-codec.h ├── sun50iw1-sndcodec.c // codec machine驅(qū)動(dòng) ├── sunxi-inter-i2s.c // codec platform驅(qū)動(dòng) ├── sunxi-daudio.c // daudio platform驅(qū)動(dòng) ├── sunxi-daudio.h ├── sunxi-snddaudio.c // daudio machine驅(qū)動(dòng) ├── sunxi-snddaudio.h ├── sunxi-pcm.c //通用文件,提供注冊(cè)platform驅(qū)動(dòng)的接口及相關(guān)函數(shù)集 ├── sunxi-pcm.h ├── sunxi_rw_func.c //通用文件,讀寫模擬/數(shù)字寄存器的接口 ├── sunxi_rw_func.h ├── spdif-utils.c // spdif codec驅(qū)動(dòng) ├── sunxi-sndspdif.c // spdif machine驅(qū)動(dòng) ├── sunxi-spdif.c // spdif platform驅(qū)動(dòng) ├── sunxi-spdif.h ├── sunxi-hdmi.c // hdmi codec驅(qū)動(dòng) └── sunxi-sndhdmi.c // hdmi machine驅(qū)動(dòng)hdmi platform模型使用的是sunxi-daudio.c linux-4.4/sound/soc/soc-utils.c // snd-soc-dummmy驅(qū)動(dòng),可用于daudio codec模型 linux-4.4/sound/soc/codecs/ac108.c // ac108 codec驅(qū)動(dòng) linux-4.4/sound/soc/codecs/tas5731.c // tas5731數(shù)字功放codec驅(qū)動(dòng)

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驅(qū)動(dòng)

支持earpiece驅(qū)動(dòng)

支持同時(shí)playback和record(全雙工模式)

支持適用于DAC的DRC功能

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

2.7.4.1 內(nèi)核配置

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

2.7.4.2 sys_config配置.

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

sndcodec配置,即machine驅(qū)動(dòng)的相關(guān)配置

sndcodec配置 sndcodec配置說明
sndcodec_used 是否使用sndcodec驅(qū)動(dòng)。 0 :不使用; 1 :使用
linein_detect linein檢測(cè)引腳
hp_detect_case jack irq level, 0:low; 1:high

codec配置,即內(nèi)置audiocodec驅(qū)動(dòng)的相關(guān)配置

codec配置 codec配置說明
codec_used 是否使用codec驅(qū)動(dòng)。0 :不使用; 1 :使用
headphonevol headphone volume,可設(shè)定范圍0~0x3f, 0表示mute, 1~63表 示-62dB~0dB, 1dB/step
spkervol spk(lineout) volume,可設(shè)定范圍0~0x1f, 0或者 1 表示mute, 2~31 表示-43.5dB~0dB, 1.5dB/step
earpiecevol earpiece volume,可設(shè)定范圍0~0x1f, 0或者 1 表示mute, 2~31表 示-43.5dB~0dB, 1.5dB/step
maingain MIC1默認(rèn)增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step
headsetmicgain MIC2默認(rèn)增益, 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分頻系數(shù)
pa_sleep_time 使能pa之前等待的時(shí)間,單位ms
dac_digital_vol DACL/DACR數(shù)字音量,0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB, 0x98表示-6dB
codec配置 codec配置說明
gpio-spk PA使能引腳

2.7.4.3 codec數(shù)據(jù)通路

圖2-16: R18音頻通路

通過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相關(guān)控件如下表:

控件名稱 功能 數(shù)值
Headphone Switch Headphone通路使能 0:關(guān)閉; 1:開啟
Linein_detect Switch Linein檢測(cè)使能 0:關(guān)閉; 1:開啟
ADC input gain control ADC增益 0–7,表示-4.5–6dB
ADC volume ADCL/ADCR音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
ADCL Mux ADCL Mux設(shè)置,只支持 0:ADC 0:ADC
ADCR Mux ADCR Mux設(shè)置,只支持 0:ADC 0:ADC
AIF1 AD0L Mixer ADCL Switch AIF1 AD0L Mixer設(shè) 置,使能ADCL通路 0:關(guān)閉; 1:開啟
AIF1 AD0L Mixer AIF1 DA0L Switch AIF1 AD0L Mixer設(shè) 置,使能AIF1 DA0L通路 0:關(guān)閉; 1:開啟
AIF1 AD0L Mixer AIF2 DACL Switch AIF1 AD0L Mixer設(shè) 置,使能AIF2 DACL通路 0:關(guān)閉; 1:開啟
AIF1 AD0L Mixer AIF2 DACR Switch AIF1 AD0L Mixer設(shè) 置,使能AIF2 DACR通路 0:關(guān)閉; 1:開啟
AIF1 AD0R Mixer ADCR Switch AIF1 AD0R Mixer設(shè) 置,使能ADCR通路 0:關(guān)閉; 1:開啟
AIF1 AD0R Mixer AIF1 DA0R Switch AIF1 AD0R Mixer設(shè) 置,使能AIF1 DA0R通路 0:關(guān)閉; 1:開啟
AIF1 AD0R Mixer AIF2 DACL Switch AIF1 AD0R Mixer設(shè) 置,使能AIF2 DACL通路 0:關(guān)閉; 1:開啟
AIF1 AD0R Mixer AIF2 DACR Switch AIF1 AD0R Mixer設(shè) 置,使能AIF2 DACR通路 0:關(guān)閉; 1:開啟
AIF1 AD1L Mixer ADCL Switch AIF1 AD1L Mixer設(shè) 置,使能ADCL通路 0:關(guān)閉; 1:開啟
AIF1 AD1L Mixer AIF2 DACL Switch AIF1 AD1L Mixer設(shè) 置,使能AIF2 DACL通路 0:關(guān)閉; 1:開啟
AIF1 AD1R Mixer ADCR Switch AIF1 AD1R Mixer設(shè) 置,使能ADCR通路 0:關(guān)閉; 1:開啟
AIF1 AD1R Mixer AIF2 DACR Switch AIF1 AD1R Mixer設(shè) 置,使能AIF2 DACR通路 0:關(guān)閉; 1:開啟
AIF1 ADC timeslot 0 mixer gain AIF1 ADC0L/ADC0R Mixer,數(shù)字增益 0:0dB; 1:-6dB;
對(duì)于ADC0L Mixer, bit0:AIF2 DACR; bit1:ADCL; bit2:AIF2 DACL; bit3:AIF2 DA0L; 對(duì)于ADC0R Mixer, bit0:AIF2 DACL; bit1:ADCR; bit2:AIF2 DACR; bit3:AIF2 DA0R;
AIF1 ADC timeslot 0 volume AIF1 ADC0L/ADC0R 音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 ADC timeslot 1 mixer gain AIF1 ADC1L/ADC1R Mixer,數(shù)字增益 0:0dB; 1:-6dB;
對(duì)于ADC1L Mixer, bit0:ADCL; bit1:AIF2 DACL; 對(duì)于ADC1R Mixer, bit0:ADCR; bit1:AIF2 DACR;
AIF1 ADC timeslot 1 volume AIF1 ADC1L/ADC1R 音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 DAC timeslot 0 volume AIF1 DAC0L/DAC0R 音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 DAC timeslot 1 volume AIF1 DAC1L/DAC1R 音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1IN0L Mux AIF1IN0L Mux設(shè)置 0:AIF1_DA0L; 1:AIF1_DA0R; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R
AIF1IN0R Mux AIF1IN0R Mux設(shè)置 0:AIF1_DA0R; 1:AIF1_DA0L; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R
AIF1IN1L Mux AIF1IN1L Mux設(shè)置 0:AIF1_DA1L; 1:AIF1_DA1R; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R
AIF1IN1R Mux AIF1IN1R Mux設(shè)置 0:AIF1_DA1R; 1:AIF1_DA1L; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R
AIF1OUT0L Mux AIF1OUT0L Mux設(shè)置 0:AIF1_AD0L; 1:AIF1_AD0R; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R
AIF1OUT0R Mux AIF1OUT0R Mux設(shè)置 0:AIF1_AD0R; 1:AIF1_AD0L; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R
AIF1OUT1L Mux AIF1OUT1L Mux設(shè)置 0:AIF1_AD1L; 1:AIF1_AD1R; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R
AIF1OUT1R Mux AIF1OUT1R Mux設(shè)置 0:AIF1_AD1R; 1:AIF1_AD1L; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R
DAC mixer gain DAC mixer增益 0:0dB; 1:-6dB;
對(duì)于DACL Mixer, bit0:ADCL; bit1:AIF2 DACL; bit2:AIF1 DAC1L; bit3:AIF1 DAC0L; 對(duì)于DACR Mixer, bit0:ADCR; bit1:AIF2 DACR; bit2:AIF1 DAC1R; bit3:AIF1 DAC0R;
DAC volume DACL/DACR音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
DACL Mixer ADCL Switch DACL Mixer設(shè)置,使能 ADCL通路 0:關(guān)閉; 1:開啟
DACL Mixer AIF1DA0L Switch DACL Mixer設(shè)置,使能 AIF1DA0L通路 0:關(guān)閉; 1:開啟
DACL Mixer AIF1DA1L Switch DACL Mixer設(shè)置,使能 AIF1DA1L通路 0:關(guān)閉; 1:開啟
DACL Mixer AIF2DACL Switch DACL Mixer設(shè)置,使能 AIF2DACL通路 0:關(guān)閉; 1:開啟
DACR Mixer ADCR Switch DACR Mixer設(shè)置,使 能ADCR通路 0:關(guān)閉; 1:開啟
DACR Mixer AIF1DA0R Switch DACR Mixer設(shè)置,使 能AIF1DA0R通路 0:關(guān)閉; 1:開啟
DACR Mixer AIF1DA1R Switch DACR Mixer設(shè)置,使 能AIF1DA1R通路 0:關(guān)閉; 1:開啟
DACR Mixer AIF2DACR Switch DACR Mixer設(shè)置,使 能AIF2DACR通路 0:關(guān)閉; 1:開啟
EAR Mux EAR Mux設(shè)置 0:DACR; 1:DACL; 2:Right Analog Mixer; 3:Left Analog Mixer
Earpiece Switch Earpiece通路使能 0:關(guān)閉; 1:開啟
External Speaker Switch 使能Headphone以及 PA 0:關(guān)閉; 1:開啟
HP_L Mux HP_L Mux設(shè)置 0:DACL ; 1:Left Output Mixer
HP_R Mux HP_R Mux設(shè)置 0:DACR ; 1:Right Output Mixer
LADC input Mixer LINEINL LADC input Mixer設(shè) 置,使能LINEINL通路 0:關(guān)閉; 1:開啟
LADC input Mixer MIC1 boost Switch LADC input Mixer設(shè) 置,使能MIC1通路 0:關(guān)閉; 1:開啟
LADC input Mixer MIC2 boost Switch LADC input Mixer設(shè) 置,使能MIC2通路 0:關(guān)閉; 1:開啟
LADC input Mixer l_output mixer Switch LADC input Mixer設(shè) 置,使能l_output mixer通路 0:關(guān)閉; 1:開啟
LADC input Mixer r_output mixer Switch LADC input Mixer設(shè) 置,使能r_output mixer通路 0:關(guān)閉; 1:開啟
LINEINL/R to L_R output mixer gain Left Output Mixer DACL Switch Left Output Mixer設(shè) 置,使能DACL通路 0:關(guān)閉; 1:開啟
Left Output Mixer DACR Switch Left Output Mixer設(shè) 置,使能DACR通路 0:關(guān)閉; 1:開啟
Left Output Mixer LINEINL Switch Left Output Mixer設(shè) 置,使能LINEINL通路 0:關(guān)閉; 1:開啟
Left Output Mixer MIC1Booststage Switch Left Output Mixer設(shè) 置,使能MIC1通路 0:關(guān)閉; 1:開啟
Left Output Mixer MIC2Booststage Switch Left Output Mixer設(shè) 置,使能MIC2通路 0:關(guān)閉; 1:開啟
MIC1 boost amplifier gain MIC1增益 0–7, 0:0dB, 1~7:24–42dB,3dB/step
MIC1_G boost stage output mixer control MIC1 to L or R output Mixer增益 0–7,表示-4.5–6dB
MIC2 BST stage to L_R outp mixer gain MIC2 to L or R output Mixer增益 0–7,表示-4.5–6dB
MIC2 SRC MIC2 SRC設(shè)置 0:MIC3; 1:MIC2
MIC2 boost AMP gain control MIC2增益 0–7, 0:0dB, 1~7:24–42dB,3dB/step
RADC input Mixer LINEINR Switch RADC input Mixer設(shè) 置,使能LINEINR通路 0:關(guān)閉; 1:開啟
RADC input Mixer MIC1 boost Switch RADC input Mixer設(shè) 置,使能MIC1通路 0:關(guān)閉; 1:開啟
RADC input Mixer MIC2 boost Switch RADC input Mixer設(shè) 置,使能MIC2通路 0:關(guān)閉; 1:開啟
RADC input Mixer l_output mixer Switch RADC input Mixer設(shè) 置,使能l_output mixer通路 0:關(guān)閉; 1:開啟
RADC input Mixer l_output Switch RADC input Mixer設(shè) 置,使能l_output mixer通路 0:關(guān)閉; 1:開啟
Right Output Mixer DACL Switch Right Output Mixer設(shè) 置,使能DACL通路 0:關(guān)閉; 1:開啟
Right Output Mixer DACR Switch Right Output Mixer設(shè) 置,使能DACR通路 0:關(guān)閉; 1:開啟
Right Output Mixer LINEINR Switch Right Output Mixer設(shè) 置,使能LINEINR通路 0:關(guān)閉; 1:開啟
Right Output Mixer MIC1Booststage Switch Right Output Mixer設(shè) 置,使能MIC1通路 0:關(guān)閉; 1:開啟
Right Output Mixer MIC2Booststage Switch Right Output Mixer設(shè) 置,使能MIC2通路 0:關(guān)閉; 1:開啟
SPK_L Mux SPK_L Mux設(shè)置 0:MIXEL Switch; 1:MIXL MIXR Switch
SPK_R Mux SPK_R Mux設(shè)置 0:MIXER Switch; 1:MIXR MIXL Switch
digital volume 數(shù)字音量設(shè)置 0–63,表示-73.08–0dB
earpiece volume earpiece音量設(shè)置 0–31,表示-43.5–0dB
headphone volume headphone音量設(shè)置 0–63,0表示mute; 1~63表 示-62dB–0dB
speaker volume speaker(lineout)音量設(shè)置 0–31,表示-43.5–0dB

2.75 Daudio.

硬件特性

? 三路I2S/PCM;

? 支持主從模式

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

支持i2s,pcm協(xié)議格式配置

支持同時(shí)playback和record(全雙工模式)

支持8~192KHz采樣率

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

2.7.5.1 內(nèi)核配置

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

2.7.5.2 sys_config配置.

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

snddaudio0配置,即daudio0 machine驅(qū)動(dòng)的相關(guān)配置

snddaudio配置 snddaudio配置說明
snddaudio0_used 是否使用snddaudio驅(qū)動(dòng)。 0 :不使用; 1 :使用

daudio0配置,即daudio0 platform驅(qū)動(dòng)的相關(guān)配置

daudio配置 daudio配置說明
daudio0_used 是否使用daudio驅(qū)動(dòng)。 0 :不使用; 1 :使用
daudio_master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作為slave, codec作為master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave
audio_format 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge)
signal_inversion 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame) 2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM) 3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM) 4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM)
slot_width_select 支持8bit, 16bit, 32bit寬度
pcm_lrck_period 一般可配置16/32/64/128/256個(gè)bclk
msb_lsb_first 0: msb first; 1: lsb first
frametype 0: short frame = 1 clock width; 1: long frame = 2 clock width
tdm_config 0: pcm mode; 1: i2s mode
tx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
daudio配置 daudio配置說明
rx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law

具體Daudio外接codec,數(shù)字功放的配置,可參考《R18外掛codec:ac108》《R18外掛數(shù)字功放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 內(nèi)核配置

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

2.7.6.2 sys_config配置.

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

spdif配置,即platform驅(qū)動(dòng)的相關(guān)配置

spdif配置 spdif配置說明
spdif_used 是否使用spdif驅(qū)動(dòng)。 0 :不使用; 1 :使用

sndspdif配置,即machine驅(qū)動(dòng)的相關(guān)配置

sndspdif配置 sndspdif配置說明
sndspdif_used 是否使用sndspdif驅(qū)動(dòng)。 0 :不使用; 1 :使用

sys_config中不需要配置codec驅(qū)動(dòng)相關(guān)信息

因?yàn)閙achine驅(qū)動(dòng)代碼中默認(rèn)配置了”spdif-utils”作為codec驅(qū)動(dòng),代碼路徑:

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

2.7.7 外掛codec:AC108

R18標(biāo)案tulip-noma搭配了MIC子板,含有兩片AC108,每片最高可錄 4 通道

下面對(duì)R18如何配置使用AC108作簡(jiǎn)單介紹

2.7.7.1 內(nèi)核配置

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用于音頻數(shù)據(jù)的傳輸

twi部分配置,可通過dts進(jìn)行配置:

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

I2S部分需要配置sys_config以及dts

sys_config部分主要涉及i2s相關(guān)格式,需要根據(jù)AC108spec進(jìn)行配置,sdk默認(rèn)daudio0 配置可正常運(yùn)行AC108

dts部分主要需要指定ASOC codec以及codec-dai驅(qū)動(dòng)的名稱,如

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

2.7.7.3 使用

進(jìn)入系統(tǒng)后,通過命令cat /proc/asound/cards列出當(dāng)前聲卡信息,如果發(fā)現(xiàn)ac108相關(guān)聲 卡,說明已經(jīng)正常加載驅(qū)動(dòng)

無需額外設(shè)置音頻通路,可直接用下面命令進(jìn)行錄音:

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

2.7.8 外掛數(shù)字功放TAS5731.

R18標(biāo)案tulip-noma搭配了一片數(shù)字功放TAS5731

下面對(duì)R18如何配置使用tas5731作簡(jiǎn)單介紹

2.7.8.1 內(nèi)核配置

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控制數(shù)字功放,而I2S1用于音頻數(shù)據(jù)的傳輸

twi部分配置,可通過dts進(jìn)行配置:

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相關(guān)格式,需要根據(jù)具體數(shù)字功放進(jìn)行配置,sdk默認(rèn)daudio1 配置可正常運(yùn)行tas5731

dts部分主要需要指定ASOC codec以及codec-dai驅(qū)動(dòng)的名稱,如

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

2.7.8.3 使用

進(jìn)入系統(tǒng)后,通過命令cat /proc/asound/cards列出當(dāng)前聲卡信息,如果發(fā)現(xiàn)tas5731相關(guān)聲 卡,說明已經(jīng)正常加載驅(qū)動(dòng)

無需額外設(shè)置音頻通路,可直接用下面命令進(jìn)行播歌:

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

2.7.9 HDMI音頻接口

R18使用I2S2將音頻數(shù)據(jù)傳輸?shù)紿DMI模塊,并且I2S2也只能用于HDMI。

2.7.9.1 內(nèi)核配置

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

2.7.9.2 sys_config配置.

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

daudio2配置,即daudio2 platform驅(qū)動(dòng)的相關(guān)配置

daudio2配置 daudio2配置說明
daudio2_used 是否使用daudio2驅(qū)動(dòng)。 0 :不使用; 1 :使用

sndhdmi配置,即sndhdmi machine驅(qū)動(dòng)的相關(guān)配置

sndhdmi配置 sndhdmi配置說明
sndhdmi_used 是否使用sndhdmi驅(qū)動(dòng)。 0 :不使用; 1 :使用

2.7.10 標(biāo)案音頻測(cè)試方法.

該章節(jié)主要介紹在標(biāo)案上進(jìn)行播歌,錄音的測(cè)試命令。

2.7.10.1播放

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

可通過下面命令調(diào)節(jié)硬件上的模擬音量:

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

2.7.10.2錄音

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

2.8 R30音頻接口

2.8.1 硬件資源

R30包含 5 個(gè)音頻模塊,分別是內(nèi)置AudioCodec,Daudio0,Daudio1,Daudio2以及Dmic

圖2-17: R30音頻硬件框圖

2.8.2 時(shí)鐘源

R30中, 5 個(gè)音頻模塊的時(shí)鐘源均來自pll_audio。

pll_audio可以輸出24.576M或者22.5792M的時(shí)鐘,分別支持48k系列,44.1k系列的播 放錄音。

圖2-18: R30時(shí)鐘源

2.8.3 代碼結(jié)構(gòu)

linux-4.9/sound/soc/sunxi/ ├── sun50iw3-codec.c // codec驅(qū)動(dòng) ├── sun50iw3-codec.h ├── sun50iw3-sndcodec.c // codec machine驅(qū)動(dòng) ├── sunxi-inter-i2s.c // codec platform驅(qū)動(dòng)├── sunxi-inter-i2s.h ├── sunxi-daudio.c // daudio platform驅(qū)動(dòng) ├── sunxi-daudio.h ├── sunxi-dmic.c // dmic platform驅(qū)動(dòng) ├── sunxi-dmic.h ├── sunxi-pcm.c //通用文件,提供注冊(cè)platform驅(qū)動(dòng)的接口及相關(guān)函數(shù)集 ├── sunxi-pcm.h ├── sunxi_rw_func.c //通用文件,讀寫模擬/數(shù)字寄存器的接口 ├── sunxi_rw_func.h ├── sunxi-snddaudio.c // daudio machine驅(qū)動(dòng) ├── sunxi-snddaudio.h ├── sunxi-snddmic.c // dmic machine驅(qū)動(dòng) └── sunxi-snddmic.h linux-4.9/sound/soc/codecs/dmic.c // dmic codec驅(qū)動(dòng) linux-4.9/sound/soc/soc-utils.c // daudio codec驅(qū)動(dòng)

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驅(qū)動(dòng)

支持earpiece驅(qū)動(dòng)

支持同時(shí)playback和record(全雙工模式)

支持適用于DAC的DRC功能

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

2.8.4.1 內(nèi)核配置

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

2.8.4.2 sys_config配置.

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

sndcodec配置,即machine驅(qū)動(dòng)的相關(guān)配置

sndcodec配置 sndcodec配置說明
sndcodec_used 是否使用sndcodec驅(qū)動(dòng)。 0 :不使用; 1 :使用
aif2fmt 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge)
aif3fmt 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge)
aif2master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master), 即aif接口選擇master模式 2: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即aif 接口選擇slave模式
hp_detect_case jack irq level, 0:low; 1:high

I2S配置,即audiocodec platform驅(qū)動(dòng)的相關(guān)配置,內(nèi)部aif接口用的I2S(與I2S0,I2S1接口無關(guān))

i2s配置 i2s配置說明
i2s_used 是否使用i2s驅(qū)動(dòng)。 0 :不使用; 1 :使用

codec配置,即內(nèi)置audiocodec驅(qū)動(dòng)的相關(guān)配置

codec配置 codec配置說明
codec_used 是否使用codec驅(qū)動(dòng)。 0 :不使用; 1 :使用
headphonevol 初始化headphone volume,可設(shè)定范圍0~0x3f,表示0~-62dB, -1dB/step
spkervol 初始化speaker volume,可設(shè)定范圍0~0x1f, 0或者 1 表示mute, 2~31表示-43.5dB~0dB, 1.5dB/step
headsetmicgain 指的是MIC2增益,可設(shè)定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一般設(shè)置0x4,即24dB
adcinputgain adc增益,可設(shè)定范圍0~0x7,表示-4.5~6dB, 1.5dB/step,一般設(shè)置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數(shù)據(jù)通路

圖2-19: R30音頻通路

通過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相關(guān)控件如下表:

控件名稱 功能 數(shù)值
Headphone Switch Headphone通路使能 0:關(guān)閉; 1:開啟
Lineout Switch Lineout通路使能 0:關(guān)閉; 1:開啟
ADC input gain control ADC增益 0–7,表示-4.5–6dB
ADC volume ADCL/ADCR音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 AD0L Mixer ADCL Switch AIF1 AD0L Mixer設(shè) 置,使能ADCL通路 0:關(guān)閉; 1:開啟
AIF1 AD0L Mixer AIF1 DA0L Switch AIF1 AD0L Mixer設(shè) 置,使能AIF1 DA0L通 0:關(guān)閉; 1:開啟
AIF1 AD0L Mixer AIF2 DACL Switch AIF1 AD0L Mixer設(shè) 置,使能AIF2 DACL通 0:關(guān)閉; 1:開啟
AIF1 AD0L Mixer AIF2 DACR Switch AIF1 AD0L Mixer設(shè) 置,使能AIF2 DACR通 0:關(guān)閉; 1:開啟
AIF1 AD0R Mixer ADCR Switch AIF1 AD0R Mixer設(shè) 置,使能ADCR通路 0:關(guān)閉; 1:開啟
AIF1 AD0R Mixer AIF1 DA0R Switch AIF1 AD0R Mixer設(shè) 置,使能AIF1 DA0R通 0:關(guān)閉; 1:開啟
AIF1 AD0R Mixer AIF2 DACL Switch AIF1 AD0R Mixer設(shè) 置,使能AIF2 DACL通 0:關(guān)閉; 1:開啟
AIF1 AD0R Mixer AIF2 DACR Switch AIF1 AD0R Mixer設(shè) 置,使能AIF2 DACR通 0:關(guān)閉; 1:開啟
AIF1 AD1L Mixer ADCL Switch AIF1 AD1L Mixer設(shè) 置,使能ADCL通路 0:關(guān)閉; 1:開啟
AIF1 AD1L Mixer AIF2 DACL Switch AIF1 AD1L Mixer設(shè) 置,使能AIF2 DACL通 0:關(guān)閉; 1:開啟
AIF1 AD1R Mixer ADCR Switch AIF1 AD1R Mixer設(shè) 置,使能ADCR通路 0:關(guān)閉; 1:開啟
AIF1 AD1R Mixer AIF2 DACR Switch AIF1 AD1R Mixer設(shè) 置,使能AIF2 DACR通 0:關(guān)閉; 1:開啟
AIF1 ADC timeslot 0 mixer gain AIF1 ADC0L/ADC0R Mixer,數(shù)字增益 0:0dB; 1:-6dB;
對(duì)于ADC0L Mixer, bit0:AIF2 DACR; bit1:ADCL; bit2:AIF2 DACL; bit3:AIF2 DA0L; 對(duì)于ADC0R Mixer, bit0:AIF2 DACL; bit1:ADCR; bit2:AIF2 DACR; bit3:AIF2 DA0R;
AIF1 ADC timeslot 0 volume AIF1 ADC0L/ADC0R 音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 ADC timeslot 1 mixer gain AIF1 ADC1L/ADC1R Mixer,數(shù)字增益 0:0dB; 1:-6dB;
對(duì)于ADC1L Mixer, bit0:ADCL; bit1:AIF2 DACL; 對(duì)于ADC1R Mixer, bit0:ADCR; bit1:AIF2 DACR;
AIF1 ADC timeslot 1 volume AIF1 ADC1L/ADC1R 音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 DAC timeslot 0 volume AIF1 DAC0L/DAC0R 音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1 DAC timeslot 1 volume AIF1 DAC1L/DAC1R 音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
AIF1IN0L Mux AIF1IN0L Mux設(shè)置 0:AIF1_DA0L; 1:AIF1_DA0R; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R
AIF1IN0R Mux AIF1IN0R Mux設(shè)置 0:AIF1_DA0R; 1:AIF1_DA0L; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R
AIF1IN1L Mux AIF1IN1L Mux設(shè)置 0:AIF1_DA1L; 1:AIF1_DA1R; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R
AIF1IN1R Mux AIF1IN1R Mux設(shè)置 0:AIF1_DA1R; 1:AIF1_DA1L; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R
AIF1OUT0L Mux AIF1OUT0L Mux設(shè)置 0:AIF1_AD0L; 1:AIF1_AD0R; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R
AIF1OUT0R Mux AIF1OUT0R Mux設(shè)置 0:AIF1_AD0R; 1:AIF1_AD0L; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R
AIF1OUT1L Mux AIF1OUT1L Mux設(shè)置 0:AIF1_AD1L; 1:AIF1_AD1R; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R
AIF1OUT1R Mux AIF1OUT1R Mux設(shè)置 0:AIF1_AD1R; 1:AIF1_AD1L; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R
DAC mixer gain DAC mixer增益 0:0dB; 1:-6dB;
對(duì)于DACL Mixer, bit0:ADCL; bit1:AIF2 DACL; bit2:AIF1 DAC1L; bit3:AIF1 DAC0L; 對(duì)于DACR Mixer, bit0:ADCR; bit1:AIF2 DACR; bit2:AIF1 DAC1R; bit3:AIF1 DAC0R;
DAC volume DACL/DACR音量設(shè)置 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB
DACL Mixer ADCL Switch DACL Mixer設(shè)置,使能 ADCL通路 0:關(guān)閉; 1:開啟
DACL Mixer AIF1DA0L Switch DACL Mixer設(shè)置,使能 AIF1DA0L通路 0:關(guān)閉; 1:開啟
DACL Mixer AIF1DA1L Switch DACL Mixer設(shè)置,使能 AIF1DA1L通路 0:關(guān)閉; 1:開啟
DACL Mixer AIF2DACL Switch DACL Mixer設(shè)置,使能 AIF2DACL通路 0:關(guān)閉; 1:開啟
DACR Mixer ADCR Switch DACR Mixer設(shè)置,使 能ADCR通路 0:關(guān)閉; 1:開啟
DACR Mixer AIF1DA0R Switch DACR Mixer設(shè)置,使 能AIF1DA0R通路 0:關(guān)閉; 1:開啟
DACR Mixer AIF1DA1R Switch DACR Mixer設(shè)置,使 能AIF1DA1R通路 0:關(guān)閉; 1:開啟
DACR Mixer AIF2DACR Switch DACR Mixer設(shè)置,使 能AIF2DACR通路 0:關(guān)閉; 1:開啟
External Speaker Switch 使能Headphone以及 PA 0:關(guān)閉; 1:開啟
HP_L Mux HP_L Mux設(shè)置 0:DACL ; 1:Left Output Mixer
HP_R Mux HP_R Mux設(shè)置 0:DACR ; 1:Right Output Mixer
LADC input Mixer LINEINL LADC input Mixer設(shè) 置,使能LINEINL通路 0:關(guān)閉; 1:開啟
LADC input Mixer MIC1 boost Switch LADC input Mixer設(shè) 置,使能MIC1通路 0:關(guān)閉; 1:開啟
LADC input Mixer MIC2 boost Switch LADC input Mixer設(shè) 置,使能MIC2通路 0:關(guān)閉; 1:開啟
LADC input Mixer l_output mixer Switch LADC input Mixer設(shè) 置,使能l_output mixer通路 0:關(guān)閉; 1:開啟
LADC input Mixer r_output mixer Switch LADC input Mixer設(shè) 置,使能r_output mixer通路 0:關(guān)閉; 1:開啟
LINEINL/R to L_R output mixer gain LINEINL/R to L or R output Mixer增益 0–7,表示-4.5–6dB
LINEOUTL Mux LINEOUTL Mux設(shè)置 0:left output mixer; 1:left+right output mixer
LINEOUTR Mux LINEOUTR Mux設(shè)置 0:right output mixer; 1:left+right output mixer
Left Output Mixer DACL Switch Left Output Mixer設(shè) 置,使能DACL通路 0:關(guān)閉; 1:開啟
Left Output Mixer DACR Switch Left Output Mixer設(shè) 置,使能DACR通路 0:關(guān)閉; 1:開啟
Left Output Mixer LINEINL Switch Left Output Mixer設(shè) 置,使能LINEINL通路 0:關(guān)閉; 1:開啟
Left Output Mixer MIC1Booststage Switch Left Output Mixer設(shè) 置,使能MIC1通路 0:關(guān)閉; 1:開啟
Left Output Mixer MIC2Booststage Switch Left Output Mixer設(shè) 置,使能MIC2通路 0:關(guān)閉; 1:開啟
MIC1 boost AMP gain control MIC1增益 0–7, 0:0dB, 1~7:24–42dB,3dB/step
MIC1_G boost stage output mixer control MIC1 to L or R output Mixer增益 0–7,表示-4.5–6dB
MIC2 BST stage to L_R outp mixer gain MIC2 to L or R output Mixer增益 0–7,表示-4.5–6dB
MIC2 SRC MIC2 SRC設(shè)置 0:MIC3; 1:MIC2
MIC2 boost AMP gain control MIC2增益 0–7, 0:0dB, 1~7:24–42dB,3dB/step
RADC input Mixer LINEINR Switch RADC input Mixer設(shè) 置,使能LINEINR通路 0:關(guān)閉; 1:開啟
RADC input Mixer MIC1 boost Switch RADC input Mixer設(shè) 置,使能MIC1通路 0:關(guān)閉; 1:開啟
RADC input Mixer MIC2 boost Switch RADC input Mixer設(shè) 置,使能MIC2通路 0:關(guān)閉; 1:開啟
RADC input Mixer l_output mixer Switch RADC input Mixer設(shè) 置,使能l_output mixer通路 0:關(guān)閉; 1:開啟
RADC input Mixer l_output Switch RADC input Mixer設(shè) 置,使能l_output mixer通路 0:關(guān)閉; 1:開啟
Right Output Mixer DACL Switch Right Output Mixer設(shè) 置,使能DACL通路 0:關(guān)閉; 1:開啟
Right Output Mixer DACR Switch Right Output Mixer設(shè) 置,使能DACR通路 0:關(guān)閉; 1:開啟
Right Output Mixer LINEINR Switch Right Output Mixer設(shè) 置,使能LINEINR通路 0:關(guān)閉; 1:開啟
Right Output Mixer MIC1Booststage Switch Right Output Mixer設(shè) 置,使能MIC1通路 0:關(guān)閉; 1:開啟
Right Output Mixer MIC2Booststage Switch Right Output Mixer設(shè) 置,使能MIC2通路 0:關(guān)閉; 1:開啟
SPK_L Mux SPK_L Mux設(shè)置 0:MIXEL Switch; 1:MIXL MIXR Switch
SPK_R Mux SPK_R Mux設(shè)置 0:MIXER Switch; 1:MIXR MIXL Switch
digital volume 數(shù)字音量設(shè)置 0–63,表示-73.08–0dB
headphone volume headphone音量設(shè)置 0–63,0表示mute; 1~63表 示-62dB–0dB
lineout volume lineout音量設(shè)置 0–31,表示-43.5–0dB
speaker volume speaker(lineout)音量 設(shè)置 0–31,表示-43.5–0dB

2.8.5 Daudio.

硬件特性

? 三路I2S/PCM;

? 支持主從模式

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

支持i2s,pcm協(xié)議格式配置

支持同時(shí)playback和record(全雙工模式)

支持8~192KHz采樣率

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

2.8.5.1 內(nèi)核配置

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

2.8.5.2 sys_config配置.

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

snddaudio0配置,即daudio0 machine驅(qū)動(dòng)的相關(guān)配置

snddaudio配置 snddaudio配置說明
snddaudio0_used 是否使用snddaudio驅(qū)動(dòng)。 0 :不使用; 1 :使用

daudio0配置,即daudio0 platform驅(qū)動(dòng)的相關(guān)配置

daudio配置 daudio配置說明
daudio0_used 是否使用daudio驅(qū)動(dòng)。 0 :不使用; 1 :使用
daudio_master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作為slave, codec作為master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave
audio_format 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge)
signal_inversion 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame) 2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM) 3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM) 4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM)
slot_width_select 支持8bit, 16bit, 32bit寬度
pcm_lrck_period 一般可配置16/32/64/128/256個(gè)bclk
msb_lsb_first 0: msb first; 1: lsb first
frametype 0: short frame = 1 clock width; 1: long frame = 2 clock width
tdm_config 0: pcm mode; 1: i2s mode
daudio配置 daudio配置說明
tx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
rx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law

2.8.6 DMIC

硬件特性

? 支持 8 路輸入

支持8~48KHz采樣率

支持16/24bit采樣精度

2.8.6.1 內(nèi)核配置

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

2.8.6.2 sys_config配置.

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

dmic配置,即platform驅(qū)動(dòng)的相關(guān)配置

dmic配置 dmic配置說明
dmic_used 是否使用dmic驅(qū)動(dòng)。 0 :不使用; 1 :使用

snddmic配置,即machine驅(qū)動(dòng)的相關(guān)配置

snddmic配置 snddmic配置說明
snddmic_used 是否使用snddmic驅(qū)動(dòng)。 0 :不使用; 1 :使用

2.8.7 標(biāo)案音頻測(cè)試方法

該章節(jié)主要介紹在標(biāo)案上進(jìn)行播歌,錄音的測(cè)試命令。

2.8.7.1 播放

通過SPKL/R播歌,例如喇叭播歌 amixer -Dhw:audiocodec cset name='AIF1IN0L Mux' 'AIF1_DA0L' amixer -Dhw:audiocodec cset name='AIF1IN0R Mux' 'AIF1_DA0R' amixer -Dhw:audiocodec cset name='DACL Mixer AIF1DA0L Switch' 1 amixer -Dhw:audiocodec cset name='DACR Mixer AIF1DA0R Switch' 1 amixer -Dhw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -Dhw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -Dhw:audiocodec cset name='SPK_R Mux' 'MIXER_Switch' amixer -Dhw:audiocodec cset name='SPK_L Mux' 'MIXEL_Switch' amixer -Dhw:audiocodec cset name='External Speaker Switch' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav 可通過下面命令調(diào)節(jié)硬件上的模擬音量: amixer -Dhw:audiocodec cset name='speaker volume' 28通過LINEOUTL/R播歌 amixer -Dhw:audiocodec cset name='AIF1IN0L Mux' 'AIF1_DA0L' amixer -Dhw:audiocodec cset name='AIF1IN0R Mux' 'AIF1_DA0R' amixer -Dhw:audiocodec cset name='DACL Mixer AIF1DA0L Switch' 1 amixer -Dhw:audiocodec cset name='DACR Mixer AIF1DA0R Switch' 1 amixer -Dhw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -Dhw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -Dhw:audiocodec cset name='LINEOUTL Mux' 'LOMIX' amixer -Dhw:audiocodec cset name='LINEOUTR Mux' 'ROMIX' amixer -Dhw:audiocodec cset name='Lineout Switch' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav 可通過下面命令調(diào)節(jié)硬件上的模擬音量: amixer -Dhw:audiocodec cset name='lineout volume' 28通過HPOUTL/R播歌,例如耳機(jī) 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可通過下面命令調(diào)節(jié)硬件上的模擬音量:amixer -Dhw:audiocodec cset name='headphone volume' 60

2.8.7.2 錄音

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

2.9 R328音頻接口.

2.9.1 硬件資源

R328音頻接口豐富,包含 6 個(gè)音頻模塊,分別是內(nèi)置AudioCodec,Daudio0,Daudio1,Daudio2, Dmic,Spdif。

另外還支持MAD作語音喚醒檢測(cè)(詳細(xì)請(qǐng)看R328 MAD章節(jié))。

圖2-34: R328音頻硬件框圖

2.9.2 時(shí)鐘源.

R328中, 6 個(gè)音頻模塊的時(shí)鐘源均來自pll_audio。

pll_audio可以輸出24.576M或者22.5792M的時(shí)鐘,分別支持48k系列,44.1k系列的播 放錄音。

圖2-35: R328時(shí)鐘源

2.9.3 代碼結(jié)構(gòu)

linux-4.9/sound/soc/sunxi/ ├── spdif-utils.c // spdif codec驅(qū)動(dòng) ├── sun8iw18-codec.c // codec驅(qū)動(dòng) ├── sun8iw18-codec.h ├── sun8iw18-sndcodec.c // codec machine驅(qū)動(dòng) ├── sunxi-cpudai.c // codec platform驅(qū)動(dòng) ├── sunxi-daudio.c // daudio platform驅(qū)動(dòng) ├── sunxi-daudio.h ├── sunxi-dmic.c // dmic platform驅(qū)動(dòng) ├── sunxi-dmic.h ├── sunxi-mad.c //提供MAD相關(guān)功能接口 ├── sunxi-mad.h ├── sunxi-pcm.c //通用文件,提供注冊(cè)platform驅(qū)動(dòng)的接口及相關(guān)函數(shù)集 ├── sunxi-pcm.h ├── sunxi_rw_func.c //通用文件,讀寫模擬/數(shù)字寄存器的接口 ├── sunxi_rw_func.h ├── sunxi-snddaudio.c // daudio machine驅(qū)動(dòng) ├── sunxi-snddaudio.h ├── sunxi-snddmic.c // dmic machine驅(qū)動(dòng) ├── sunxi-snddmic.h ├── sunxi-sndspdif.c // spdif machine驅(qū)動(dòng) ├── sunxi-spdif.c // spdif platform驅(qū)動(dòng) └── sunxi-spdif.h linux-4.9/sound/soc/codecs/dmic.c // dmic codec驅(qū)動(dòng) linux-4.9/sound/soc/soc-utils.c // daudio codec驅(qū)動(dòng)

2.9.4 AudioCodec

硬件特性

? 一路DAC

支持16bit,24bit采樣精度

支持8KHz~192KHz采樣率

三路ADC

支持16bit,24bit采樣精度

支持8KHz~48KHz采樣率

一路模擬輸出:一路差分輸出lineoutP/N,支持單端lineout輸出

三路模擬輸入:MIC1,MIC2,MIC3

支持同時(shí)playback和record(全雙工模式)

DAC及ADC均支持 5 段DRC

DAC FIFO長(zhǎng)度12824bits, ADC FIFO長(zhǎng)度12824bits

2.9.4.1內(nèi)核配置

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

2.9.4.2 sys_config配置

[sndcodec] sndcodec_used = 0x1 ;------------------------------------------------------------------------------ [cpudai] cpudai_used = 0x1 ;------------------------------------------------------------------------------- [codec] codec_used = 0x1 digital_vol = 0x0 lineout_vol =0x1a mic1gain = 0x4 mic2gain = 0x4 mic3gain = 0x0 adcgain = 0x3 adcagc_cfg = 0x0 adcdrc_cfg = 0x0 adchpf_cfg = 0x0dacdrc_cfg = 0x0 dachpf_cfg = 0x0 pa_ctl_level = 0x1 pa_msleep_time = 160 gpio-spk = port:PH9<1><1><1><1>

sndcodec配置,即machine驅(qū)動(dòng)的相關(guān)配置

sndcodec配置 sndcodec配置說明
sndcodec_used 是否使用sndcodec驅(qū)動(dòng)。 0 :不使用; 1 :使用

cpudai配置,即platform驅(qū)動(dòng)的相關(guān)配置

cpudai配置 cpudai配置說明
cpudai_used 是否使用cpudai驅(qū)動(dòng)。 0 :不使用; 1 :使用

codec配置,即內(nèi)置audiocodec驅(qū)動(dòng)的相關(guān)配置

codec配置 codec配置說明
codec_used 是否使用codec驅(qū)動(dòng)。 0 :不使用; 1 :使用
digital_vol 初始化digital volume,可設(shè)定范圍0~0x3f,表示0~-73.08dB, -1.16dB/step
lineout_vol lineout volume,可設(shè)定范圍0~0x1f,表示-43.5dB~0dB, 1.5dB/step
mic1gain mic1增益,可設(shè)定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般設(shè)置0x4,即24dB
mic2gain mic2增益,可設(shè)定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般設(shè)置0x4,即24dB
mic3gain mic3增益,可設(shè)定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般設(shè)置0x4,即24dB.如果作為aec回路,則需要設(shè)置為0dB
adcgain adc增益,可設(shè)定范圍0~0x7,表示-4.5~6dB, 1.5dB/step,一般設(shè)置 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之后的延時(shí)時(shí)間(用來避免pop音)
gpio-spk PA使能引腳

說明

如果想要正常加載 audiocodec 聲卡,需要把 codec,platform,machine 驅(qū)動(dòng)都選上,即 codec_used,cpudai_used,sndcodec_used 都置為 1 ;

digital_vol,lineout_vol 等值會(huì)在驅(qū)動(dòng)初始化的時(shí)候設(shè)置,進(jìn)入系統(tǒng)后還可以通過 amixer 工具對(duì)應(yīng)控件進(jìn)行再次修改;

注意 gpio-spk 是否配置正確,是否有其他模塊復(fù)用了該 gpio;

注意 pa_ctl_level ,實(shí)際功放的 PA 引腳是高電平有效,還是低電平有效

2.9.4.3 codec數(shù)據(jù)通路

圖2-36: R328音頻通路

播歌 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所有控件如下表:

控件名稱 功能 數(shù)值
Lineout Switch 使能lineout 0:關(guān)閉; 1:開啟
ADC gain volume ADC增益 0–7,表示-4.5–6dB,具體計(jì) 算請(qǐng)看注釋 1
External Speaker Switch 使能lineout以及PA 0:關(guān)閉; 1:開啟
LINEOUT volume lineout音量設(shè)置 0–31,表示-43.5–0dB,具體 計(jì)算請(qǐng)看注釋 2
Left Input Mixer DACL Switch Left Input Mixer設(shè)置,使 能DACL通路 0:關(guān)閉; 1:開啟
Left Input Mixer MIC1 Boost Switch Left Input Mixer設(shè)置,使 能MIC1通路 0:關(guān)閉; 1:開啟
Left Input Mixer MIC2 Boost Switch Left Input Mixer設(shè)置,使 能MIC2通路 0:關(guān)閉; 1:開啟
Left Input Mixer MIC3 Boost Switch Left Input Mixer設(shè)置,使 能MIC3通路 0:關(guān)閉; 1:開啟
Left LINEOUT Mux Left Lineout Mux設(shè)置 0:DACL; 1:NULL(空)
Right LINEOUT Mux Right Lineout Mux設(shè)置 0:NULL(空); 1:DACL
MIC1 gain volume MIC1 Boost AMP gain 0–7, 0:0dB, 1~7:15–33dB, 具體計(jì)算請(qǐng)看注釋 3
MIC2 gain volume MIC2 Boost AMP gain 與MIC1 gain volume設(shè)置 一樣
MIC3 gain volume MIC3 Boost AMP gain 與MIC1 gain volume設(shè)置 一樣
Right Input Mixer DACL Switch Right Input Mixer設(shè)置, 使能DACL通路 0:關(guān)閉; 1:開啟
Right Input Mixer MIC1 Boost Switch Right Input Mixer設(shè)置, 使能MIC1通路 0:關(guān)閉; 1:開啟
Right Input Mixer MIC2 Boost Switch Right Input Mixer設(shè)置, 使能MIC2通路 0:關(guān)閉; 1:開啟
Right Input Mixer MIC3 Boost Switch Right Input Mixer設(shè)置, 使能MIC3通路 0:關(guān)閉; 1:開啟
Xadc Input Mixer DACL Switch Xadc Input Mixer設(shè)置,使 能DACL通路 0:關(guān)閉; 1:開啟
Xadc Input Mixer MIC1 Boost Switch Xadc Input Mixer設(shè)置,使 能MIC1通路 0:關(guān)閉; 1:開啟
Xadc Input Mixer MIC2 Boost Switch Xadc Input Mixer設(shè)置,使 能MIC2通路 0:關(guān)閉; 1:開啟
Xadc Input Mixer MIC3 Boost Switch Xadc Input Mixer設(shè)置,使 能MIC3通路 0:關(guān)閉; 1:開啟
codec hub mode 使能audiocodec hub功能 0:關(guān)閉; 1:開啟
digital volume 數(shù)字端音量設(shè)置 0–63,表示-73.08–0dB,具 體計(jì)算請(qǐng)看注釋 4

? 注釋 1

ADC gain volume計(jì)算方法: 應(yīng)用層可設(shè)置范圍:0~ 7 對(duì)應(yīng)實(shí)際硬件設(shè)置的范圍:-4.5~6dB, step: 1.5dB 換算方法:-4.5+(n*1.5) 舉例,設(shè)置0dB: -4.5+(n*1.5) = 0 n = 3 所以應(yīng)用層上輸入下面命令設(shè)置為0dB: amixer -D hw:audiocodec cset name='ADC gain volume' 3

? 注釋 2

LINEOUT volume計(jì)算方法: 應(yīng)用層可設(shè)置范圍: 0 ~31 (設(shè)置為 0 或者 1 時(shí),就是mute) 對(duì)應(yīng)實(shí)際硬件設(shè)置的范圍:-43.5~0dB, step:1.5dB 換算方法:-43.5+((n-2)*1.5) 舉例 1 ,設(shè)置0dB: -43.5+((n-2)*1.5) = 0 n = 31 所以應(yīng)用層上輸入下面命令設(shè)置為0dB: amixer -D hw:audiocodec cset name='LINEOUT volume' 31 舉例 2 ,設(shè)置-6dB: -43.5+((n-2)*1.5) = -6 n = 27 所以應(yīng)用層上輸入下面命令設(shè)置為-6dB: amixer -D hw:audiocodec cset name='LINEOUT volume' 27

? 注釋 3

MIC1 gain volume計(jì)算方法: 應(yīng)用層可設(shè)置范圍: 0 ~7 (設(shè)置為 0 時(shí),就是0dB) 對(duì)應(yīng)實(shí)際硬件設(shè)置的范圍:0dB或者15~33dB, step:3dB 換算方法:15+((n-1)*3) 舉例,設(shè)置24dB: 15+((n-1)*3) = 24 n = 4 所以應(yīng)用層上輸入下面命令設(shè)置為24dB: amixer -D hw:audiocodec cset name='MIC1 gain volume' 4

? 注釋 4

digital volume計(jì)算方法: 應(yīng)用層可設(shè)置范圍: 0 ~ 63 對(duì)應(yīng)實(shí)際硬件設(shè)置的范圍:-73.08~0dB, step:1.16dB 換算方法:-73.08+(n*1.16) 舉例 1 ,設(shè)置0dB: -73.08+(n*1.16) = 0 n = 63 所以應(yīng)用層上輸入下面命令設(shè)置為0dB: amixer -D hw:audiocodec cset name='digital volume' 63 舉例 2 ,設(shè)置-5.8dB: -73.08+(n*1.16) = -5.8n = 58 所以應(yīng)用層上輸入下面命令設(shè)置為-5.8dB: amixer -D hw:audiocodec cset name='digital volume' 58

通路設(shè)置舉例:

播放通路

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

錄音通路

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

常用AEC通路

有兩種AEC回路方式,具體看硬件如何設(shè)計(jì) 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)內(nèi)部AEC(可省去外部AEC電路) MIC1,MIC2錄音;MIC3作為AEC,使能內(nèi)部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,可用于藍(lán)牙通話,語音采集,數(shù)字功放;

? 支持主從模式

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

支持i2s,pcm協(xié)議格式配置

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

支持同時(shí)playback和record(全雙工模式)

支持8~192KHz采樣率

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

支持 3 路MCLK輸出

2.14.5.1內(nèi)核配置

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

2.14.5.2 sys_config配置

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

snddaudio0配置,即daudio0 machine驅(qū)動(dòng)的相關(guān)配置

snddaudio配置 snddaudio配置說明
snddaudio0_used 是否使用snddaudio驅(qū)動(dòng)。 0 :不使用; 1 :使用
daudio_master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作為slave, codec作為master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave
audio_format 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge)
signal_inversion 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame) 2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM) 3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM) 4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM)

daudio0配置,即daudio0 platform驅(qū)動(dòng)的相關(guān)配置

daudio配置 daudio配置說明
daudio0_used 是否使用daudio驅(qū)動(dòng)。 0 :不使用; 1 :使用
slot_width_select 支持8bit, 16bit, 32bit寬度
pcm_lrck_period 一般可配置16/32/64/128/256個(gè)bclk
msb_lsb_first 0: msb first; 1: lsb first
sign_extend 0: zero pending; 1: sign extend
frametype 0: short frame = 1 clock width; 1: long frame = 2 clock width
mclk_div 0: not output(normal setting this); 1/2/4/6/8/12/16/24/32/48/64/96/128/176/192:給外部 codec提供時(shí)鐘,頻率是pll_audio/mclk_div
tdm_config 0: pcm mode; 1: i2s mode
tx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
rx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law

注意事項(xiàng):

daudio machine驅(qū)動(dòng)的配置(snddaudio),一般來說還需要配置codec name以及codec dai name

例如daudio0使用了AC108作為外掛codec:

  1. [snddaudio0] snddaudio0_used = 1 sunxi,snddaudio-codec = "ac108.1-003b"; sunxi,snddaudio-codec-dai = "ac108-pcm0"; daudio_master = 4 audio_format = 1 signal_inversion = 2 [daudio0] daudio0_used = 1 slot_width_select = 32 pcm_lrck_period = 128 msb_lsb_first = 0 sign_extend = 0 frametype = 0 mclk_div = 1 tdm_config = 1 tx_data_mode = 0 rx_data_mode = 0 注意名稱需要與codec驅(qū)動(dòng)中配置的名稱一致,如ac108驅(qū)動(dòng),路徑: linux-4.9/sound/soc/codecs/ac108.c 代碼中snd_soc_register_codec注冊(cè)codec驅(qū)動(dòng),其中codec device name為ac108.1-003b, codec dai name為ac108-pcm0

例如daudio2與bluetooth模組相連(沒有實(shí)際的codec驅(qū)動(dòng)),那么這時(shí)候codec

name, codec dai name需要配置為dummy codec,可以如下配置: [snddaudio2] snddaudio2_used = 1 sunxi,snddaudio-codec = "snd-soc-dummy" sunxi,snddaudio-codec-dai = "snd-soc-dummy-dai" daudio_master = 1 audio_format = 5 signal_inversion = 2 因?yàn)轵?qū)動(dòng)中解析snddaudio-codec等字段時(shí),判斷出錯(cuò)的時(shí)候則使用默認(rèn)codec"snd-soc-dummy", 所以如果sunxi,snddaudio-codec和sunxi,snddaudio-codec-dai不配置,或者配置為空的時(shí)候, 則默認(rèn)使用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內(nèi)核配置

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

2.14.6.2 sys_config配置

配置如下:

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

dmic配置,即platform驅(qū)動(dòng)的相關(guān)配置

dmic配置 dmic配置說明 dmic_used 是否使用dmic驅(qū)動(dòng)。 0 :不使用; 1 :使用

snddmic配置,即machine驅(qū)動(dòng)的相關(guān)配置

snddmic配置 snddmic配置說明 snddmic_used 是否使用snddmic驅(qū)動(dòng)。 0 :不使用; 1 :使用

sys_config中不需要配置codec驅(qū)動(dòng)相關(guān)信息

因?yàn)閙achine驅(qū)動(dòng)代碼中默認(rèn)配置了”dmic-codec”作為codec驅(qū)動(dòng),代碼路徑:

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

2.14.7 SPDIF

硬件特性

? 支持S/PDIF_OUT和S/PDIF_IN

支持mono和stereo模式(mono模式下由硬件自動(dòng)拓展為stereo)

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

輸入支持44.1KHz,48KHz采樣率

輸出和輸入支持16bit,24bit采樣精度

2.14.7.1內(nèi)核配置

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

2.14.7.2 sys_config配置

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

spdif配置,即platform驅(qū)動(dòng)的相關(guān)配置

spdif配置 spdif配置說明| spdif_used 是否使用spdif驅(qū)動(dòng)。 0 :不使用; 1 :使用|

sndspdif配置,即machine驅(qū)動(dòng)的相關(guān)配置

sndspdif配置sndspdif配置說明

sndspdif_used是否使用sndspdif驅(qū)動(dòng)。 0 :不使用; 1 :使用

sys_config中不需要配置codec驅(qū)動(dòng)相關(guān)信息

因?yàn)閙achine驅(qū)動(dòng)代碼中默認(rèn)配置了”spdif-utils”作為codec驅(qū)動(dòng),代碼路徑:

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

2.14.8 MAD

硬件特性

支持三路I2S,一路DMIC PCM音頻傳輸接口,時(shí)分復(fù)用,固定16bit

支持16KHz,48KHz采樣率

支持基于能量識(shí)別的語音檢測(cè)模塊LPSD

支持一塊128KB的SRAM,可用于保存音頻數(shù)據(jù)

2.14.8.1內(nèi)核配置

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

2.14.8.2 sys_config配置

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

mad配置 mad配置說明
mad_used 是否使用mad驅(qū)動(dòng)。 0 :不使用; 1 :使用

2.14.8.3 mixer控件說明

mad綁定到I2S

控件名稱 功能 數(shù)值
daudio bind mad Function 是否綁定MAD功能 0:不綁定; 1:綁定
lpsd channel sel Function 選擇作為能量喚醒的通道 0:通道0; 1:通道1;
如此類推,最高可指定通道7
mad_standby channel sel Function 設(shè)定休眠時(shí)mad錄音通 道數(shù) 0:表示使用實(shí)際錄音通道數(shù);

mad綁定到dmic

控件名稱 功能 數(shù)值
dmic bind mad Function 是否綁定MAD功能 0:不綁定; 1:綁定
lpsd channel sel Function 選擇作為能量喚醒的通道 0:通道0; 1:通道1;
如此類推,最高可指定通道 7
mad_standby channel sel Function 設(shè)定休眠時(shí)mad錄音通道數(shù) 0:表示使用實(shí)際錄音通道數(shù); 1:表示只錄制兩通道 2:表示只錄制四通道

2.14.8.4使用說明

固件上的配置,只要修改sys_config以及內(nèi)核配置即可。

應(yīng)用上需要使能MAD相關(guān)的mixer control。

I2S設(shè)置舉例,例如使用的是AC108:

mad使能,綁定mad到daudio中 amixer -Dhw:sndac1081003b cset name='daudio bind mad Function' 1 設(shè)置通道 0 作為喚醒通道 amixer -Dhw:sndac1081003b cset name='lpsd channel sel Function' 0 設(shè)定mad standby時(shí),錄音的通道數(shù) amixer -Dhw:sndac1081003b cset name='mad_standby channel sel Function' 2

DMIC設(shè)置舉例:

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

然后應(yīng)用正常進(jìn)行錄音即可,如果需要進(jìn)入休眠,有下面幾點(diǎn)必須實(shí)現(xiàn)的:

暫定錄音、播放。snd_pcm_pause將playback,capture均暫停;

設(shè)置wakeup_count。更新當(dāng)前喚醒次數(shù);

進(jìn)入休眠。寫mem到/sys/power/state即可;

Tina SDK中有一個(gè)能量喚醒demo可供參考。

make menuconfig選中mad-demo軟件包

Allwinner ---> <*> mad-demo

執(zhí)行mad-ac108-demo,默認(rèn)配置(腳本/usr/bin/mad-ac108-demo上設(shè)定了默認(rèn)配置):

? 使用通道 0 作為喚醒通道;

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

每次錄音5s后進(jìn)入休眠,可通過語音能量喚醒;

執(zhí)行mad-dmic-demo,默認(rèn)配置(腳本/usr/bin/mad-dmic-demo上設(shè)定了默認(rèn)配置):

? 使用通道 0 作為喚醒通道;

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

每次錄音5s后進(jìn)入休眠,可通過語音能量喚醒;

如果想查看錄音數(shù)據(jù),可以增加 dump 參數(shù), 例如mad-dmic-demo dump, 錄音文件保存 在/mnt/UDISK/目錄下。

2.14.8.5能量喚醒閾值參數(shù)

能量喚醒模塊lpsd,識(shí)別能量主要有兩個(gè)方向,瞬時(shí)能量和累計(jì)能量(前者比如是關(guān)門聲,后者 比如是不斷說話)能量檢測(cè)參數(shù)配置均在/sys/module/sunxi_mad/parameters/目錄下

lpsd_rrun和lpsd_rstop的推薦值:

lpsd_rrun lpsd_rstop
77 88
77 108
77 128
77 148

瞬時(shí)能量檢測(cè)參數(shù),主要是lpsd_rrun和lpsd_rstop。

一般我們只對(duì)stop值進(jìn)行修改;

如果錄音數(shù)據(jù)經(jīng)常缺少喚醒詞的第一個(gè)字,則可以嘗試降低stop值,可以有效提高喚醒詞數(shù)據(jù) 的完整性。但同時(shí)會(huì)提高誤喚醒率,環(huán)境噪音也會(huì)很容易觸發(fā)能量檢測(cè),喚醒系統(tǒng);

如果想要降低誤喚醒率(環(huán)境噪音造成喚醒),則可以嘗試提高stop值。同樣的,這會(huì)導(dǎo)致一些 喚醒詞錄音數(shù)據(jù)不完整,例如一些音量較低,音調(diào)較低的語料;

喚醒詞識(shí)別率以及誤喚醒率無法同時(shí)兼得,客戶需要根據(jù)實(shí)際需求、場(chǎng)景,權(quán)衡配置參數(shù);

累積能量檢測(cè)參數(shù),主要是lpsd_th。

? 我們建議使用默認(rèn)值 1200 。建議修改范圍50~1200;

2.14.8.6注意事項(xiàng)

MAD綁定動(dòng)作,需要在應(yīng)用打開聲卡前就設(shè)置好;

應(yīng)用操作上的一些要求,具體請(qǐng)查看《MAD使用說明》章節(jié);

如果讀取wakeup_count時(shí)一直阻塞,說明當(dāng)前仍有wake_lock處于激活狀態(tài),例如usb 線連接著PC,usb驅(qū)動(dòng)會(huì)保持一個(gè)wake_lock,不讓系統(tǒng)進(jìn)入休眠,所以需要拔掉usb或 者連接到usb適配器上,或者改動(dòng)代碼,去掉usb驅(qū)動(dòng)中wake_lock的使用;

2.14.9 VAD.

VAD是基于MAD實(shí)現(xiàn)的,可以通過內(nèi)部AudioCodec的ADC采集音頻數(shù)據(jù),并作能量喚醒。 由于硬件上MAD功能只能用于I2S或者DMIC,內(nèi)部codec無法直接關(guān)聯(lián)到MAD,因此通 過I2S作為音頻數(shù)據(jù)的橋梁,實(shí)現(xiàn)了VAD功能,使得模擬MIC也可以利用MAD功能作能量喚 醒。

VAD完整的數(shù)據(jù)通路:

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

2.14.9.1內(nèi)核配置

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

2.14.9.2 sys_config配置

需要使能MAD配置:

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

mad配置 mad配置說明
mad_used 是否使用mad驅(qū)動(dòng)。 0 :不使用; 1 :使用

2.14.9.3 mixer控件說明

控件名稱 功能 數(shù)值
codec I2S Port 指定VAD使用的I2S 0:不適用; 1:使用I2S0; 2:使用I2S1; 3:使用I2S2
sndcodec bind mad Function 是否綁定MAD功能 0:不綁定; 1:綁定
lpsd channel sel Function 選擇作為能量喚醒的通道 0:通道0; 1:通道1;
如此類推,最高可指定 通道 7
mad_standby channel sel Function 設(shè)定休眠時(shí)mad錄音通道數(shù) 0:表示使用實(shí)際錄音通 道數(shù); 1:表示只錄制兩 通道2:表示只錄制四通道

注意:

對(duì)于控件“codec I2S Port”,需要指定實(shí)際沒有使用(sys_config沒有使能的)的一路I2S。設(shè)置舉例:

實(shí)際沒有使用I2S0(sys_config中snddaudio0,audio0均沒有配置),那么這里可以設(shè)置為1,表示VAD使用I2S0;

實(shí)際沒有使用I2S1(sys_config中snddaudio1,audio1均沒有配置),那么這里可以設(shè)置為2,表示VAD使用I2S1;

設(shè)置舉例:

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以及內(nèi)核配置即可。

應(yīng)用上除了打開內(nèi)部audiocodec的錄音通路之外,還需要下面一些配置:

vad需要使用一路i2s,這里指定使用i2s1 amixer -Dhw:audiocodec cset name='codec I2S Port' 2 使能mad,綁定mad到audiocodec中 amixer -Dhw:audiocodec cset name='sndcodec bind mad Function' 1 設(shè)置通道 0 作為喚醒通道 amixer -Dhw:audiocodec cset name='lpsd channel sel Function' 0

然后應(yīng)用正常進(jìn)行錄音即可,如果需要進(jìn)入休眠,有下面幾點(diǎn)必須實(shí)現(xiàn)的:

暫定錄音、播放。snd_pcm_pause將playback,capture均暫停

設(shè)置wakeup_count。更新當(dāng)前喚醒次數(shù)

進(jìn)入休眠。寫mem到/sys/power/state即可

Tina SDK中有一個(gè)能量喚醒demo可供參考make menuconfig選中mad-demo軟件包

Allwinner ---> <*> mad-demo

執(zhí)行vad-demo,默認(rèn)配置(腳本/usr/bin/vad-demo上設(shè)定了默認(rèn)配置):

? 使用I2S1

錄制 2 通道,16bit, 16K

每次錄音5s后進(jìn)入休眠,可通過語音能量喚醒

如果想查看錄音數(shù)據(jù),可以執(zhí)行vad-demo dump,錄音文件保存在/mnt/UDISK/vad-test.wav能量喚醒閾值的調(diào)整,可以參考《能量喚醒閾值參數(shù)》

2.14.9.5注意事項(xiàng)

VAD同樣需要注意MAD注意事項(xiàng)章節(jié)中提到的幾點(diǎn)。

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

2.14.10標(biāo)案音頻測(cè)試方法.

該章節(jié)主要介紹在標(biāo)案上進(jìn)行播歌,錄音的測(cè)試命令

2.14.10.1播放

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

2.14.10.2錄音

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

####

2.20 V853音頻接口

V853包含多個(gè)音頻模塊,分別是內(nèi)置AudioCodec,I2S0,I2S1,DMIC。

2.20.1 時(shí)鐘源.

V853中,音頻模塊的時(shí)鐘源來自pll_audio0。

pll_audio0可輸出22.5792M和24.576M頻率的時(shí)鐘,分別支持44.1k系列、48k系列的播放錄音,但無法同時(shí)輸出。

圖2-48: V853時(shí)鐘源

2.20.2 代碼結(jié)構(gòu)

linux-4.9/sound/soc/sunxi_v2/ ├── snd_sun8iw21_codec.c // codec驅(qū)動(dòng) ├── snd_sun8iw21_codec.h ├── snd_sunxi_aaudio.c ├── snd_sunxi_common.c ├── snd_sunxi_common.h ├── snd_sunxi_daudio.c //daudio platform驅(qū)動(dòng) ├── snd_sunxi_daudio.h ├── snd_sunxi_dmic.c // dmic platform驅(qū)動(dòng) ├── 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,

支持同時(shí)playback和record(全雙工模式)

DAC及ADC均支持DRC

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

2.20.3.2內(nèi)核配置

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 配置說明 設(shè)備樹為芯片平臺(tái)的模塊配置,面對(duì)芯片特性進(jìn)行配 置,設(shè)備樹文件的路徑為:lichee/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi

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

配置項(xiàng)說明(僅對(duì)常用項(xiàng)進(jìn)行展開):

AudioCodec模塊由 3 個(gè)設(shè)備樹節(jié)點(diǎn)構(gòu)建。

ASoC層codec: codec

?

表2-128: AudioCodec codec節(jié)點(diǎn)配置項(xiàng)(linux4.9)

?

配置項(xiàng)名稱 配置項(xiàng)說明
#sound-dai-cells machine層檢測(cè)codec和platform節(jié)點(diǎn)的標(biāo)志
reg 設(shè)置audiocodec寄存器起始地址和地址長(zhǎng)度
clocks 設(shè)置audiocodec所需的時(shí)鐘源和模塊時(shí)鐘

ASoC層platform: codec_plat

?

表2-129: AudioCodec codec_plat節(jié)點(diǎn)配置項(xiàng)(linux4.9)

?

配置項(xiàng)名稱 配置項(xiàng)說明
#sound-dai-cells machine層檢測(cè)codec和platform節(jié)點(diǎn)的標(biāo)志
playback_cma 設(shè)置播放流DMA申請(qǐng)的size大小,必須為(2?n)Kbyte,默認(rèn) 128
capture_cma 設(shè)置錄音流DMA申請(qǐng)的size大小,必須為(2?n)Kbyte,默認(rèn) 128
tx_fifo_size 設(shè)置播放流snd_pcm_runtime的fifo_size大小,用于聲卡硬件參數(shù) 限定,默認(rèn) 128
rx_fifo_size 設(shè)置錄音流snd_pcm_runtime的fifo_size大小,用于聲卡硬件參數(shù) 限定,默認(rèn) 128
dac_txdata 設(shè)置播放流DMA搬運(yùn)地址(audiocodec模塊的tx_fifo寄存器地址)
adc_txdata 設(shè)置錄音流DMA搬運(yùn)地址(audiocodec模塊的rx_fifo寄存器地址)

ASoC層machine: codec_mach

?

表2-130: AudioCodec codec_mach節(jié)點(diǎn)配置項(xiàng)(linux4.9)

?

配置項(xiàng)名稱 配置項(xiàng)說明
soundcard- mach machine層配置前綴
name 聲卡名字
pin-switches 用于定義模塊接口開關(guān)(需參考驅(qū)動(dòng)代碼dapm進(jìn)行設(shè)定)
routing 用于定義模塊接口開關(guān)所鏈接的dapm通路(需參考驅(qū)動(dòng)代碼dapm進(jìn) 行設(shè)定)
cpu machine層所綁定的cpu節(jié)點(diǎn)(即platform層),用sound-dai屬 性指定節(jié)點(diǎn)
codec machine層所綁定的codec節(jié)點(diǎn)(即codec層),用sound-dai屬 性指定節(jié)點(diǎn)
pll-fs 指定模塊時(shí)鐘源頻率(24.576M or 22.5792M * pll-fs)

2.20.3.3.2 board.dts板級(jí)配置說明

board.dts用于保存板級(jí)平臺(tái)設(shè)備差異化的信息的補(bǔ)充,面對(duì) 板型特性 進(jìn)行配置,其配置信息會(huì)覆蓋device tree默認(rèn)配置信息,board.dts文件的路徑為:/device/config/chips/v853/configs/{BOARD}/board.dts

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

配置項(xiàng)介紹:

?

表2-131: AudioCodec模塊板級(jí)配置項(xiàng)

?

配置項(xiàng)名稱 配置值范圍 配置項(xiàng)說明
status “okay”, “disabled” 使能或關(guān)閉該節(jié)點(diǎn)驅(qū)動(dòng)
avcc-external 注釋為false,反之為 ture avcc電源是否為外圍電路提供
avcc-supply 注釋,引用pmu提供的 電源節(jié)點(diǎn) avcc若為外部pmu供電,可選擇該項(xiàng)指定 對(duì)應(yīng)的pmu電源
avcc-vol u32 (缺省值: 1800000 ) avcc電壓值設(shè)定,單位uV,需符合實(shí)際硬 件需求
dvcc-external 注釋為false,反之為 ture dvcc電源是否為外圍電路提供
dvcc-supply 注釋,引用pmu提供的 電源節(jié)點(diǎn) dvcc若為外部pmu供電,可選擇該項(xiàng)指定 對(duì)應(yīng)的pmu電源
dvcc-vol u32(缺省值: 1800000 ) dvcc電壓值設(shè)定,單位uV,需符合實(shí)際硬 件需求
adc-dig-vol- (n) 0~255 adc(n)數(shù)字音量,(n)代表adc序號(hào),從 1 開始遞增
mic(n)_vol 0~31 mic(n)默認(rèn)輸入音量(增益),(n)代表 mic序號(hào),從 1 開始遞增
dac-dig-vol 0~63 dac 數(shù)字總音量
dac-dig-vol- (n) 0~255 dac(n)數(shù)字音量,(n)代表dac序號(hào),從 1 開始遞增
lineout-vol 0~31 lineout默認(rèn)輸出音量(增益)
hp-vol 0~7 耳機(jī)默認(rèn)輸出音量(增益)
pa-pin-max u32(正常為 1 或 2 ) 標(biāo)定外部功放芯片使能引腳數(shù)量
pa-pin-(n) pio提供的引腳節(jié)點(diǎn) 指定第(n)個(gè)功放使能引腳
pa-pin-level- (n) 0~1 指定功放芯片使能電平
pa-pin- msleep-(n) u32(正常小于 200 ) 設(shè)置功放芯片使能所需的sleep時(shí)長(zhǎng),用于 規(guī)避pop聲,單位ms
adcdelaytime u32(需符合IC規(guī)格) 設(shè)置adc錄音延遲時(shí)長(zhǎng),單位ms
tx-hub-en 注釋為false,反之為 ture 選擇是否注冊(cè)txhub控件
rx-sync-en 注釋為false,反之為 ture 選擇是否注冊(cè)rxsync控件

2.20.3.4 codec數(shù)據(jù)通路

通過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控件表

?

控件名稱 功能 數(shù)值
ADC1 ADC2 swap 將adc1和adc2進(jìn)行通道 交換
ADC1 volume ADC1數(shù)字音量設(shè)置 0~0xFF, 0:Mute; 1~0xFF:-119.25dB~ 71.24dB, 0.75dB/step,默認(rèn)0xA0=0dB
ADC2 volume ADC2數(shù)字音量設(shè)置 0~0xFF, 0:Mute; 1~0xFF:-119.25dB~ 71.24dB, 0.75dB/step,默認(rèn)0xA0=0dB
ADCDRC 開啟ADC DRC功能
ADCHPF 開啟adc hpf功能
DAC volume DACL,DACR音量設(shè)置 0~0xFF, 0:Mute; 1~0xFF:-119.25dB~ 71.24dB, 0.75dB/step,默認(rèn)0xA0=0dB
DACDRC 開啟dac drc功能
DACHPF 開啟dac hpf功能
LINEIN Switch 是否使能ADC->LINEIN 的通路 0:關(guān)閉; 1:使能
LINEINL gain volume LINEINL增益 0:0dB; 1:6dB
LINEINR gain volume LINEINR增益 0:0dB; 1:6dB
LINEOUT Output Select Lineout輸出選擇 0:單端; 1:差分
LINEOUT Switch 是否使能Lineout通路 0:關(guān)閉; 1:使能
LINEOUT volume Lineout音量設(shè)置 0~31,表示-43.5~0dB
MIC1 Input Select MIC1輸入模式 0:差分輸入; 1:單端輸入
MIC1 Switch 是否使能ADC1->MIC1的 通路 0:關(guān)閉; 1:使能
MIC1 gain volume MIC1增益 0~31,表示0~36dB, 0:0dB,1~3:6dB, 4~31:9~36dB, 1dB/step
MIC2 Input Select MIC2輸入模式 0:差分輸入; 1:單端輸入
MIC2 Switch 是否使能ADC2->MIC2的 通路 0:關(guān)閉; 1:使能
MIC2 gain volume MIC2增益 0~31,表示0~36dB, 0:0dB,1~3:6dB, 4~31:9~36dB, 1dB/step
SPK Switch 是否使能Speaker通路(使 用功放) 0:關(guān)閉; 1:使能
digital volume 數(shù)字端音量設(shè)置 0~63,表示-73.08~0dB
rx sync mode 使能同步錄音(和其它開啟 rx sync mode的聲卡)
tx hub mode 使能同源播放(和其它開啟 tx hub mode的聲卡)

2.20.4 Daudio

2.20.4.1硬件特性

? 兩路I2S/PCM,可用于藍(lán)牙通話,語音采集,數(shù)字功放;

? 支持主從模式

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

支持i2s,pcm協(xié)議格式配置

支持同時(shí)playback和record(全雙工模式)

支持8~192KHz采樣率

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

支持 2 路MCLK輸出

2.20.4.2內(nèi)核配置

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 配置說明 設(shè)備樹為芯片平臺(tái)的模塊配置,面對(duì)芯片特性進(jìn)行配置,設(shè)備樹文件的路徑為:lichee/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi

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

配置項(xiàng)說明(僅對(duì)常用項(xiàng)進(jìn)行展開):

I2S/PCM模塊由 2 個(gè)或 3 個(gè)設(shè)備樹節(jié)點(diǎn)構(gòu)建。

ASoC層codec:非必須節(jié)點(diǎn),若無,則綁定虛擬codec節(jié)點(diǎn)。

ASoC層platform: daudio(n)_plat

?

表2-133: I2S/PCM daudio(n)_plat節(jié)點(diǎn)配置項(xiàng)(linux4.9)

?

配置項(xiàng)名稱 配置項(xiàng)說明
#sound-dai-cells machine層檢測(cè)codec和platform節(jié)點(diǎn)的標(biāo)志
reg 設(shè)置I2S/PCM寄存器起始地址和地址長(zhǎng)度
clocks 設(shè)置I2S/PCM所需的時(shí)鐘源和模塊時(shí)鐘
playback_cma 設(shè)置播放流DMA申請(qǐng)的size大小,必須為(2?n)Kbyte,默認(rèn) 128
capture_cma 設(shè)置錄音流DMA申請(qǐng)的size大小,必須為(2?n)Kbyte,默認(rèn) 128
tx_fifo_size 設(shè)置播放流snd_pcm_runtime的fifo_size大小,用于聲卡硬件參數(shù) 限定,默認(rèn) 128
rx_fifo_size 設(shè)置錄音流snd_pcm_runtime的fifo_size大小,用于聲卡硬件參數(shù) 限定,默認(rèn) 128

ASoC層machine: daudio(n)_mach

?

表2-134: I2S/PCM daudio(n)_mach節(jié)點(diǎn)配置項(xiàng)(linux4.9)

?

配置項(xiàng)名稱 配置項(xiàng)說明
soundcard-mach machine層配置前綴
name 聲卡名字
cpu machine層所綁定的cpu節(jié)點(diǎn)(即platform層),用 sound-dai屬性指定節(jié)點(diǎn)
codec machine層所綁定的codec節(jié)點(diǎn)(即codec層),用 sound-dai屬性指定節(jié)點(diǎn)。若該子節(jié)點(diǎn)下無sound-dai屬性, 即代表使用虛擬codec,用于輔助生成聲卡
pll-fs 指定模塊時(shí)鐘源頻率(24.576M or 22.5792M * pll-fs)

說明

daudio(n)plat_ 代表 daudio0_plat, daudio1_plat, ···(取決于芯片規(guī)格);

daudio(n)mach_ 代表 daudio0_mach, daudio1_mach, ···(取決于芯片規(guī)格);

2.20.4.3.2 board.dts板級(jí)配置說明 board.dts用于保存板級(jí)平臺(tái)設(shè)備差異化的信息的補(bǔ) 充,面對(duì) 板型特性 進(jìn)行配置,其配置信息會(huì)覆蓋device tree默認(rèn)配置信息,board.dts文件的 路徑為:/device/config/chips/v853/configs/{BOARD}/board.dts

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

配置項(xiàng)介紹:

?

表2-135: I2S/PCM模塊板級(jí)配置項(xiàng)

?

配置項(xiàng)名稱 配置值范圍 配置項(xiàng)說明
status “okay”, “disabled” 使能或關(guān)閉該節(jié)點(diǎn)驅(qū)動(dòng)
tdm-num 0~3 指定I2S序號(hào),需和daudio(n)_plat的(n) 對(duì)應(yīng)
tx-pin 0~3 指定I2S所使用的DOUT引腳序號(hào)
rx-pin 0~3 指定I2S所使用的DIN引腳序號(hào)
tx-hub-en 注釋為false,反之為 ture 選擇是否注冊(cè)txhub控件
rx-sync-en 注釋為false,反之為 ture 選擇是否注冊(cè)rxsync控件
format “i2s”,“right_j”,“l(fā)eft_j”, “dsp_a”,“dsp_b” 選擇tdm協(xié)議格式
frame-master cpu子節(jié)點(diǎn),codec子 節(jié)點(diǎn) 選擇LRCK信號(hào)主模式
bitclock- master cpu子節(jié)點(diǎn),codec子 節(jié)點(diǎn) 選擇BCLK信號(hào)主模式
frame- inversion 注釋為false,反之為 ture LRCK信號(hào)是否翻轉(zhuǎn)
bitclock- inversion 注釋為false,反之為 ture BCLK信號(hào)是否翻轉(zhuǎn)
slot-num 1~16 slot數(shù)量(可簡(jiǎn)單理解為支持最大通道數(shù))
slot-width 8, 16, 24, 32 單個(gè)slot寬度(可簡(jiǎn)單理解為支持最大數(shù)據(jù)精 度)
mclk-fp 注釋為false,反之為 ture ture: mclk以固定頻段輸出;false: mclk以 采樣率倍數(shù)輸出
mclk-fs u32 固定頻段:mclk = mclk-fs * 12.288M or 11.2896M 采樣率倍數(shù):mclk = mclk-fs * pcm rate

2.20.5 DMIC.

硬件特性

? 支持 4 路輸入

支持8~48KHz采樣率

支持16/24bit采樣精度

2.20.5.1內(nèi)核配置

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 配置說明 設(shè)備樹為芯片平臺(tái)的模塊配置,面對(duì)芯片特性進(jìn)行配 置,設(shè)備樹文件的路徑為:lichee/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi

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

配置項(xiàng)說明(僅對(duì)常用項(xiàng)進(jìn)行展開):

DMIC模塊由 2 個(gè)設(shè)備樹節(jié)點(diǎn)構(gòu)建。

ASoC層codec:無,綁定虛擬codec節(jié)點(diǎn)。

ASoC層platform: dmic_plat

?

表2-136: DMIC dmic_plat節(jié)點(diǎn)配置項(xiàng)(linux4.9)

?

配置項(xiàng)名稱 配置項(xiàng)說明
#sound-dai-cells machine層檢測(cè)codec和platform節(jié)點(diǎn)的標(biāo)志
reg 設(shè)置DMIC寄存器起始地址和地址長(zhǎng)度
clocks 設(shè)置DMIC所需的時(shí)鐘源和模塊時(shí)鐘
capture_cma 設(shè)置錄音流DMA申請(qǐng)的size大小,必須為(2?n)Kbyte,默認(rèn) 128
rx_fifo_size 設(shè)置錄音流snd_pcm_runtime的fifo_size大小,用于聲卡硬件參數(shù) 限定,默認(rèn) 128

ASoC層machine: dmic_mach

?

表2-137: DMIC dmic_mach節(jié)點(diǎn)配置項(xiàng)(linux4.9)

?

配置項(xiàng)名稱 配置項(xiàng)說明
soundcard- mach machine層配置前綴
name 聲卡名字
cpu machine層所綁定的cpu節(jié)點(diǎn)(即platform層),用sound-dai屬性 指定節(jié)點(diǎn)
codec machine層所綁定的codec節(jié)點(diǎn)(即codec層),用sound-dai屬性 指定節(jié)點(diǎn)(使用虛擬codec)
capture_only 設(shè)置僅錄音,不進(jìn)行播放流設(shè)備創(chuàng)建 pll-fs 指定模塊時(shí)鐘源頻率(24.576M or 22.5792M * pll-fs)

2.20.5.2.2 board.dts板級(jí)配置說明 board.dts用于保存板級(jí)平臺(tái)設(shè)備差異化的信息的補(bǔ) 充,面對(duì) 板型特性 進(jìn)行配置,其配置信息會(huì)覆蓋device tree默認(rèn)配置信息,board.dts文件的 路徑為:/device/config/chips/v853/configs/{BOARD}/board.dts

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

配置項(xiàng)介紹:

?

表2-138: DMIC模塊板級(jí)配置項(xiàng)

?

配置項(xiàng)名稱 配置值范圍 配置項(xiàng)說明
status “okay”, “disabled” 使能或關(guān)閉該節(jié)點(diǎn)驅(qū)動(dòng)
rx-sync-en 注釋為false,反之為 ture 選擇是否注冊(cè)rxsync控件
avcc- supply 注釋,引用pmu提供的 電源節(jié)點(diǎn) avcc若為外部pmu供電,可選擇該項(xiàng)指定對(duì)應(yīng)的 pmu電源

2.20.6 RX_SYNC多聲卡同步功能

RX_SYNC功能用于同時(shí)使用到兩個(gè)錄音聲卡(不同音頻硬件接口),可以保證兩個(gè)聲卡同時(shí)開始錄音,保證延遲穩(wěn)定不變。

例如內(nèi)部ADC+外部ADC(使用I2S)的語音方案,它就可以保證內(nèi)部ADC和I2S RX的同步性。

AudioCodec, I2S, DMIC均可以使用RX_SYNC功能,除了它們對(duì)應(yīng)的驅(qū)動(dòng)配置外,還需要額外配置內(nèi)核,dts等地方。

2.20.6.1內(nèi)核配置

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

2.20.6.2 dts配置.

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

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

注意,配置了rx_sync_en字段的模塊,需要都開啟錄音后,才會(huì)真正開始錄音。

一般我們會(huì)使用multi插件將兩個(gè)聲卡數(shù)據(jù)合并(默認(rèn)asound.conf中添加了CaptureMulti1可供參考),arecord -DCaptureMulti1 -f S16_LE -r 16000 -c 7 /tmp/test.wav &。

2.20.7 標(biāo)案音頻測(cè)試方法.

該章節(jié)主要介紹在標(biāo)案上進(jìn)行播歌,錄音的測(cè)試命令

2.20.7.1播放

通過LINEOUT->Speaker播放 amixer -Dhw:audiocodec cset name='LINEOUTL Output Select' 1 amixer -Dhw:audiocodec cset name='LINEOUTR Output Select' 1 amixer -Dhw:audiocodec cset name='LINEOUT Switch' 1 amixer -D hw:audiocodec cset name='LINEOUT volume' 15 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav 或者利用默認(rèn)/etc/asound.conf配置的pcm設(shè)備進(jìn)行播放: 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錄音

通過內(nèi)部的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包含多個(gè)音頻模塊,分別是內(nèi)置AudioCodec,I2S1,I2S2,DMIC,SPDIF。

2.21.1 時(shí)鐘源.

F133中,音頻模塊的時(shí)鐘源來自pll_audio0以及pll_audio1_div5。

pll_audio0可以輸出22.5792M的時(shí)鐘,而pll_audio1_div5輸出24.576M的時(shí)鐘,分別支 持44.1k系列,48k系列的播放錄音。

2.21.2 AudioCodec

2.21.2.1硬件特性

? 兩路DAC

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

支持8KHz~192KHz采樣率

三路ADC

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

支持8KHz~48KHz采樣率

模擬輸出:

一路立體聲輸出HPOUTL,HPOUTR

模擬差分輸入:

一路差分麥克風(fēng)輸入MIC3P/N

一路立體聲line-in輸入LINEINL,LINEINR

一路立體聲FM-in輸入FMINL,FMINR

支持同時(shí)playback和record(全雙工模式)

DAC及ADC均支持DRC

2.21.2.2內(nèi)核配置

kernel_menuconfig配置

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

配置項(xiàng)名稱 配置項(xiàng)說明
Allwinner Sun20iw1 Codec Support audiocodec
Allwinner Audio Simple Card 綁定聲卡
Allwinner RX SYNC Support 同步功能組件

2.21.2.3 DTS配置.

board.dts板級(jí)配置

&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 = ; */ /* hpvcc-supply = ; */ status = "okay"; };

部分配置項(xiàng)名稱 配置取值 配置項(xiàng)說明
mic3gain 0-31 mic3增益
digital_vol 0-63 DAC數(shù)字音量
headphonegain 0-7 耳機(jī)播放增益
pa_level 0-1 功放芯片使能電平
pa_pwr_level 0-1 功放供電使能電平
pa_msleep_time u32,一般小于 200 x u32,一般小于 200 設(shè)置功放芯片使能所需sleep時(shí)間
status “okay”/“disable” 使能或者關(guān)閉本節(jié)點(diǎn)

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)

支持回環(huán)模式

支持同時(shí)playback和capture

支持多聲卡同步錄音

2.21.3.2內(nèi)核配置

kernel_menuconfig配置

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

配置項(xiàng)名稱 配置項(xiàng)說明
Allwinner Sun20iw1 Codec Support I2S/PCM
Allwinner Audio Simple Card 綁定聲卡
Allwinner RX SYNC Support 同步功能組件

2.21.3.3 DTS配置.

board.dts板級(jí)配置

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

設(shè)備樹配置sun20iw1p1.dtsi

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

部分配置項(xiàng)名稱 配置取值 配置項(xiàng)說明
status “okay” “disable” 使能或者關(guān)閉snddaudio驅(qū)動(dòng)
mclk_div 0-192 mclk分頻系數(shù),取值為 0/1/2/4/8/12/16/24/32/48/64/96/128/176/192
frametype 0-1 0:short frame(1 clock width) 1:long frame(2 clock width)
tdm_config 0-1 0:PCM mode 1:I2S mode
sign_extend 0-1 0:zero pending 1:sign extend
msb_lsb_first 0-1 0:msb first 1:lsb first
pcm_lrck_period 16/32/64/128/256 一般可配置為16/32/64/128/256個(gè) bclk
slot_width_select 8/16/32 slot支持8/16/32bit寬度
tx_data_mode 0/1/2/3 0:16bit linear PCM 1:reserved 2:8bit u-law 3:8bit a-law
rx_data_mode 0/1/2/3 0:16bit linear PCM 1:reserved 2:8bit u-law 3:8bit a-law
simple-audio-card,name string 聲卡名稱
simple-audio-card,format string I2S tdm模式,取值為 “i2s”/“right_j”/“l(fā)eft_j”/“dsp_a”/“dsp_b”
simple-audio-card,frame- master 注釋為false,反 之為true 配置frame clk主從關(guān)系,不配置則 soc為主,反之soc為從
simple-audio-card,bitclock- master 注釋為false,反 之為true 配置bit clk主從關(guān)系,不配置則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內(nèi)核配置

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

配置項(xiàng)名稱 配置項(xiàng)說明
Allwinner Sun20iw1 Codec Support dmic
Allwinner Audio Simple Card 綁定聲卡
Allwinner RX SYNC Support 同步功能組件

2.21.4.3 DTS配置.

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

部分配置項(xiàng)名稱 配置取值 配置項(xiàng)說明
status “okay”/“disable” 使能或者關(guān)閉本節(jié)點(diǎn)
rx_sync_en 注釋為false反之為true 是否注冊(cè)rx_sync組件

2.21.5 SPDIF

2.21.5.1硬件特性

支持22.05-192k采樣率

支持16 24采樣精度

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

支持多聲卡同步錄音

支持回環(huán)模式

支持IEC-60958協(xié)議

支持IEC-61937協(xié)議

2.21.5.2內(nèi)核配置

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

配置項(xiàng)名稱 配置項(xiàng)說明
Allwinner Sun20iw1 Codec Support spdif
Allwinner Audio Simple Card 綁定聲卡
Allwinner RX SYNC Support 同步功能組件

2.21.5.3 DTS配置.

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

部分配置項(xiàng)名稱 配置取值 配置項(xiàng)說明
status “okay” “disable” 使能或者關(guān)閉本節(jié)點(diǎn)
rx_sync_en 注釋為false反之為true 是否注冊(cè)rx_sync組件

2.21.6 標(biāo)案音頻測(cè)試方法.

該章節(jié)主要介紹在標(biāo)案上進(jìn)行播歌,錄音的測(cè)試命令

2.21.6.1播放

通過Headphone播放 1.開機(jī)后推送測(cè)試音頻48000.wav到小機(jī)端,pc命令:adb push 48000.wav /tmp/ 2.播放該音頻文件, aplay /tmp/48000.wav

2.21.6.2錄音

mic: 1.使能mic3通路:amixer set "ADC3 Input MIC3 Boost" on 2.設(shè)置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.設(shè)置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.設(shè)置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.推送音頻文件到小機(jī)端: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播放結(jié)束后,killall arecord結(jié)束錄音任務(wù) 6.通過adb命令把test_su.wav拉出來,在PC端查看音頻數(shù)據(jù)是否跟播放的內(nèi)容一致

3 3常用工具及調(diào)試方法

3.1 3.1 alsa-utils

標(biāo)準(zhǔn)ALSA工具,它使用到alsa-lib標(biāo)準(zhǔn)庫,一般常用到的有amixer,aplay,arecord等。

3.1.1 3.1.1 amixer

amixer是命令行的ALSA聲卡驅(qū)動(dòng)調(diào)節(jié)器工具,用于設(shè)置mixer control。

使用方法:

? 常用選項(xiàng)

選項(xiàng) 功能
-D,--device 指定聲卡設(shè)備,默認(rèn)使用defaul

? 常用命令

命令 功能
controls 列出指定聲卡的所有控件
contents 列出指定聲卡的所有控件的具體信息
cget 獲取指定控件的信息
cset 設(shè)定指定控件的值

舉例:

獲取audiocodec聲卡的所有控件名 amixer -Dhw:audiocodec controls 獲取當(dāng)前硬件音量 amixer -Dhw:audiocodec cget name='LINEOUT volume' 設(shè)置當(dāng)前硬件音量 amixer -Dhw:audiocodec cget name='LINEOUT volume' 25

3.1.2 3.1.2 aplay

aplay是命令行的ALSA聲卡驅(qū)動(dòng)的播放工具,用于播放功能。

使用方法:

選項(xiàng) 功能
-D,--device 指定聲卡設(shè)備,默認(rèn)使用default
-l,--list-devices 列出當(dāng)前所有聲卡
-t,--file-type 指定播放文件的格式,如voc,wav,raw,不指定的情況下會(huì)去讀取文件 頭部作識(shí)別
-c,--channels 指定通道數(shù)
-f,--format 指定采樣格式
-r,--rate 采樣率
-d,--duration 指定播放的時(shí)間
--period-size 指定period size
--buffer-size 指定buffer size

如果播放的是wav文件,可以解析頭部,識(shí)別通道數(shù),采樣率等參數(shù)。

舉例:

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

3.1.3 3.1.3 arecord.

arecord是命令行的ALSA聲卡驅(qū)動(dòng)的錄音工具,用于錄音功能。

使用方法:

選項(xiàng) 功能
-D,--device 指定聲卡設(shè)備,默認(rèn)使用default
-l,--list-devices 列出當(dāng)前所有聲卡
-t,--file-type 指定播放文件的格式,如voc,wav,raw,不指定的情況下會(huì)去讀取文件 頭部作識(shí)別
-c,--channels 指定通道數(shù)
-f,--format 指定采樣格式
-r,--rate 采樣率
-d,--duration 指定播放的時(shí)間
--period-size 指定period size
--buffer-size 指定buffer size

舉例:

錄制5s,通道數(shù)為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時(shí),會(huì) 加載相關(guān)位置上的配置文件,用于指導(dǎo)操作pcm,mixer設(shè)備。

首先會(huì)讀取配置文件/usr/share/alsa/alsa.conf,其中有下面一段hooks。

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

這里設(shè)定了一個(gè)鉤子,去讀取相關(guān)目錄配置文件:

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

這些配置文件可以設(shè)定defaut聲卡,自定義pcm設(shè)備,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下有相關(guān)軟件包會(huì)設(shè)置/etc/asound.conf,可以用作參考。

使用方法:

tina根目錄下執(zhí)行make menuconfig,選擇alsa-conf-aw軟件包。

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

它會(huì)生成/etc/asound.conf文件,下面作簡(jiǎn)單介紹:

設(shè)定amixer操作的defautl聲卡(執(zhí)行snd_hctl_open會(huì)獲取該配置) ctl.!default { type hw card audiocodec } 設(shè)定default聲卡(執(zhí)行snd_pcm_open會(huì)獲取該配置) pcm.!default { type asym playback.pcm "PlaybackDmix" capture.pcm "CaptureDsnoop" } 使用dmix插件,可以混合播歌,即支持多次打開聲卡進(jìn)行播歌 pcm.PlaybackDmix { type plug slave.pcm { type dmix ipc_key 1111 ipc_perm 0666 slave { pcm "hw:audiocodec" rate 48000 channels 2 } } } 使用dsnoop插件,可以混合錄音,即支持多次打開聲卡進(jìn)行錄音 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插件可以增加一個(gè)control,用于控制音量(軟件上作調(diào)節(jié)) 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的一個(gè)簡(jiǎn)化版。它提供了pcm和control的基本接口;沒有太多太復(fù)雜的 操作、功能。可以按需使用接口。tinyalsa-utils是基于tinyalsa的一些工具,下面對(duì)幾個(gè)常用 的工具作介紹。

3.2.1 3.2.1 tinymix

與amixer作用類似,用于操作mixer control。

? 常用選項(xiàng)

選項(xiàng) 功能
-D,–card 指定聲卡設(shè)備,默認(rèn)使用card0

? 常用命令

命令 功能
controls 列出指定聲卡的所有控件
contents 列出指定聲卡的所有控件的具體信息
get 獲取指定控件的信息
set 設(shè)定指定控件的值

舉例:

獲取card0的所有控件名 tinymix -D 0 controls 獲取card0當(dāng)前硬件音量 tinymix -D 0 get 'LINEOUT volume' 設(shè)置card0當(dāng)前硬件音量 tinymix -D 0 set 'LINEOUT volume' 25

3.2.2 3.2.2 tinyplay

與aplay作用類似,用于操作聲卡設(shè)備進(jìn)行播放

? 常用選項(xiàng)

選項(xiàng) 功能
-D,–card 指定聲卡設(shè)備,默認(rèn)使用card0
-p,–period-size 指定period大小,單位為幀
-c,–channels 指定通道數(shù)
-r,–rate 指定采樣率
-b,–bits 指定采樣精度

如果播放的是wav文件,可以解析頭部,識(shí)別通道數(shù),采樣率等參數(shù)

舉例:

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

3.2.3 3.2.3 tinycap

與arecord作用類似,用于操作聲卡進(jìn)行錄音功能

? 常用選項(xiàng)

選項(xiàng) 功能
-D,–device 指定聲卡設(shè)備,默認(rèn)使用card0
-p,–period-size 指定period大小,單位為幀
-c,–channels 指定通道數(shù)
-r,–rate 指定采樣率
-b,–bits 指定采樣精度

舉例:

錄制通道數(shù)為2,采樣率為16000,采樣精度為16bit,保存為wav文件 tinycap -D 0 -b 16 -r 16000 -c 2 /mnt/UDISK/test.wav

3.3 3.3 dump寄存器

我們sunxi平臺(tái)均提供了sunxi_dump驅(qū)動(dòng),用于查看讀寫寄存器。

節(jié)點(diǎn)位于/sys/class/sunxi_dump目錄。

但是audiocodec模擬寄存器的操作會(huì)有些特殊,我們一般在audio驅(qū)動(dòng)中都會(huì)增加相關(guān)調(diào)試節(jié) 點(diǎn),去操作自己模塊的寄存器,以便調(diào)試。

3.3.1 3.3.1 dump audiocodec寄存器

audiocodec驅(qū)動(dòng)的寄存器調(diào)試節(jié)點(diǎn)位于:

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

使用方法:

通過echo寫入下列參數(shù)

參數(shù)1: 0-read; 1-write

參數(shù)2: 1-digitar reg; 2-analog reg

參數(shù)3: reg value

參數(shù)4: write value

舉例:

查看所有寄存器狀態(tài):

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

查看某個(gè)數(shù)字寄存器狀態(tài):

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數(shù)字寄存器的值為0x03004000

查看某個(gè)模擬寄存器狀態(tài):

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

改寫某個(gè)數(shù)字寄存器:

echo 1,1,0x24,0 > /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 表示將0x24數(shù)字寄存器寫為0x0

改寫某個(gè)模擬寄存器:

echo 1,2,0x3,0x1 > /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 表示將0x03模擬寄存器寫為0x1

3.3.2 3.3.2 dump daudio寄存器

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

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

可以通過sunxi_dump節(jié)點(diǎn)查詢寄存器狀態(tài),例如查看i2s0的寄存器:

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

3.3.3 3.3.3 dump dmic寄存器

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

dmic: 0x05095000

可以通過sunxi_dump節(jié)點(diǎn)查詢寄存器狀態(tài):

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

3.3.4 3.3.4 dump spdif寄存器

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

spdif: 0x05093000

可以通過sunxi_dump節(jié)點(diǎn)查詢spdif寄存器狀態(tài):

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

3.4 3.4 sound procfs.

通過procfs文件系統(tǒng)下面的聲卡相關(guān)節(jié)點(diǎn),可以得到各個(gè)聲卡各個(gè)音頻流的狀態(tài)。實(shí)際調(diào)試中會(huì) 非常有用。

內(nèi)核需要選中下面選項(xiàng)才能在procfs下生成對(duì)應(yīng)節(jié)點(diǎn):

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

以card0為例看下提供的節(jié)點(diǎn)信息:

ddd /proc/asound/card0/ ├── id /*聲卡名稱*/ ├── pcm0c /* pcm0錄音流*/ │ ├── info /* pcm信息*/ │ └── sub0 │ ├── hw_params /*硬件參數(shù)信息*/ │ ├── info /* pcm信息*/ │ ├── status /* pcm流運(yùn)行狀態(tài)*/ │ └── sw_params /*軟件參數(shù)信息*/ └── pcm0p /* pcm0播放流*/ ├── info └── sub0

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

cat /proc/asound/card0/pcm0c/sub0/hw_params access: RW_INTERLEAVED /*交錯(cuò)模式排列通道*/ format: S16_LE /*當(dāng)前音頻流的采樣精度*/ subformat: STD channels: 2 /*通道數(shù)*/ rate: 16000 (16000/1) /*采樣率*/ period_size: 320 /*周期(決定dma中斷時(shí)間,例如這里period_time=320/16000=20ms) */ buffer_size: 2560 /*內(nèi)核ALSA框架中環(huán)形緩沖區(qū)大小,決定能夠緩存多少個(gè)period */ cat /proc/asound/card0/pcm0c/sub0/status state: RUNNING /*音頻流運(yùn)行狀態(tài),RUNNING, SETUP等狀態(tài)*/ owner_pid : 22653 trigger_time: 81828.078175765 tstamp : 82373.796969347 /*開始運(yùn)行后的時(shí)間戳信息*/ delay : 256 avail : 256 /*當(dāng)前可用音頻數(shù)據(jù)幀數(shù)*/ avail_max : 320 ----- hw_ptr : 8731456 /*硬件邏輯指針,單位(幀) */ appl_ptr : 8731200 /*應(yīng)用邏輯指針,單位(幀) */

從period_size可以知道當(dāng)前dma中斷頻率,太快會(huì)影響系統(tǒng)響應(yīng)速度,太慢可能就存在一 定延時(shí)。

buffer_size可以知道緩存區(qū)大小,太小容易因調(diào)度不及時(shí)出現(xiàn)xrun,太大同樣存在一定延時(shí)。

從hw_ptr, appl_ptr可以知道當(dāng)前錄音/播音的幀數(shù),是否發(fā)生過xrun等。

4 4常用接口說明

這里主要介紹alsa-lib中的常用接口

4.1 4.1 control接口

為了方便操作訪問,alsa-lib中封裝了相關(guān)接口,通過control節(jié)點(diǎn)(/dev/snd/controlCX)去獲 取、設(shè)置control elements

主要涉及到的接口:

snd_ctl_open snd_ctl_elem_info_get_id snd_ctl_elem_info_set_id snd_ctl_elem_info snd_ctl_ascii_value_parse snd_ctl_elem_read snd_ctl_elem_write snd_ctl_close

詳細(xì)control接口說明請(qǐng)查閱:

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

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

下面是一個(gè)設(shè)置音量接口的例子:

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

}

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

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

4.2 4.2 PCM接口.

為了方便操作訪問,alsa-lib中封裝了相關(guān)接口,通過pcmCXDXp/pcmCXDXc節(jié)點(diǎn)(/dev/s- nd/pcmCXDXx)去實(shí)現(xiàn)播放、錄音功能。

主要涉及到的接口:

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

詳細(xì)pcm接口說明請(qǐng)查閱:

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的實(shí)現(xiàn),代碼可以在alsa-utils中找到(dl/alsa-utils- 1.1.0.tar.bz2)

5 開機(jī)音樂功能

這里開機(jī)音樂功能,指的是在uboot階段開始啟動(dòng)dma將音頻數(shù)據(jù)搬運(yùn)到AudioCodec的 FIFO中進(jìn)行播歌,同時(shí)CPU繼續(xù)開機(jī)流程進(jìn)入內(nèi)核。進(jìn)入系統(tǒng)后,在合適的啟動(dòng)腳本中加載音 頻驅(qū)動(dòng)模塊(如果builtin,那么音樂會(huì)提前中止),這樣開機(jī)音樂可以大大的提前,給用戶一種迅 速開機(jī)的錯(cuò)覺。

目前SDK代碼中支持uboot開機(jī)音樂功能的平臺(tái)有:R6,R7s,R11,R16,R328,R311,MR133

配置使用方法都比較類似,下面以R328為例進(jìn)行說明。

5.1 配置方法

修改uboot配置文件

可修改默認(rèn)配置configs/sun8iw18p1_defconfig增加下面幾項(xiàng) CONFIG_SOUND_SUNXI_SOC_RWFUNC=y CONFIG_SOUND_SUNXI_SUN8IW18_CODEC=y CONFIG_SOUND_SUNXI_BOOT_TONE=y

也可以通過kconfig進(jìn)行配置lichee/brandy-2.0/u-boot-2018目錄下執(zhí)行makemenu- config ARCH=arm,選上對(duì)應(yīng)功能項(xiàng):選中sun8iw18的codec驅(qū)動(dòng)以及開機(jī)音樂功能

5-1-1

修改sys_config文件

配置boottone_used為1,表示使用開機(jī)音樂功能 ;---------------------------------------------------------------------------------- ;boot tone configuration ; ;boottone_used ---boot tone enable ;len_limit ---set size in bytes, normally do not need to set it and driver will use file size ;---------------------------------------------------------------------------------- [boottone] boottone_used = 1另外codec節(jié)點(diǎn)也需要配置正確,下面是部分重要配置 [codec] codec_used = 0x1 lineout_vol =0x1a gpio-spk = port:PH9<1><1><1><1>

創(chuàng)建boottone分區(qū)

開機(jī)音樂的音頻文件需要放置在單獨(dú)一個(gè)分區(qū)中,例如boottone分區(qū),修改sys_partition.fex 文件: [partition] name = boottone size = 2048 downloadfile = "boottone.fex" user_type = 0x8000上述 2048 表示1M的空間,注意根據(jù)實(shí)際音頻文件大小填寫合適的size 然后將音頻文件重命名為boottone.fex,并放置到方案配置目錄下,以cowbell-perf1方案 為例: mv kaiji.wav target/allwinner/cowbell-perf1/configs/boottone.fex

修改env配置文件

主要增下面幾行: uboot_tone_addr=0x4327ffd4 boottone_partition=boottone load_boottone=sunxi_flash read ${uboot_tone_addr} ${boottone_partition}uboot_tone_addr用于指定音頻文件加載到dram的地址 boottone_partition用于指定音頻文件所在分區(qū)名 load_boottone用于加載音頻文件到dram的命令

將內(nèi)核AudioCodec驅(qū)動(dòng)編譯成模塊

make kernel_menuconfig去除下面幾個(gè)配置: @@ -702,14 +705,9 @@ CONFIG_SND_SOC_I2C_AND_SPI=y # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8985 is not set-CONFIG_SND_SUN8IW18_CODEC=y # CONFIG_SND_SUNXI_MAD is not set -CONFIG_SND_SUNXI_SOC=y -CONFIG_SND_SUNXI_SOC_CPUDAI=y -CONFIG_SND_SUNXI_SOC_DAUDIO=y -CONFIG_SND_SUNXI_SOC_RWFUNC=y -CONFIG_SND_SUNXI_SOC_SUN8IW18_CODEC=y -CONFIG_SND_SUNXI_SOC_SUNXI_DAUDIO=y +# CONFIG_SND_SUNXI_SOC_SUN8IW18_CODEC is not set +# CONFIG_SND_SUNXI_SOC_SUNXI_DAUDIO is not set # CONFIG_SND_SUNXI_SOC_SUNXI_DMIC is not set # CONFIG_SND_SUNXI_SOC_SUNXI_SPDIF is not set CONFIG_SND_SUPPORT_OLD_API=ymake menuconfig增加驅(qū)動(dòng)模塊配置 @@ -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 注意事項(xiàng)

uboot退出時(shí),不能關(guān)掉dma。如果發(fā)生在跳轉(zhuǎn)kenrel時(shí)聲音變化或消失,請(qǐng)確認(rèn)跳轉(zhuǎn)到內(nèi) 核前是否調(diào)用了sunxi_dma_exit();

內(nèi)核并不知道uboot將音頻加載到dram的位置。理論上,kernel可能會(huì)在初始化過程中, 用到那片內(nèi)存,導(dǎo)致音樂播放不正常。

可以在dts中,將該片內(nèi)存改為reserve屬性,可以確保kernel不會(huì)使用到。

選用kernel初始化不會(huì)用到的內(nèi)存塊

可以在uboot命令行下執(zhí)行boottone命令進(jìn)行調(diào)試

6 各平臺(tái)音頻模塊注意事項(xiàng)

6.1 R328.

只有一個(gè)DAC,所以在播放兩通道數(shù)據(jù)的時(shí)候,硬件上會(huì)將第二個(gè)通道的數(shù)據(jù)丟掉。如果想

要將兩通道數(shù)據(jù)都完成播放出來,需要在軟件上將兩通道合成,可利用alsa插件實(shí)現(xiàn),例如下 面配置: pcm.playback { type plug slave { pcm "hw:audiocodec,0" rate 48000 channels 1 } }alsa插件會(huì)將兩通道數(shù)據(jù)的幅度衰減為由原來的一半(如果直接相加,幅度為原來的兩倍,有 可能造成削頂),再組合為一通道寫入聲卡中。

使用模擬mic作AEC時(shí),需要將該MIC gain設(shè)置為0dB.如果有增益,則會(huì)導(dǎo)致錄音開始及結(jié)束時(shí)產(chǎn)生pop音(開關(guān)PA產(chǎn)生的pop音,經(jīng)過差分MIC消除后仍然存在極小的雜音,如果再經(jīng)過MIC增益放大,則會(huì)變?yōu)槊黠@的pop音)

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 音頻
    +關(guān)注

    關(guān)注

    29

    文章

    2766

    瀏覽量

    80775
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207889
  • 開發(fā)指南
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    7509
  • 音頻模塊
    +關(guān)注

    關(guān)注

    1

    文章

    142

    瀏覽量

    12265
  • Tina
    +關(guān)注

    關(guān)注

    2

    文章

    45

    瀏覽量

    16894
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Tina_Linux系統(tǒng)裁剪開發(fā)指南

    Tina_Linux系統(tǒng)裁剪開發(fā)指南1 概述2 Tina系統(tǒng)裁剪簡(jiǎn)介2.1 boot0裁剪2.2 uboot裁剪2.3 內(nèi)核裁剪2.3.1 刪除不使用的功能2.3.2 刪除不使用的驅(qū)動(dòng)2.3.3
    的頭像 發(fā)表于 03-06 09:52 ?1384次閱讀

    EAC0945 linux開發(fā)指南

    EAC0945 linux開發(fā)指南
    發(fā)表于 09-28 12:40

    EAC0945 linux開發(fā)指南

    `EAC0945 linux開發(fā)指南`
    發(fā)表于 10-31 12:18

    Rockchip Linux SDK uboot logo開發(fā)指南

    arm嵌入式vs-rk3399 板卡uboot logo 開發(fā)指南概述:本文檔主要介紹 rockchip linux sdk uboot logo 顯示的相關(guān)功能、配置以及開發(fā)過程中的注意事項(xiàng)。適用于 rockhip
    發(fā)表于 10-09 08:12

    Tiny6410 Linux開發(fā)指南詳解

    Tiny6410 Linux 開發(fā)指南
    發(fā)表于 07-08 17:12 ?209次下載
    Tiny6410 <b class='flag-5'>Linux</b><b class='flag-5'>開發(fā)指南</b>詳解

    A64開發(fā)板LCD開發(fā)指南

    A64開發(fā)板LCD開發(fā)指南,驅(qū)動(dòng)開發(fā)指南
    發(fā)表于 06-21 17:02 ?0次下載

    彩光燈開發(fā)指南

    彩光燈開發(fā)指南
    發(fā)表于 12-29 20:15 ?0次下載

    Linux的平臺(tái)下Mini210S裸機(jī)程序開發(fā)指南

    Linux的平臺(tái)下Mini210S裸機(jī)程序開發(fā)指南
    發(fā)表于 10-29 10:52 ?59次下載
    <b class='flag-5'>Linux</b>的平臺(tái)下Mini210S裸機(jī)程序<b class='flag-5'>開發(fā)指南</b>

    Rockchip Linux SDK的開發(fā)指南的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是Rockchip Linux SDK的開發(fā)指南的詳細(xì)資料說明。
    發(fā)表于 01-10 17:17 ?74次下載
    Rockchip <b class='flag-5'>Linux</b> SDK的<b class='flag-5'>開發(fā)指南</b>的詳細(xì)資料說明

    迅為RK3399開發(fā)板嵌入式linux開發(fā)指南

    迅為RK3399開發(fā)板嵌入式linux開發(fā)指南迅為RK3399開發(fā)板發(fā)布《北京迅為嵌入式linux開發(fā)指
    發(fā)表于 11-01 16:58 ?75次下載
    迅為RK3399<b class='flag-5'>開發(fā)</b>板嵌入式<b class='flag-5'>linux</b><b class='flag-5'>開發(fā)指南</b>

    Tina_Linux_系統(tǒng)軟件開發(fā)指南

    Tina_Linux_系統(tǒng)軟件開發(fā)指南
    的頭像 發(fā)表于 03-02 15:25 ?1517次閱讀
    <b class='flag-5'>Tina_Linux</b>_系統(tǒng)軟件<b class='flag-5'>開發(fā)指南</b>

    Tina Linux配置開發(fā)指南

    Tina Linux配置開發(fā)指南
    的頭像 發(fā)表于 03-02 15:28 ?1.6w次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b>配置<b class='flag-5'>開發(fā)指南</b>

    Linux NOR開發(fā)指南

    Linux NOR開發(fā)指南
    的頭像 發(fā)表于 03-06 09:55 ?813次閱讀
    <b class='flag-5'>Linux</b> NOR<b class='flag-5'>開發(fā)指南</b>

    Tina Linux圖形系統(tǒng)開發(fā)指南

    本文檔將介紹 Allwinner Tina Linux 中已經(jīng)移植好的窗口系統(tǒng),以及怎么使用,包括 MiniGUI、QT5、EFL、GTK+(WebkitGtk、Midori)、DirectFB、Wayland,整體結(jié)構(gòu) 。
    的頭像 發(fā)表于 03-06 11:00 ?2844次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b>圖形系統(tǒng)<b class='flag-5'>開發(fā)指南</b>

    Tina Linux PMU開發(fā)指南

    介紹使用Tina PMU 驅(qū)動(dòng)的使用方法。
    的頭像 發(fā)表于 03-06 11:05 ?1875次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b> PMU<b class='flag-5'>開發(fā)指南</b>