精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Tina Linux音頻開發指南

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

Tina_Linux音頻開發指南

1 概述

1.4 相關術語

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

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

2 模塊介紹

Linux中的音頻子系統采用ALSA架構實現。ALSA目前已經成為了Linux的主流音頻體系結構。在內核設備驅動層,ALSA提供了alsa-driver,同時在應用層,ALSA為我們提供了alsa-lib,應用程序只要調用alsa-lib提供的API,即可以完成對底層音頻硬件的控制。

2.1 驅動框架

Tina SDK對各個平臺的音頻設備驅動均采用ASoC架構實現。ASoC是建立在標準alsa驅動層上,為了更好地支持嵌入式處理器和移動設備中的音頻codec的一套軟件體系,ASoC將音頻系統分為 3 部分:Codec,Platform和Machine。

Codec驅動

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

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

Platform驅動

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

Machine驅動單獨的Platform和Codec驅動是不能工作的,它必須由Machine驅動把它們結合在一起才能完成整個設備的音頻處理工作。

圖2-1: ASoC框圖

2.2 音頻接口介紹.

我們提供的音頻接口有:

AudioCodec

Daudio(I2S)

Dmic

Spdif

MAD

不同芯片平臺的音頻接口資源會有差異;不同版本的內核,對應的ALSA驅動也有所不同;下面會對各個芯片作詳細介紹。

2.3 R6音頻接口

2.3.1 硬件資源

R6包含 2 個音頻模塊,分別是內置audiocodec以及daudio0。

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

2.3.2 時鐘

R6中, 2 個音頻模塊的時鐘源均來自pll_audio。

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

圖2-3: R6時鐘源

2.3.3 代碼結構

linux-3.10/sound/soc/sunxi/

├── sun3iw1_ac101.c // daudio+ac101的machine驅動

├── sun3iw1_codec.c // codec 驅動

├── sun3iw1_codec.h

├── sun3iw1_daudio.c // daudio的platform驅動

├── sun3iw1_daudio.h

├── sun3iw1_sndcodec.c // codec machine驅動

├── sunxi_cpudai.c // codec platform驅動

├── sunxi_cpudai.h

├── sunxi_dma.c //通用文件,提供注冊platform驅動的接口及相關函數集

├── sunxi_dma.h

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

└── sunxi_rw_func.h

?

linux-3.10/sound/soc/codecs/

├── ac101.c // daudio+ac101的codec驅動

└── ac101.h

2.3.4 Audiocodec.

硬件特性

兩路DAC

支持16bit,24bit采樣精度

支持8KHz~192KHz采樣率

一路ADC

支持16bit,24bit采樣精度

支持8KHz~48KHz采樣率

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

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

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

2.3.4.1 內核配置

Device Drivers --->

<*> Sound card support --->

<*> Advanced Linux Sound Architecture --->

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

<*> ASoC support for SUNXI --->

<*> ASoC support for sun3iw1 audiocodec

<*> ASoC support for internal-codec cpudai

<*> ASoC support for sun3iw1 audiocodec machine

2.3.4.2 sys_config配置.

[sndcodec]

sndcodec_used = 0x1

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

[cpudai]

cpudai_used = 0x1

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

[codec]

codec_used = 0x1

headphonevol = 0x3b

maingain = 0

pa_sleep_time = 30

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

gpio_shdn = 1

sndcodec配置,即machine驅動的相關配置。

sndcodec配置 sndcodec配置說明
sndcodec_used 是否使用sndcodec驅動。 0 :不使用; 1 :使用

cpudai配置,即platform驅動的相關配置。

cpudai配置 cpudai配置說明
cpudai_used 是否使用cpudai驅動。 0 :不使用; 1 :使用

codec配置,即內置audiocodec驅動的相關配置。

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

說明

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

headphonevol 等值會在驅動初始化的時候設置,進入系統后還可以通過amixer 工具對應控件進行再次修改;

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

除了gpio-spk 指定pa 使能引腳外,驅動中也會檢測gpio_num 字段,所以可以直接將gpio 號賦值gpio_num;

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

2.3.4.3 codec數據通路

圖2-4: R6音頻通路

R6平臺的audiocodec驅動會在播歌的時候自動設置相關通路,默認audio map:

播歌

DACL --> HP_L Mux --> HPOUTL

DACR --> HP_R Mux --> HPOUTR

錄音功能則根據需要操作對應空間使能通路:

錄制單MIC數據

MICIN --> ADC Mixer -> ADC

?

錄制內部AEC數據(不需要外圍回采電路)

Left Output Mixer --> ADC Mixer -> ADC

Right Output Mixer --> ADC Mixer -> ADC

R6相關控件如下表:

控件名稱 功能 數值
ADC INPUT GAIN control ADC增益 0–7,表示-4.5–6dB
ADC MIC Boost AMP enMIC Boost AMP使能 0:關閉; 1:開啟
ADC MIC Boost AMP gain control MIC增益 0–7, 0:0dB, 1~7:15–33dB
ADC PA speed select PA速度選擇 0:normal; 1:fast
ADC mixer mute for FML ADC Mixer設置,使能FML通路 0:關閉; 1:開啟
ADC mixer mute for FMR ADC Mixer設置,使能FMR通路 0:關閉; 1:開啟
ADC mixer mute for left output ADC Mixer設置,使能left output Mixer通路 0:關閉; 1:開啟
ADC mixer mute for linein ADC Mixer設置,使能linein通路 0:關閉; 1:開啟
ADC mixer mute for mic ADC Mixer設置,使能mic通路 0:關閉; 1:開啟
ADC mixer mute for right output ADC Mixer設置,使能right output Mixer通路
LINEIN GAIN control linein到output mixer的增益 0–7, 0~7:0–14dB,2dB/step

|MICIN GAIN control |MIC到outpu mixer的增益 0–7,表示-4.5–6dB |dac digital volume |DAC數字音量 0~63,表示0~-73.08dB,-1.16dB/step| |head phone volume |headphone音量 |0 表示mute, 1~63表示-62dB~0dB, -1dB/step|

錄音通路設置舉例:

錄音單聲道數據

通過MICIN錄音:

amixer -D hw:audiocodec cset name='ADC MIC Boost AMP en' 1

amixer -D hw:audiocodec cset name='ADC mixer mute for mic' 1

amixer -D hw:audiocodec cset name='ADC MIC Boost AMP gain control' 4

內部AEC(可省去外部AEC電路)

amixer -D hw:audiocodec cset name='ADC mixer mute for left ouput' 1

2.3.5 Daudio.

硬件特性

一路I2S/PCM;

支持主從模式

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

支持i2s,pcm協議格式配置

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

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

支持8~192KHz采樣率

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

2.3.5.1 內核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> <*> ASoC support for SUNXI ---> <*> ASoC support for daudio platform <*> ASoC support for sun3iw1 & ac101 daudio machine

2.3.5.2 sys_config配置.

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

snddaudio0配置,即daudio0 machine驅動的相關配置

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

daudio0配置,即daudio0 platform驅動的相關配置

snddaudio配置 snddaudio配置說明
daudio0_used 是否使用daudio驅動。 0 :不使用; 1 :使用
word_select_size 支持16bits/20bits/24bits/32bits
pcm_sync_period 16/32/64/128/256
snddaudio配置 snddaudio配置說明
pcm_lsb_first 0: msb first; 1: lsb first
over_sample_rate 支持128fs/192fs/256fs/384fs/512fs/768fs
slot_width_select 16bits/20bits/24bits/32bits
pcm_sync_type 0: long frame sync; 1: short frame sync
pcm_start_slot 0: 1st slot; 1: 2nd slot; 2: 3th slot; 3:4th slot
tdm_config 0:pcm 1:i2s

2.3.6 外掛codec:AC101

R6標案使用的AC101作雙聲道錄音,audiocodec則錄制回路作AEC下面對R6如何配置使 用AC101作簡單介紹

2.3.6.1 內核配置

Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> <*> AC101 Codec <*> ASoC support for SUNXI ---> <*> ASoC support for daudio platform <*> ASoC support for sun3iw1 & ac101 daudio machine

2.3.6.2 sys_config&dts配置.

R6通過TWI1控制AC101,而I2S0用于音頻數據的傳輸

TWI部分配置,可通過dts進行配置:

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

I2S部分配置可以通過dts配置,也可以通過sys_config覆蓋dts的配置

[snddaudio0] snddaudio0_used = 1 over_sample_rate = 128 sunxi,snddaudio-codec = "ac101.1-001a" sunxi,snddaudio-codec-dai = "ac101" [daudio0] daudio0_used = 1 word_select_size = 32 pcm_sync_period = 32 pcm_lsb_first = 0 over_sample_rate = 128 slot_width_select = 16 pcm_sync_type = 0 pcm_start_slot = 0 tdm_config = 1

i2s相關格式需要根據AC101 spec進行配置

而snddaudio0中,注意codec的名稱,需要與實際AC101的dev name相匹配,而codec-dai名稱則與AC101驅動中設置的dai name相匹配

2.3.7 標案音頻測試方法

該章節主要介紹在標案上進行播歌,錄音的測試命令。

2.3.7.1 播放

如《R6 AudioCodec數據通路》章節所說,驅動代碼中已固定配置了播放通路進入系統后直接通過aplay工具進行播放即可,如:

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

可通過下面命令調節硬件上的模擬音量:

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

2.3.7.2 錄音

標案使用AC101進行雙聲道錄音錄音前需要配置AC101的音頻通路,SDK默認在啟動時會進行設置,相關配置腳本在:

/etc/init.d/rc.final

可以直接通過arecord命令進行錄音:

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

2.4 R7s音頻接口

2.4.1 硬件資源

R7s包含 2 個音頻模塊,分別是內置AudioCodec以及Daudio0。

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

2.4.2 時鐘源

R7s中, 2 個音頻模塊的時鐘源均來自pll_audio。

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

圖2-6: R7s時鐘源

2.4.3 代碼結構

linux-4.9/sound/soc/sunxi/ ├── sunxi-pcm.c //提供注冊platform驅動的接口及相關函數集 ├── sunxi-pcm.h ├── sun8iw8 │ ├── sunxi_codec.c // cpudai驅動 │ ├── sunxi_codecdma.c // codec platform驅動 │ ├── sun8iw8_sndcodec_new.c // codec驅動 │ └── sunxi_sndcodec.c // codec machine驅動 ├── sunxi-daudio.c // daudio platform驅動 └── sunxi-snddaudio.c // daudio machine驅動 linux-4.9/sound/soc/soc-utils.c // daudio codec驅動

2.4.4 Audiocodec.

硬件特性

兩路DAC

支持16bit,24bit采樣精度

支持8KHz~192KHz采樣率

兩路ADC

支持16bit,24bit采樣精度

支持8KHz~48KHz采樣率

兩路模擬輸出:

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

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

兩路模擬輸入:MIC1,MIC2

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

支持ADC的AGC,DRC功能

支持DAC的DRC功能

2.4.4.1 內核配置

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

2.4.4.2 sys_config配置.

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

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

2.4.4.3 codec數據通路

圖2-7: R7s音頻通路

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

控件名稱 功能 數值
Lineout volume lineout音量設置 0–31,表示-43.5–0dB
ADC input gain control ADC增益 0–7,表示-4.5–6dB
HP_L Mux HP_L Mux設置 0:DACL HPL Switch; 1:MIXER_L Switch
HP_R Mux HP_R Mux設置 0:DACR HPR Switch; 1:MIXER_R Switch
LADC input Mixer MIC1 boost Switch LADC input Mixer設置,使能MIC1通路 0:關閉; 1:開啟
LADC input Mixer MIC2 boost Switch LADC input Mixer設置,使能MIC2通路 0:關閉; 1:開啟
LADC input Mixer l_output mixer Switch LADC input Mixer設置,使能l_output通路 0:關閉; 1:開啟
LADC input Mixer r_output mixer Switch LADC input Mixer設置,使能r_output通路 0:關閉; 1:開啟
Left Output Mixer DACL Switch Left Output Mixer設置,使能DACL通路 0:關閉; 1:開啟
Left Output Mixer DACR Switch Left Output Mixer設置,使能DACR通路 0:關閉; 1:開啟
Left Output Mixer MIC1Booststage Switch Left Output Mixer設置,使能MIC1通路 0:關閉; 1:開啟
Left Output Mixer MIC2Booststage Switch Left Output Mixer設置,使能MIC2通路 0:關閉; 1:開啟
MIC1 boost AMP gain control MIC1增益 0–7, 0:0dB,1~7:24–42dB,3dB/step
MIC1_G boost stageoutput mixer control MIC1 to L or R output Mixer增益 0–7,表示-4.5–6dB
MIC2 SRC MIC2 SRC設置 0:MIC3; 1:MIC2
MIC2 boost AMP gain control MIC2增益 0–7, 0:0dB,1~7:24–42dB,3dB/step
MIC2_G boost stage output mixer control MIC2 to L or R output Mixer增益 0–7,表示-4.5–6dB
RADC input Mixer MIC1 boost Switch RADC input Mixer設置,使能MIC1通路 0:關閉; 1:開啟
RADC input Mixer MIC2 boost Switch RADC input Mixer設置,使能MIC2通路 0:關閉; 1:開啟
RADC input Mixer l_output mixer Switch RADC input Mixer設置,使能l_output通路 0:關閉; 1:開啟
RADC input Mixer r_output mixer Switch RADC input Mixer設置,使能r_output通路 0:關閉; 1:開啟
Right Output Mixer DACL Switch Right Output Mixer設置,使能DACL通路 0:關閉; 1:開啟
Right Output Mixer DACR Switch Right Output Mixer設置,使能DACR通路 0:關閉; 1:開啟
Right Output Mixer MIC1Booststage Switch Right Output Mixer設置, 使能MIC1通路 0:關閉; 1:開啟
Right Output Mixer MIC2Booststage Switch Right Output Mixer設置,使能MIC2通路 0:關閉; 1:開啟
SPK_L Mux SPK_L Mux設置 0:MIXER_L Switch; 1:MIXR+MIXL
SPK_R Mux SPK_R Mux設置 0:MIXER_L Switch; 1:MIXR+MIXL
digital volume 數字音量設置 0–63,表示-73.08–0dB
headphone volume headphone音量設置 0–63,0表示mute; 1~63表示-62dB–0dB

通路設置舉例:

播放通路

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

錄音通路

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

2.4.5 Daudio.

硬件特性

一路I2S/PCM;

支持主從模式

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

支持i2s,pcm協議格式配置

支持mono和stereo模式

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

支持8~192KHz采樣率

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

2.4.5.1 內核配置

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

2.4.5.2 sys_config配置.

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

tdm0配置 tdm0配置說明
daudio_master 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作為slave, codec作為master2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRMmaster),一般不用3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frameslave),一般不用4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave
daudio_select 0: pcm mode; 1: i2s mode
audio_format 1: SND_SOC_DAIFMT_I2S(standard i2s format)2: SND_SOC_DAIFMT_RIGHT_J(right justfied format)3: SND_SOC_DAIFMT_LEFT_J(left justfied format)4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2ndBCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1ndBCLK rising edge after LRC rising edge)
signal_inversion 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame)2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM)3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM)4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM)
sample_resolution 采樣精度,16bit, 24bit,32bit
slot_width_select 支持8bit, 16bit, 32bit寬度
pcm_lrck_period 可配置16/32/64/128/256個bclk
pcm_lrckr_period 可配置16/32/64/128/256個bclk
msb_lsb_first 0: msb first; 1: lsb first
sign_extend 0: zero pending; 1: sign extend
tx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
rx_data_mode 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law
i2s_bclk i2s_bclk引腳
i2s_lrclk i2s_lrclk引腳
i2s_dout0 i2s_dout引腳
i2s_din i2s_din引腳

2.4.6 標案音頻測試方法

該章節主要介紹在標案上進行播歌,錄音的測試命令。

2.4.6.1 播放

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

可通過下面命令調節硬件上的模擬音量:

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

2.4.6.2 錄音

表示下使用audiocodec進行MIC1,MIC2錄音。

amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1 amixer -D hw:audiocodec cset name='RADC input Mixer MIC2 boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4 amixer -D hw:audiocodec cset name='MIC2 SRC' 0 amixer -D hw:audiocodec cset name='MIC2 boost AMP gain control' 4 arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 /tmp/test.wav

2.5 R11音頻接口

2.5.1 硬件資源

R11包含 2 個音頻模塊,分別是內置AudioCodec以及Daudio0。

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

2.5.2 時鐘源

R11中, 2 個音頻模塊的時鐘源均來自pll_audio。

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

圖2-9: R11時鐘源

2.5.3 代碼結構

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

2.5.4 AudioCodec

硬件特性

兩路DAC

支持16bit,24bit采樣精度

支持8KHz~192KHz采樣率

兩路ADC

支持16bit,24bit采樣精度

支持8KHz~48KHz采樣率

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

一路路模擬輸入:MIC1

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

支持ADC的AGC,DRC功能

支持DAC的DRC功能

2.5.4.1 內核配置

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

2.5.4.2 sys_config配置.

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

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

2.5.4.3 codec數據通路

圖2-10: R11音頻通路

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

控件名稱 功能 數值
Lineout volume lineout 音量設置0–31, 表示-43.5–0dB
ADC input gain control ADC 增益0–7, 表示-4.5–6dB
LADC input Mixer MIC1 boost Switch LADC input Mixer 設置,使能MIC 通路 0: 關閉; 1: 開啟
Left Output Mixer DACL Switch Left Output Mixer 設置,使能DACL 通路 0: 關閉; 1: 開啟
Left Output Mixer DACR Switch Left Output Mixer 設置,使能DACR 通路 0: 關閉; 1: 開啟
Left Output Mixer MIC1Booststage Switch Left Output Mixer 設置,使能MIC1 通路 0: 關閉; 1: 開啟
MIC1 boost AMP gain control MIC1 增益0–7, 0:0dB, 1~7:24–42dB,3dB/step
MIC1_G boost stage output mixer control MIC1 to L or R output Mixer 增益0–7, 表示-4.5–6dB
Right Output Mixer DACL Switch Right Output Mixer 設置,使能DACL 通路 0: 關閉; 1: 開啟
Right Output Mixer DACR Switch Right Output Mixer 設置, 使能DACR 通路 0: 關閉; 1: 開啟
Right Output Mixer MIC1Booststage Switch Right Output Mixer 設置, 使能MIC1 通路 0: 關閉; 1: 開啟
SPK_L Mux SPK_L Mux 設置0:MIXER_L Switch; 1:MIXR+MIXL
SPK_R Mux SPK_R Mux 設置0:MIXER_L Switch; 1:MIXR+MIXL
digital volume 數字音量設置0–63, 表示-73.08–0dB

通路設置舉例:

播放通路

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

錄音通路

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

2.5.5 Daudio.

硬件特性

一路I2S/PCM;

支持主從模式

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

支持i2s,pcm協議格式配置

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

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

支持8~192KHz采樣率

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

2.5.5.1 內核配置

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

2.5.5.2 sys_config配置.

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

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

deaudio_format |1: SND_SOC_DAIFMT_I2S(standard i2s format)2: SND_SOC_DAIFMT_RIGHT_J(right justfied format)3: SND_SOC_DAIFMT_LEFT_J(left justfied format)4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2ndBCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge)| |signal_inversion |1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame)2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM)3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM)4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM)| | sample_resolution |采樣精度,16bit, 24bit,32bit| | slot_width_select| 支持8bit, 16bit, 32bit寬度| | pcm_lrck_period |可配置16/32/64/128/256個bclk| | pcm_lrckr_period |可配置16/32/64/128/256個bclk| | msb_lsb_first |0: msb first; 1: lsb first| | sign_extend |0: zero pending; 1: sign extend| | tx_data_mode |0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law| | rx_data_mode |0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law| | i2s_bclk |i2s_bclk引腳| | i2s_lrclk |i2s_lrclk引腳| | i2s_dout0 |i2s_dout引腳| | i2s_din| i2s_din引腳|

2.5.6 標案音頻測試方法

該章節主要介紹在標案上進行播歌,錄音的測試命令。

2.5.6.1 播放

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

可通過下面命令調節硬件上的模擬音量:

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

2.5.6.2 錄音

表示下使用AudioCodec進行單聲道錄音

amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4 arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 1 /tmp/test.wav

2.6 R16音頻接口

2.6.1 硬件資源

R16包含 3 個音頻模塊,分別是內置AudioCodec,I2S0以及I2S1。

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

2.6.2 時鐘源

R16中, 3 個音頻模塊的時鐘源均來自pll_audio。

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

圖2-12: R16時鐘源

2.6.3 代碼結構

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

2.6.4 AudioCodec

硬件特性

兩路DAC

支持16bit,24bit采樣精度

支持8KHz~192KHz采樣率

兩路ADC

支持16bit,24bit采樣精度

支持8KHz~48KHz采樣率

兩路模擬輸出:

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

一路立體聲phoneout輸出(PHONEOUTP,PHONEOUTN)

四路路模擬輸入:MIC1,MIC2,linein,phonein

支持headphone驅動

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

2.6.4.1 內核配置

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

2.6.4.2 sys_config配置.

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

audio0配置 audio0配置說明
audio0 是否使用audiocodec驅動。 0 :不使用; 1 :使用
headphone_vol headphone volume,可設定范圍0~0x3f, 0表示mute,1~63表示-62dB~0dB, 1dB/step
pa_double_used 是否同時使用兩個DAC, 0 :不使用; 1 :使用
headphone_direct_used 是否使用headphone輸出, 0 :不使用; 1 :使用
main_mic_vol MIC1默認增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step
headset_mic_vol MIC2默認增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step
audio_pa_ctrl PA使能引腳
pa_gpio_reverse PA使能引腳是否顛倒, 0:正常,即high level active; 1:顛倒,即low level active
aif1_lrlk_div aif1的lrck分頻系數

2.6.4.3 codec數據通路

圖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相關控件如下表:

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

2.6.5 Daudio.

硬件特性

? 兩路I2S/PCM;

? 支持主從模式

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

支持i2s,pcm協議格式配置

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

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

支持8~192KHz采樣率

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

2.6.5.1 內核配置

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

2.6.5.2 sys_config配置.

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

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

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

2.6.6 標案音頻測試方法

該章節主要介紹在標案上進行播歌,錄音的測試命令。

2.6.6.1 播放

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

可通過下面命令調節硬件上的模擬音量:

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

2.6.6.2 錄音

表示下使用audiocodec進行單聲道錄音

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

2.7 R18音頻接口

2.7.1 硬件資源

R18包含 4 個音頻模塊,分別是內置AudioCodec以及Daudio0,Daudio1,Daudio2。

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

2.7.2 時鐘源

R18中, 4 個音頻模塊的時鐘源均來自pll_audio

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

圖2-15: R18時鐘源

2.7.3 代碼結構

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

2.7.4 AudioCodec

硬件特性

? 兩路DAC

支持16bit,24bit采樣精度

支持8KHz~192KHz采樣率

兩路ADC

支持16bit,24bit采樣精度

支持8KHz~48KHz采樣率

四路模擬輸出:

一路立體聲earpiece輸出(EAROUTP,EAROUTN)

一路立體聲phoneout輸出(PHONEOUTP,PHONEOUTN)

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

一路立體聲lineout輸出(LINEOUTL,LINEOUTR)

四路路模擬輸入:MIC1,MIC2,linein,phonein

支持headphone驅動

支持earpiece驅動

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

支持適用于DAC的DRC功能

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

2.7.4.1 內核配置

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

2.7.4.2 sys_config配置.

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

sndcodec配置,即machine驅動的相關配置

sndcodec配置 sndcodec配置說明
sndcodec_used 是否使用sndcodec驅動。 0 :不使用; 1 :使用
linein_detect linein檢測引腳
hp_detect_case jack irq level, 0:low; 1:high

codec配置,即內置audiocodec驅動的相關配置

codec配置 codec配置說明
codec_used 是否使用codec驅動。0 :不使用; 1 :使用
headphonevol headphone volume,可設定范圍0~0x3f, 0表示mute, 1~63表 示-62dB~0dB, 1dB/step
spkervol spk(lineout) volume,可設定范圍0~0x1f, 0或者 1 表示mute, 2~31 表示-43.5dB~0dB, 1.5dB/step
earpiecevol earpiece volume,可設定范圍0~0x1f, 0或者 1 表示mute, 2~31表 示-43.5dB~0dB, 1.5dB/step
maingain MIC1默認增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step
headsetmicgain MIC2默認增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step
adcagc_cfg 是否使用adcagc. 0:不適用; 1 :使用
adcdrc_cfg 是否使用adcdrc. 0:不適用; 1 :使用
adchpf_cfg 是否使用adchpf. 0:不適用; 1 :使用
dacdrc_cfg 是否使用dacdrc. 0:不適用; 1 :使用
dachpf_cfg 是否使用dachpf. 0:不適用; 1 :使用
aif1_lrlk_div aif1的lrck分頻系數
pa_sleep_time 使能pa之前等待的時間,單位ms
dac_digital_vol DACL/DACR數字音量,0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB, 0x98表示-6dB
codec配置 codec配置說明
gpio-spk PA使能引腳

2.7.4.3 codec數據通路

圖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相關控件如下表:

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

2.75 Daudio.

硬件特性

? 三路I2S/PCM;

? 支持主從模式

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

支持i2s,pcm協議格式配置

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

支持8~192KHz采樣率

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

2.7.5.1 內核配置

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

2.7.5.2 sys_config配置.

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

snddaudio0配置,即daudio0 machine驅動的相關配置

snddaudio配置 snddaudio配置說明
snddaudio0_used 是否使用snddaudio驅動。 0 :不使用; 1 :使用

daudio0配置,即daudio0 platform驅動的相關配置

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

具體Daudio外接codec,數字功放的配置,可參考《R18外掛codec:ac108》《R18外掛數字功放TAS5731》

2.7.6 SPDIF

硬件特性

? 支持S/PDIF_OUT

支持mono和stereo模式

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

支持16bit,24bit采樣精度

2.7.6.1 內核配置

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

2.7.6.2 sys_config配置.

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

spdif配置,即platform驅動的相關配置

spdif配置 spdif配置說明
spdif_used 是否使用spdif驅動。 0 :不使用; 1 :使用

sndspdif配置,即machine驅動的相關配置

sndspdif配置 sndspdif配置說明
sndspdif_used 是否使用sndspdif驅動。 0 :不使用; 1 :使用

sys_config中不需要配置codec驅動相關信息

因為machine驅動代碼中默認配置了”spdif-utils”作為codec驅動,代碼路徑:

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

2.7.7 外掛codec:AC108

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

下面對R18如何配置使用AC108作簡單介紹

2.7.7.1 內核配置

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

2.7.7.2 sys_config&dts配置.

R18通過twi1控制AC108,而i2s0用于音頻數據的傳輸

twi部分配置,可通過dts進行配置:

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

I2S部分需要配置sys_config以及dts

sys_config部分主要涉及i2s相關格式,需要根據AC108spec進行配置,sdk默認daudio0 配置可正常運行AC108

dts部分主要需要指定ASOC codec以及codec-dai驅動的名稱,如

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

2.7.7.3 使用

進入系統后,通過命令cat /proc/asound/cards列出當前聲卡信息,如果發現ac108相關聲 卡,說明已經正常加載驅動

無需額外設置音頻通路,可直接用下面命令進行錄音:

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

2.7.8 外掛數字功放TAS5731.

R18標案tulip-noma搭配了一片數字功放TAS5731

下面對R18如何配置使用tas5731作簡單介紹

2.7.8.1 內核配置

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

2.7.8.2 sys_config&dts配置.

R18通過TWI0控制數字功放,而I2S1用于音頻數據的傳輸

twi部分配置,可通過dts進行配置:

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

I2S部分需要配置sys_config以及dts

sys_config部分主要涉及i2s相關格式,需要根據具體數字功放進行配置,sdk默認daudio1 配置可正常運行tas5731

dts部分主要需要指定ASOC codec以及codec-dai驅動的名稱,如

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

2.7.8.3 使用

進入系統后,通過命令cat /proc/asound/cards列出當前聲卡信息,如果發現tas5731相關聲 卡,說明已經正常加載驅動

無需額外設置音頻通路,可直接用下面命令進行播歌:

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

2.7.9 HDMI音頻接口

R18使用I2S2將音頻數據傳輸到HDMI模塊,并且I2S2也只能用于HDMI。

2.7.9.1 內核配置

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

2.7.9.2 sys_config配置.

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

daudio2配置,即daudio2 platform驅動的相關配置

daudio2配置 daudio2配置說明
daudio2_used 是否使用daudio2驅動。 0 :不使用; 1 :使用

sndhdmi配置,即sndhdmi machine驅動的相關配置

sndhdmi配置 sndhdmi配置說明
sndhdmi_used 是否使用sndhdmi驅動。 0 :不使用; 1 :使用

2.7.10 標案音頻測試方法.

該章節主要介紹在標案上進行播歌,錄音的測試命令。

2.7.10.1播放

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

可通過下面命令調節硬件上的模擬音量:

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

2.7.10.2錄音

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

2.8 R30音頻接口

2.8.1 硬件資源

R30包含 5 個音頻模塊,分別是內置AudioCodec,Daudio0,Daudio1,Daudio2以及Dmic

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

2.8.2 時鐘源

R30中, 5 個音頻模塊的時鐘源均來自pll_audio。

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

圖2-18: R30時鐘源

2.8.3 代碼結構

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

2.8.4 AudioCodec

硬件特性

? 兩路DAC

支持16bit,24bit采樣精度

支持8KHz~192KHz采樣率

兩路ADC

支持16bit,24bit采樣精度

支持8KHz~48KHz采樣率

四路模擬輸出:

一路立體聲earpiece輸出(EAROUTP,EAROUTN)

一路立體聲phoneout輸出(PHONEOUTP,PHONEOUTN)

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

一路立體聲lineout輸出(LINEOUTL,LINEOUTR)

四路路模擬輸入:MIC1,MIC2,linein,phonein

支持headphone驅動

支持earpiece驅動

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

支持適用于DAC的DRC功能

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

2.8.4.1 內核配置

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

2.8.4.2 sys_config配置.

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

sndcodec配置,即machine驅動的相關配置

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

I2S配置,即audiocodec platform驅動的相關配置,內部aif接口用的I2S(與I2S0,I2S1接口無關)

i2s配置 i2s配置說明
i2s_used 是否使用i2s驅動。 0 :不使用; 1 :使用

codec配置,即內置audiocodec驅動的相關配置

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

2.8.4.3 codec數據通路

圖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相關控件如下表:

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

2.8.5 Daudio.

硬件特性

? 三路I2S/PCM;

? 支持主從模式

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

支持i2s,pcm協議格式配置

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

支持8~192KHz采樣率

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

2.8.5.1 內核配置

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

2.8.5.2 sys_config配置.

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

snddaudio0配置,即daudio0 machine驅動的相關配置

snddaudio配置 snddaudio配置說明
snddaudio0_used 是否使用snddaudio驅動。 0 :不使用; 1 :使用

daudio0配置,即daudio0 platform驅動的相關配置

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

2.8.6 DMIC

硬件特性

? 支持 8 路輸入

支持8~48KHz采樣率

支持16/24bit采樣精度

2.8.6.1 內核配置

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

2.8.6.2 sys_config配置.

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

dmic配置,即platform驅動的相關配置

dmic配置 dmic配置說明
dmic_used 是否使用dmic驅動。 0 :不使用; 1 :使用

snddmic配置,即machine驅動的相關配置

snddmic配置 snddmic配置說明
snddmic_used 是否使用snddmic驅動。 0 :不使用; 1 :使用

2.8.7 標案音頻測試方法

該章節主要介紹在標案上進行播歌,錄音的測試命令。

2.8.7.1 播放

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

2.8.7.2 錄音

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

2.9 R328音頻接口.

2.9.1 硬件資源

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

另外還支持MAD作語音喚醒檢測(詳細請看R328 MAD章節)。

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

2.9.2 時鐘源.

R328中, 6 個音頻模塊的時鐘源均來自pll_audio。

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

圖2-35: R328時鐘源

2.9.3 代碼結構

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

2.9.4 AudioCodec

硬件特性

? 一路DAC

支持16bit,24bit采樣精度

支持8KHz~192KHz采樣率

三路ADC

支持16bit,24bit采樣精度

支持8KHz~48KHz采樣率

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

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

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

DAC及ADC均支持 5 段DRC

DAC FIFO長度12824bits, ADC FIFO長度12824bits

2.9.4.1內核配置

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

2.9.4.2 sys_config配置

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

sndcodec配置,即machine驅動的相關配置

sndcodec配置 sndcodec配置說明
sndcodec_used 是否使用sndcodec驅動。 0 :不使用; 1 :使用

cpudai配置,即platform驅動的相關配置

cpudai配置 cpudai配置說明
cpudai_used 是否使用cpudai驅動。 0 :不使用; 1 :使用

codec配置,即內置audiocodec驅動的相關配置

codec配置 codec配置說明
codec_used 是否使用codec驅動。 0 :不使用; 1 :使用
digital_vol 初始化digital volume,可設定范圍0~0x3f,表示0~-73.08dB, -1.16dB/step
lineout_vol lineout volume,可設定范圍0~0x1f,表示-43.5dB~0dB, 1.5dB/step
mic1gain mic1增益,可設定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般設置0x4,即24dB
mic2gain mic2增益,可設定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般設置0x4,即24dB
mic3gain mic3增益,可設定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般設置0x4,即24dB.如果作為aec回路,則需要設置為0dB
adcgain adc增益,可設定范圍0~0x7,表示-4.5~6dB, 1.5dB/step,一般設置 0x3,即0dB
adcdrc_cfg 是否使用adcdrc. 0:不適用; 1 :使用
adchpf_cfg 是否使用adchpf. 0:不適用; 1 :使用
dacdrc_cfg 是否使用dacdrc. 0:不適用; 1 :使用
dachpf_cfg 是否使用dachpf. 0:不適用; 1 :使用
pa_ctl_level PA引腳使能方式。0:低電平有效; 1 :高電平有效
pa_msleep_time 操作PA之后的延時時間(用來避免pop音)
gpio-spk PA使能引腳

說明

如果想要正常加載 audiocodec 聲卡,需要把 codec,platform,machine 驅動都選上,即 codec_used,cpudai_used,sndcodec_used 都置為 1

digital_vol,lineout_vol 等值會在驅動初始化的時候設置,進入系統后還可以通過 amixer 工具對應控件進行再次修改;

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

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

2.9.4.3 codec數據通路

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

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

? 注釋 1

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

? 注釋 2

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

? 注釋 3

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

? 注釋 4

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

通路設置舉例:

播放通路

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

錄音通路

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

常用AEC通路

有兩種AEC回路方式,具體看硬件如何設計 1)外部AEC MIC1,MIC2錄音;MIC3作為AEC,外部SPKP/N連接到MIC3. amixer -D hw:audiocodec cset name='Left Input Mixer MIC1 Boost Switch' 1 amixer -D hw:audiocodec cset name='Right Input Mixer MIC2 Boost Switch' 1 amixer -D hw:audiocodec cset name='Xadc Input Mixer MIC3 Boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 gain volume' 4 amixer -D hw:audiocodec cset name='MIC2 gain volume' 4 amixer -D hw:audiocodec cset name='MIC3 gain volume' 0 2)內部AEC(可省去外部AEC電路) MIC1,MIC2錄音;MIC3作為AEC,使能內部DACL到MIC3的通路. amixer -D hw:audiocodec cset name='Left Input Mixer MIC1 Boost Switch' 1 amixer -D hw:audiocodec cset name='Right Input Mixer MIC2 Boost Switch' 1 amixer -D hw:audiocodec cset name='Xadc Input Mixer DACL Switch' 1 amixer -D hw:audiocodec cset name='MIC1 gain volume' 4 amixer -D hw:audiocodec cset name='MIC2 gain volume' 4

2.14.5 Daudio

硬件特性

? 三路I2S/PCM,可用于藍牙通話,語音采集,數字功放;

? 支持主從模式

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

支持i2s,pcm協議格式配置

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

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

支持8~192KHz采樣率

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

支持 3 路MCLK輸出

2.14.5.1內核配置

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

2.14.5.2 sys_config配置

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

snddaudio0配置,即daudio0 machine驅動的相關配置

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

daudio0配置,即daudio0 platform驅動的相關配置

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

注意事項:

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

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

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

例如daudio2與bluetooth模組相連(沒有實際的codec驅動),那么這時候codec

name, codec dai name需要配置為dummy codec,可以如下配置: [snddaudio2] snddaudio2_used = 1 sunxi,snddaudio-codec = "snd-soc-dummy" sunxi,snddaudio-codec-dai = "snd-soc-dummy-dai" daudio_master = 1 audio_format = 5 signal_inversion = 2 因為驅動中解析snddaudio-codec等字段時,判斷出錯的時候則使用默認codec"snd-soc-dummy", 所以如果sunxi,snddaudio-codec和sunxi,snddaudio-codec-dai不配置,或者配置為空的時候, 則默認使用dummy codec: [snddaudio2] snddaudio2_used = 1 daudio_master = 1 audio_format = 5 signal_inversion = 2 或者 [snddaudio2] snddaudio2_used = 1 sunxi,snddaudio-codec = sunxi,snddaudio-codec-dai = daudio_master = 1 audio_format = 5 signal_inversion = 2

2.14.6 Dmic

硬件特性

? 支持 8 路輸入

支持8~48KHz采樣率

支持16/24bit采樣精度

2.14.6.1內核配置

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

2.14.6.2 sys_config配置

配置如下:

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

dmic配置,即platform驅動的相關配置

dmic配置 dmic配置說明 dmic_used 是否使用dmic驅動。 0 :不使用; 1 :使用

snddmic配置,即machine驅動的相關配置

snddmic配置 snddmic配置說明 snddmic_used 是否使用snddmic驅動。 0 :不使用; 1 :使用

sys_config中不需要配置codec驅動相關信息

因為machine驅動代碼中默認配置了”dmic-codec”作為codec驅動,代碼路徑:

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

2.14.7 SPDIF

硬件特性

? 支持S/PDIF_OUT和S/PDIF_IN

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

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

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

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

2.14.7.1內核配置

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

2.14.7.2 sys_config配置

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

spdif配置,即platform驅動的相關配置

spdif配置 spdif配置說明| spdif_used 是否使用spdif驅動。 0 :不使用; 1 :使用|

sndspdif配置,即machine驅動的相關配置

sndspdif配置sndspdif配置說明

sndspdif_used是否使用sndspdif驅動。 0 :不使用; 1 :使用

sys_config中不需要配置codec驅動相關信息

因為machine驅動代碼中默認配置了”spdif-utils”作為codec驅動,代碼路徑:

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

2.14.8 MAD

硬件特性

支持三路I2S,一路DMIC PCM音頻傳輸接口,時分復用,固定16bit

支持16KHz,48KHz采樣率

支持基于能量識別的語音檢測模塊LPSD

支持一塊128KB的SRAM,可用于保存音頻數據

2.14.8.1內核配置

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

2.14.8.2 sys_config配置

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

mad配置 mad配置說明
mad_used 是否使用mad驅動。 0 :不使用; 1 :使用

2.14.8.3 mixer控件說明

mad綁定到I2S

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

mad綁定到dmic

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

2.14.8.4使用說明

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

應用上需要使能MAD相關的mixer control。

I2S設置舉例,例如使用的是AC108:

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

DMIC設置舉例:

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

然后應用正常進行錄音即可,如果需要進入休眠,有下面幾點必須實現的:

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

設置wakeup_count。更新當前喚醒次數;

進入休眠。寫mem到/sys/power/state即可;

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

make menuconfig選中mad-demo軟件包

Allwinner ---> <*> mad-demo

執行mad-ac108-demo,默認配置(腳本/usr/bin/mad-ac108-demo上設定了默認配置):

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

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

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

執行mad-dmic-demo,默認配置(腳本/usr/bin/mad-dmic-demo上設定了默認配置):

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

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

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

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

2.14.8.5能量喚醒閾值參數

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

lpsd_rrun和lpsd_rstop的推薦值:

lpsd_rrun lpsd_rstop
77 88
77 108
77 128
77 148

瞬時能量檢測參數,主要是lpsd_rrun和lpsd_rstop。

一般我們只對stop值進行修改;

如果錄音數據經常缺少喚醒詞的第一個字,則可以嘗試降低stop值,可以有效提高喚醒詞數據 的完整性。但同時會提高誤喚醒率,環境噪音也會很容易觸發能量檢測,喚醒系統;

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

喚醒詞識別率以及誤喚醒率無法同時兼得,客戶需要根據實際需求、場景,權衡配置參數;

累積能量檢測參數,主要是lpsd_th。

? 我們建議使用默認值 1200 。建議修改范圍50~1200;

2.14.8.6注意事項

MAD綁定動作,需要在應用打開聲卡前就設置好;

應用操作上的一些要求,具體請查看《MAD使用說明》章節;

如果讀取wakeup_count時一直阻塞,說明當前仍有wake_lock處于激活狀態,例如usb 線連接著PC,usb驅動會保持一個wake_lock,不讓系統進入休眠,所以需要拔掉usb或 者連接到usb適配器上,或者改動代碼,去掉usb驅動中wake_lock的使用;

2.14.9 VAD.

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

VAD完整的數據通路:

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

2.14.9.1內核配置

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

2.14.9.2 sys_config配置

需要使能MAD配置:

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

mad配置 mad配置說明
mad_used 是否使用mad驅動。 0 :不使用; 1 :使用

2.14.9.3 mixer控件說明

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

注意:

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

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

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

設置舉例:

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

2.14.9.4使用說明

VAD的使用與MAD類似。

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

應用上除了打開內部audiocodec的錄音通路之外,還需要下面一些配置:

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

然后應用正常進行錄音即可,如果需要進入休眠,有下面幾點必須實現的:

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

設置wakeup_count。更新當前喚醒次數

進入休眠。寫mem到/sys/power/state即可

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

Allwinner ---> <*> mad-demo

執行vad-demo,默認配置(腳本/usr/bin/vad-demo上設定了默認配置):

? 使用I2S1

錄制 2 通道,16bit, 16K

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

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

2.14.9.5注意事項

VAD同樣需要注意MAD注意事項章節中提到的幾點。

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

2.14.10標案音頻測試方法.

該章節主要介紹在標案上進行播歌,錄音的測試命令

2.14.10.1播放

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

2.14.10.2錄音

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

####

2.20 V853音頻接口

V853包含多個音頻模塊,分別是內置AudioCodec,I2S0,I2S1,DMIC。

2.20.1 時鐘源.

V853中,音頻模塊的時鐘源來自pll_audio0。

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

圖2-48: V853時鐘源

2.20.2 代碼結構

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

2.20.3 AudioCodec

2.20.3.1硬件特性

? 一路DAC

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

支持8KHz~192KHz采樣率

兩路ADC

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

支持8KHz~48KHz采樣率

一路模擬輸出:

一路立體聲輸出LINEOUT,支持single/differ

兩路模擬輸入:MIC1,MIC2

MIC支持single/differ,

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

DAC及ADC均支持DRC

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

2.20.3.2內核配置

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

2.20.3.3 DTS配置.

2.20.3.3.1 DeviceTree 配置說明 設備樹為芯片平臺的模塊配置,面對芯片特性進行配 置,設備樹文件的路徑為:lichee/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi

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

配置項說明(僅對常用項進行展開):

AudioCodec模塊由 3 個設備樹節點構建。

ASoC層codec: codec

?

表2-128: AudioCodec codec節點配置項(linux4.9)

?

配置項名稱 配置項說明
#sound-dai-cells machine層檢測codec和platform節點的標志
reg 設置audiocodec寄存器起始地址和地址長度
clocks 設置audiocodec所需的時鐘源和模塊時鐘

ASoC層platform: codec_plat

?

表2-129: AudioCodec codec_plat節點配置項(linux4.9)

?

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

ASoC層machine: codec_mach

?

表2-130: AudioCodec codec_mach節點配置項(linux4.9)

?

配置項名稱 配置項說明
soundcard- mach machine層配置前綴
name 聲卡名字
pin-switches 用于定義模塊接口開關(需參考驅動代碼dapm進行設定)
routing 用于定義模塊接口開關所鏈接的dapm通路(需參考驅動代碼dapm進 行設定)
cpu machine層所綁定的cpu節點(即platform層),用sound-dai屬 性指定節點
codec machine層所綁定的codec節點(即codec層),用sound-dai屬 性指定節點
pll-fs 指定模塊時鐘源頻率(24.576M or 22.5792M * pll-fs)

2.20.3.3.2 board.dts板級配置說明

board.dts用于保存板級平臺設備差異化的信息的補充,面對 板型特性 進行配置,其配置信息會覆蓋device tree默認配置信息,board.dts文件的路徑為:/device/config/chips/v853/configs/{BOARD}/board.dts

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

配置項介紹:

?

表2-131: AudioCodec模塊板級配置項

?

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

2.20.3.4 codec數據通路

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

V853所有控件如下表:

?

表2-132: amixer控件表

?

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

2.20.4 Daudio

2.20.4.1硬件特性

? 兩路I2S/PCM,可用于藍牙通話,語音采集,數字功放;

? 支持主從模式

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

支持i2s,pcm協議格式配置

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

支持8~192KHz采樣率

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

支持 2 路MCLK輸出

2.20.4.2內核配置

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

2.20.4.3 DTS配置.

2.20.4.3.1 DeviceTree 配置說明 設備樹為芯片平臺的模塊配置,面對芯片特性進行配置,設備樹文件的路徑為:lichee/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi

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

配置項說明(僅對常用項進行展開):

I2S/PCM模塊由 2 個或 3 個設備樹節點構建。

ASoC層codec:非必須節點,若無,則綁定虛擬codec節點。

ASoC層platform: daudio(n)_plat

?

表2-133: I2S/PCM daudio(n)_plat節點配置項(linux4.9)

?

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

ASoC層machine: daudio(n)_mach

?

表2-134: I2S/PCM daudio(n)_mach節點配置項(linux4.9)

?

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

說明

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

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

2.20.4.3.2 board.dts板級配置說明 board.dts用于保存板級平臺設備差異化的信息的補 充,面對 板型特性 進行配置,其配置信息會覆蓋device tree默認配置信息,board.dts文件的 路徑為:/device/config/chips/v853/configs/{BOARD}/board.dts

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

配置項介紹:

?

表2-135: I2S/PCM模塊板級配置項

?

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

2.20.5 DMIC.

硬件特性

? 支持 4 路輸入

支持8~48KHz采樣率

支持16/24bit采樣精度

2.20.5.1內核配置

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

2.20.5.2 DTS配置.

2.20.5.2.1 DeviceTree 配置說明 設備樹為芯片平臺的模塊配置,面對芯片特性進行配 置,設備樹文件的路徑為:lichee/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi

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

配置項說明(僅對常用項進行展開):

DMIC模塊由 2 個設備樹節點構建。

ASoC層codec:無,綁定虛擬codec節點。

ASoC層platform: dmic_plat

?

表2-136: DMIC dmic_plat節點配置項(linux4.9)

?

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

ASoC層machine: dmic_mach

?

表2-137: DMIC dmic_mach節點配置項(linux4.9)

?

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

2.20.5.2.2 board.dts板級配置說明 board.dts用于保存板級平臺設備差異化的信息的補 充,面對 板型特性 進行配置,其配置信息會覆蓋device tree默認配置信息,board.dts文件的 路徑為:/device/config/chips/v853/configs/{BOARD}/board.dts

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

配置項介紹:

?

表2-138: DMIC模塊板級配置項

?

配置項名稱 配置值范圍 配置項說明
status “okay”, “disabled” 使能或關閉該節點驅動
rx-sync-en 注釋為false,反之為 ture 選擇是否注冊rxsync控件
avcc- supply 注釋,引用pmu提供的 電源節點 avcc若為外部pmu供電,可選擇該項指定對應的 pmu電源

2.20.6 RX_SYNC多聲卡同步功能

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

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

AudioCodec, I2S, DMIC均可以使用RX_SYNC功能,除了它們對應的驅動配置外,還需要額外配置內核,dts等地方。

2.20.6.1內核配置

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

2.20.6.2 dts配置.

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

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

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

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

2.20.7 標案音頻測試方法.

該章節主要介紹在標案上進行播歌,錄音的測試命令

2.20.7.1播放

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

2.20.7.2錄音

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

2.21 F133音頻接口

F133包含多個音頻模塊,分別是內置AudioCodec,I2S1,I2S2,DMIC,SPDIF。

2.21.1 時鐘源.

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

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

2.21.2 AudioCodec

2.21.2.1硬件特性

? 兩路DAC

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

支持8KHz~192KHz采樣率

三路ADC

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

支持8KHz~48KHz采樣率

模擬輸出:

一路立體聲輸出HPOUTL,HPOUTR

模擬差分輸入:

一路差分麥克風輸入MIC3P/N

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

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

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

DAC及ADC均支持DRC

2.21.2.2內核配置

kernel_menuconfig配置

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

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

2.21.2.3 DTS配置.

board.dts板級配置

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

部分配置項名稱 配置取值 配置項說明
mic3gain 0-31 mic3增益
digital_vol 0-63 DAC數字音量
headphonegain 0-7 耳機播放增益
pa_level 0-1 功放芯片使能電平
pa_pwr_level 0-1 功放供電使能電平
pa_msleep_time u32,一般小于 200 x u32,一般小于 200 設置功放芯片使能所需sleep時間
status “okay”/“disable” 使能或者關閉本節點

2.21.3 Daudio

2.21.3.1硬件特性

? 兩路I2S/PCM I2S1 I2S2

支持8-192k采樣率

支持16 24 32采樣精度

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

支持 5 種TDM模式

I2S standard mode

Left-justified mode

Right-justified mode

DSP-A mode(short frame PCM mode)

DSP-B mode(long frame PCM mode)

支持回環模式

支持同時playback和capture

支持多聲卡同步錄音

2.21.3.2內核配置

kernel_menuconfig配置

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

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

2.21.3.3 DTS配置.

board.dts板級配置

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

設備樹配置sun20iw1p1.dtsi

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

部分配置項名稱 配置取值 配置項說明
status “okay” “disable” 使能或者關閉snddaudio驅動
mclk_div 0-192 mclk分頻系數,取值為 0/1/2/4/8/12/16/24/32/48/64/96/128/176/192
frametype 0-1 0:short frame(1 clock width) 1:long frame(2 clock width)
tdm_config 0-1 0:PCM mode 1:I2S mode
sign_extend 0-1 0:zero pending 1:sign extend
msb_lsb_first 0-1 0:msb first 1:lsb first
pcm_lrck_period 16/32/64/128/256 一般可配置為16/32/64/128/256個 bclk
slot_width_select 8/16/32 slot支持8/16/32bit寬度
tx_data_mode 0/1/2/3 0:16bit linear PCM 1:reserved 2:8bit u-law 3:8bit a-law
rx_data_mode 0/1/2/3 0:16bit linear PCM 1:reserved 2:8bit u-law 3:8bit a-law
simple-audio-card,name string 聲卡名稱
simple-audio-card,format string I2S tdm模式,取值為 “i2s”/“right_j”/“left_j”/“dsp_a”/“dsp_b”
simple-audio-card,frame- master 注釋為false,反 之為true 配置frame clk主從關系,不配置則 soc為主,反之soc為從
simple-audio-card,bitclock- master 注釋為false,反 之為true 配置bit clk主從關系,不配置則soc為 主,反之soc為從
simple-audio-card,frame- inversion 注釋為false,反 之為true 配置frame clk極性取反;不配置則是正 常極性
simple-audio-card,bitclock- inversion 注釋為false,反 之為true 配置bit clk極性取反;不配置則是正常 極性
simple-audio- card,capture_only 注釋為false,反 之為true 僅支持錄音
simple-audio- card,playback_only 注釋為false,反 之為true 僅支持播放

2.21.4 DMIC.

2.21.4.1硬件特性

支持8-48k采樣率

支持16 24采樣精度

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

支持多聲卡同步錄音

2.21.4.2內核配置

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

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

2.21.4.3 DTS配置.

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

部分配置項名稱 配置取值 配置項說明
status “okay”/“disable” 使能或者關閉本節點
rx_sync_en 注釋為false反之為true 是否注冊rx_sync組件

2.21.5 SPDIF

2.21.5.1硬件特性

支持22.05-192k采樣率

支持16 24采樣精度

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

支持多聲卡同步錄音

支持回環模式

支持IEC-60958協議

支持IEC-61937協議

2.21.5.2內核配置

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

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

2.21.5.3 DTS配置.

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

部分配置項名稱 配置取值 配置項說明
status “okay” “disable” 使能或者關閉本節點
rx_sync_en 注釋為false反之為true 是否注冊rx_sync組件

2.21.6 標案音頻測試方法.

該章節主要介紹在標案上進行播歌,錄音的測試命令

2.21.6.1播放

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

2.21.6.2錄音

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

2.配置I2S Loopback功能:amixer -D hw:snddaudio2 cset name='sunxi daudio loopback debug' 1 3.開始錄音:arecord -D hw:snddaudio2 -f S16_LE -r 44100 -c 2 /tmp/test_su.wav --period-size 1024 --buffer-size 4096 & 4.開始播放:aplay -D hw:snddaudio2 /tmp/16000.wav 5.aplay播放結束后,killall arecord結束錄音任務 6.通過adb命令把test_su.wav拉出來,在PC端查看音頻數據是否跟播放的內容一致

3 3常用工具及調試方法

3.1 3.1 alsa-utils

標準ALSA工具,它使用到alsa-lib標準庫,一般常用到的有amixer,aplay,arecord等。

3.1.1 3.1.1 amixer

amixer是命令行的ALSA聲卡驅動調節器工具,用于設置mixer control。

使用方法:

? 常用選項

選項 功能
-D,--device 指定聲卡設備,默認使用defaul

? 常用命令

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

舉例:

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

3.1.2 3.1.2 aplay

aplay是命令行的ALSA聲卡驅動的播放工具,用于播放功能。

使用方法:

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

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

舉例:

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

3.1.3 3.1.3 arecord.

arecord是命令行的ALSA聲卡驅動的錄音工具,用于錄音功能。

使用方法:

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

舉例:

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

3.1.4 3.1.4 alsaconf

alsaconf指的是ALSA configuration file,使用alsa-lib打開聲卡,操作pcm, mixer時,會 加載相關位置上的配置文件,用于指導操作pcm,mixer設備。

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

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

這里設定了一個鉤子,去讀取相關目錄配置文件:

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

這些配置文件可以設定defaut聲卡,自定義pcm設備,alsa插件等功能,具體可以參考:

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

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

tina sdk下有相關軟件包會設置/etc/asound.conf,可以用作參考。

使用方法:

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

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

它會生成/etc/asound.conf文件,下面作簡單介紹:

設定amixer操作的defautl聲卡(執行snd_hctl_open會獲取該配置) ctl.!default { type hw card audiocodec } 設定default聲卡(執行snd_pcm_open會獲取該配置) pcm.!default { type asym playback.pcm "PlaybackDmix" capture.pcm "CaptureDsnoop" } 使用dmix插件,可以混合播歌,即支持多次打開聲卡進行播歌 pcm.PlaybackDmix { type plug slave.pcm { type dmix ipc_key 1111 ipc_perm 0666 slave { pcm "hw:audiocodec" rate 48000 channels 2 } } } 使用dsnoop插件,可以混合錄音,即支持多次打開聲卡進行錄音 pcm.CaptureDsnoop { type plug slave.pcm { type dsnoop ipc_key 1111 ipc_perm 0666 slave { pcm "hw:audiocodec,0" rate 48000 channels 2 } } } 使用dmix插件以及softvol插件,softvol插件可以增加一個control,用于控制音量(軟件上作調節) pcm.PlaybackDmix { type plug slave.pcm { type softvol slave.pcm { type dmix ipc_key 1111 ipc_perm 0666 slave { pcm "hw:audiocodec,0" rate 48000 channels 1 } } control { name "Soft Volume Master" card audiocodec } min_dB -51.0 max_dB 0.0 resolution 256 } }

3.2 3.2 tinyalsa-utils.

tinyalsa是alsa-lib的一個簡化版。它提供了pcm和control的基本接口;沒有太多太復雜的 操作、功能。可以按需使用接口。tinyalsa-utils是基于tinyalsa的一些工具,下面對幾個常用 的工具作介紹。

3.2.1 3.2.1 tinymix

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

? 常用選項

選項 功能
-D,–card 指定聲卡設備,默認使用card0

? 常用命令

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

舉例:

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

3.2.2 3.2.2 tinyplay

與aplay作用類似,用于操作聲卡設備進行播放

? 常用選項

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

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

舉例:

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

3.2.3 3.2.3 tinycap

與arecord作用類似,用于操作聲卡進行錄音功能

? 常用選項

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

舉例:

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

3.3 3.3 dump寄存器

我們sunxi平臺均提供了sunxi_dump驅動,用于查看讀寫寄存器。

節點位于/sys/class/sunxi_dump目錄。

但是audiocodec模擬寄存器的操作會有些特殊,我們一般在audio驅動中都會增加相關調試節 點,去操作自己模塊的寄存器,以便調試。

3.3.1 3.3.1 dump audiocodec寄存器

audiocodec驅動的寄存器調試節點位于:

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

使用方法:

通過echo寫入下列參數

參數1: 0-read; 1-write

參數2: 1-digitar reg; 2-analog reg

參數3: reg value

參數4: write value

舉例:

查看所有寄存器狀態:

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

查看某個數字寄存器狀態:

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

查看某個模擬寄存器狀態:

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

改寫某個數字寄存器:

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

改寫某個模擬寄存器:

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

3.3.2 3.3.2 dump daudio寄存器

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

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

可以通過sunxi_dump節點查詢寄存器狀態,例如查看i2s0的寄存器:

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

3.3.3 3.3.3 dump dmic寄存器

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

dmic: 0x05095000

可以通過sunxi_dump節點查詢寄存器狀態:

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

3.3.4 3.3.4 dump spdif寄存器

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

spdif: 0x05093000

可以通過sunxi_dump節點查詢spdif寄存器狀態:

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

3.4 3.4 sound procfs.

通過procfs文件系統下面的聲卡相關節點,可以得到各個聲卡各個音頻流的狀態。實際調試中會 非常有用。

內核需要選中下面選項才能在procfs下生成對應節點:

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

以card0為例看下提供的節點信息:

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

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

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

從period_size可以知道當前dma中斷頻率,太快會影響系統響應速度,太慢可能就存在一 定延時。

buffer_size可以知道緩存區大小,太小容易因調度不及時出現xrun,太大同樣存在一定延時。

從hw_ptr, appl_ptr可以知道當前錄音/播音的幀數,是否發生過xrun等。

4 4常用接口說明

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

4.1 4.1 control接口

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

主要涉及到的接口:

snd_ctl_open snd_ctl_elem_info_get_id snd_ctl_elem_info_set_id snd_ctl_elem_info snd_ctl_ascii_value_parse snd_ctl_elem_read snd_ctl_elem_write snd_ctl_close

詳細control接口說明請查閱:

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

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

下面是一個設置音量接口的例子:

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

}

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

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

4.2 4.2 PCM接口.

為了方便操作訪問,alsa-lib中封裝了相關接口,通過pcmCXDXp/pcmCXDXc節點(/dev/s- nd/pcmCXDXx)去實現播放、錄音功能。

主要涉及到的接口:

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

詳細pcm接口說明請查閱:

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

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

接口使用例子可以參考aplay,arecord的實現,代碼可以在alsa-utils中找到(dl/alsa-utils- 1.1.0.tar.bz2)

5 開機音樂功能

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

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

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

5.1 配置方法

修改uboot配置文件

可修改默認配置configs/sun8iw18p1_defconfig增加下面幾項 CONFIG_SOUND_SUNXI_SOC_RWFUNC=y CONFIG_SOUND_SUNXI_SUN8IW18_CODEC=y CONFIG_SOUND_SUNXI_BOOT_TONE=y

也可以通過kconfig進行配置lichee/brandy-2.0/u-boot-2018目錄下執行makemenu- config ARCH=arm,選上對應功能項:選中sun8iw18的codec驅動以及開機音樂功能

5-1-1

修改sys_config文件

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

創建boottone分區

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

修改env配置文件

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

將內核AudioCodec驅動編譯成模塊

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

5.2 注意事項

uboot退出時,不能關掉dma。如果發生在跳轉kenrel時聲音變化或消失,請確認跳轉到內 核前是否調用了sunxi_dma_exit();

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

可以在dts中,將該片內存改為reserve屬性,可以確保kernel不會使用到。

選用kernel初始化不會用到的內存塊

可以在uboot命令行下執行boottone命令進行調試

6 各平臺音頻模塊注意事項

6.1 R328.

只有一個DAC,所以在播放兩通道數據的時候,硬件上會將第二個通道的數據丟掉。如果想

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

使用模擬mic作AEC時,需要將該MIC gain設置為0dB.如果有增益,則會導致錄音開始及結束時產生pop音(開關PA產生的pop音,經過差分MIC消除后仍然存在極小的雜音,如果再經過MIC增益放大,則會變為明顯的pop音)

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 音頻
    +關注

    關注

    29

    文章

    2834

    瀏覽量

    81356
  • Linux
    +關注

    關注

    87

    文章

    11229

    瀏覽量

    208931
  • 開發指南
    +關注

    關注

    0

    文章

    34

    瀏覽量

    7531
  • 音頻模塊
    +關注

    關注

    1

    文章

    144

    瀏覽量

    12308
  • Tina
    +關注

    關注

    2

    文章

    45

    瀏覽量

    16957
收藏 人收藏

    評論

    相關推薦

    Tina_Linux系統裁剪開發指南

    Tina_Linux系統裁剪開發指南1 概述2 Tina系統裁剪簡介2.1 boot0裁剪2.2 uboot裁剪2.3 內核裁剪2.3.1 刪除不使用的功能2.3.2 刪除不使用的驅動2.3.3
    的頭像 發表于 03-06 09:52 ?1514次閱讀

    EAC0945 linux開發指南

    EAC0945 linux開發指南
    發表于 09-28 12:40

    EAC0945 linux開發指南

    `EAC0945 linux開發指南`
    發表于 10-31 12:18

    Rockchip Linux SDK uboot logo開發指南

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

    Tiny6410 Linux開發指南詳解

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

    A64開發板LCD開發指南

    A64開發板LCD開發指南,驅動開發指南
    發表于 06-21 17:02 ?0次下載

    彩光燈開發指南

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

    Linux的平臺下Mini210S裸機程序開發指南

    Linux的平臺下Mini210S裸機程序開發指南
    發表于 10-29 10:52 ?59次下載
    <b class='flag-5'>Linux</b>的平臺下Mini210S裸機程序<b class='flag-5'>開發指南</b>

    Rockchip Linux SDK的開發指南的詳細資料說明

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

    迅為RK3399開發板嵌入式linux開發指南

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

    Tina_Linux_系統軟件開發指南

    Tina_Linux_系統軟件開發指南
    的頭像 發表于 03-02 15:25 ?1776次閱讀
    <b class='flag-5'>Tina_Linux</b>_系統軟件<b class='flag-5'>開發指南</b>

    Tina Linux配置開發指南

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

    Linux NOR開發指南

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

    Tina Linux圖形系統開發指南

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

    Tina Linux PMU開發指南

    介紹使用Tina PMU 驅動的使用方法。
    的頭像 發表于 03-06 11:05 ?2016次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b> PMU<b class='flag-5'>開發指南</b>