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驅動都要提供以下特性:
-
- Codec DAI (Digital Audio Interface)和PCM的配置信息;
- Codec的IO控制方式(I2C,SPI等);
- Mixer和其他的音頻控件;
- Codec和ALSA音頻操作接口;
Platform驅動
它包含了該SoC平臺的音頻DMA和音頻接口的配置和控制(I2S,PCM,AC97等等); 一般不包含與板子或codec相關的代碼。
Machine驅動單獨的Platform和Codec驅動是不能工作的,它必須由Machine驅動把它們結合在一起才能完成整個設備的音頻處理工作。
2.2 音頻接口介紹.
我們提供的音頻接口有:
AudioCodec
Daudio(I2S)
Dmic
Spdif
MAD
不同芯片平臺的音頻接口資源會有差異;不同版本的內核,對應的ALSA驅動也有所不同;下面會對各個芯片作詳細介紹。
2.3 R6音頻接口
2.3.1 硬件資源
R6包含 2 個音頻模塊,分別是內置audiocodec以及daudio0。
2.3.2 時鐘源
R6中, 2 個音頻模塊的時鐘源均來自pll_audio。
pll_audio可以輸出24.576M或者22.5792M的時鐘,分別支持48k系列,44.1k系列的播放錄音。
2.3.3 代碼結構
linux-3.10/sound/soc/sunxi/
├── sun3iw1_ac101.c // daudio+ac101的machine驅動
├── sun3iw1_codec.c // codec 驅動
├── sun3iw1_codec.h
├── sun3iw1_daudio.c // daudio的platform驅動
├── sun3iw1_daudio.h
├── sun3iw1_sndcodec.c // codec machine驅動
├── sunxi_cpudai.c // codec platform驅動
├── sunxi_cpudai.h
├── sunxi_dma.c //通用文件,提供注冊platform驅動的接口及相關函數集
├── sunxi_dma.h
├── sunxi_rw_func.c //通用文件,讀寫模擬/數字寄存器的接口
└── sunxi_rw_func.h
?
linux-3.10/sound/soc/codecs/
├── ac101.c // daudio+ac101的codec驅動
└── ac101.h
2.3.4 Audiocodec.
硬件特性
兩路DAC
支持16bit,24bit采樣精度
支持8KHz~192KHz采樣率
一路ADC
支持16bit,24bit采樣精度
支持8KHz~48KHz采樣率
一路模擬輸出:一路立體聲headphone輸出(HPL, HPR)
四路模擬輸入:MIC,FMINL,FMINR,LINEIN
支持同時playback和record(全雙工模式)
2.3.4.1 內核配置
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
<*> ASoC support for SUNXI --->
<*> ASoC support for sun3iw1 audiocodec
<*> ASoC support for internal-codec cpudai
<*> ASoC support for sun3iw1 audiocodec machine
2.3.4.2 sys_config配置.
[sndcodec]
sndcodec_used = 0x1
;------------------------------------------------------------------------------
[cpudai]
cpudai_used = 0x1
;------------------------------------------------------------------------------
[codec]
codec_used = 0x1
headphonevol = 0x3b
maingain = 0
pa_sleep_time = 30
gpio-spk = port:PD03<1><1>
gpio_shdn = 1
sndcodec配置,即machine驅動的相關配置。
sndcodec配置 | sndcodec配置說明 |
---|---|
sndcodec_used | 是否使用sndcodec驅動。 0 :不使用; 1 :使用 |
cpudai配置,即platform驅動的相關配置。
cpudai配置 | cpudai配置說明 |
---|---|
cpudai_used 是否使用cpudai驅動。 | 0 :不使用; 1 :使用 |
codec配置,即內置audiocodec驅動的相關配置。
codec配置 | codec配置說明 |
---|---|
codec_used | 是否使用codec驅動。 0 :不使用; 1 :使用 |
headphonevol | headphone volume,可設定范圍0~0x3f, 0表示mute, 1~63表示-62dB~0dB, 1dB/step |
micgain | mic增益,可設定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一般設置0x4,即24dB.如果作為aec回路,則需要設置為0dB |
pa_sleep_time | 操作PA之后的延時時間(用來避免pop音),單位ms |
gpio-spk | PA使能引腳 |
gpio_shdn | PA引腳使能方式。0:低電平有效; 1 :高電平有效 |
說明
如果想要正常加載audiocodec 聲卡, 需要把codec,platform,machine 驅動都選上, 即codec_used,cpudai_used,sndcodec_used 都置為1;
headphonevol 等值會在驅動初始化的時候設置,進入系統后還可以通過amixer 工具對應控件進行再次修改;
注意gpio-spk 是否配置正確,是否有其他模塊復用了該gpio;
除了gpio-spk 指定pa 使能引腳外,驅動中也會檢測gpio_num 字段,所以可以直接將gpio 號賦值gpio_num;
注意gpio_shdn,實際功放的PA 引腳是高電平有效,還是低電平有效
2.3.4.3 codec數據通路
R6平臺的audiocodec驅動會在播歌的時候自動設置相關通路,默認audio map:
播歌
DACL --> HP_L Mux --> HPOUTL
DACR --> HP_R Mux --> HPOUTR
錄音功能則根據需要操作對應空間使能通路:
錄制單MIC數據
MICIN --> ADC Mixer -> ADC
?
錄制內部AEC數據(不需要外圍回采電路)
Left Output Mixer --> ADC Mixer -> ADC
Right Output Mixer --> ADC Mixer -> ADC
R6相關控件如下表:
控件名稱 | 功能 | 數值 |
---|---|---|
ADC INPUT GAIN control | ADC增益 | 0–7,表示-4.5–6dB |
ADC MIC Boost AMP | enMIC Boost AMP使能 | 0:關閉; 1:開啟 |
ADC MIC Boost AMP | gain control MIC增益 | 0–7, 0:0dB, 1~7:15–33dB |
ADC PA speed select | PA速度選擇 0:normal; 1:fast | |
ADC mixer mute for FML | ADC Mixer設置,使能FML通路 | 0:關閉; 1:開啟 |
ADC mixer mute for FMR | ADC Mixer設置,使能FMR通路 | 0:關閉; 1:開啟 |
ADC mixer mute for left output | ADC Mixer設置,使能left output Mixer通路 | 0:關閉; 1:開啟 |
ADC mixer mute for linein | ADC Mixer設置,使能linein通路 | 0:關閉; 1:開啟 |
ADC mixer mute for mic | ADC Mixer設置,使能mic通路 | 0:關閉; 1:開啟 |
ADC mixer mute for right output | ADC Mixer設置,使能right output Mixer通路 | |
LINEIN GAIN control | linein到output mixer的增益 | 0–7, 0~7:0–14dB,2dB/step |
|MICIN GAIN control |MIC到outpu mixer的增益 0–7,表示-4.5–6dB |dac digital volume |DAC數字音量 0~63,表示0~-73.08dB,-1.16dB/step| |head phone volume |headphone音量 |0 表示mute, 1~63表示-62dB~0dB, -1dB/step|
錄音通路設置舉例:
錄音單聲道數據
通過MICIN錄音:
amixer -D hw:audiocodec cset name='ADC MIC Boost AMP en' 1
amixer -D hw:audiocodec cset name='ADC mixer mute for mic' 1
amixer -D hw:audiocodec cset name='ADC MIC Boost AMP gain control' 4
內部AEC(可省去外部AEC電路)
amixer -D hw:audiocodec cset name='ADC mixer mute for left ouput' 1
2.3.5 Daudio.
硬件特性
一路I2S/PCM;
支持主從模式
支持Left-justified,Right-justified,Standar mode I2S,PCM mode
支持i2s,pcm協議格式配置
支持mono和stereo模式,最高支持 2 通道
支持同時playback和record(全雙工模式)
支持8~192KHz采樣率
支持16,24,32bit采樣精度
2.3.5.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> <*> ASoC support for SUNXI ---> <*> ASoC support for daudio platform <*> ASoC support for sun3iw1 & ac101 daudio machine
2.3.5.2 sys_config配置.
[snddaudio0] snddaudio0_used = 1 over_sample_rate = 128 [daudio0] daudio0_used = 1 word_select_size = 32 pcm_sync_period = 32 pcm_lsb_first = 0 over_sample_rate = 128 slot_width_select = 16 pcm_sync_type = 0 pcm_start_slot = 0 tdm_config = 1
snddaudio0配置,即daudio0 machine驅動的相關配置
snddaudio配置 | snddaudio配置說明 |
---|---|
snddaudio0_used | 是否使用snddaudio驅動。 0 :不使用; 1 :使用 |
over_sample_rate | 支持128fs/192fs/256fs/384fs/512fs/768fs |
daudio0配置,即daudio0 platform驅動的相關配置
snddaudio配置 | snddaudio配置說明 |
---|---|
daudio0_used | 是否使用daudio驅動。 0 :不使用; 1 :使用 |
word_select_size | 支持16bits/20bits/24bits/32bits |
pcm_sync_period | 16/32/64/128/256 |
snddaudio配置 | snddaudio配置說明 |
---|---|
pcm_lsb_first | 0: msb first; 1: lsb first |
over_sample_rate | 支持128fs/192fs/256fs/384fs/512fs/768fs |
slot_width_select | 16bits/20bits/24bits/32bits |
pcm_sync_type | 0: long frame sync; 1: short frame sync |
pcm_start_slot | 0: 1st slot; 1: 2nd slot; 2: 3th slot; 3:4th slot |
tdm_config | 0:pcm 1:i2s |
2.3.6 外掛codec:AC101
R6標案使用的AC101作雙聲道錄音,audiocodec則錄制回路作AEC下面對R6如何配置使 用AC101作簡單介紹
2.3.6.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> <*> AC101 Codec <*> ASoC support for SUNXI ---> <*> ASoC support for daudio platform <*> ASoC support for sun3iw1 & ac101 daudio machine
2.3.6.2 sys_config&dts配置.
R6通過TWI1控制AC101,而I2S0用于音頻數據的傳輸
TWI部分配置,可通過dts進行配置:
linux-3.10/arch/arm/boot/dts/sun3iw1p1-sitar-mic2.dts twi1: twi@0x01c27400{ ac101@1a { compatible = "x-powers,ac101"; reg = <0x1a>; audio_int_ctrl = <&pio PL 12 6 1 1 0>; audio_pa_ctrl = <&pio PG 13 1 1 1 0>; speaker_val = <0x1b>; headset_val = <0x3b>; single_speaker_val = <0x19>; double_speaker_val = <0x1b>; speaker_double_used = <1>; earpiece_val = <0x1e>; mainmic_val = <0x4>; headsetmic_val = <0x4>; dmic_used = <0>; adc_digital_val = <0xb0b0>; agc_used = <0>; drc_used = <1>; linein_to_spk_used = <0>; linein_to_hp_used = <0>; linein_to_aif2_used = <0>; }; }
I2S部分配置可以通過dts配置,也可以通過sys_config覆蓋dts的配置
[snddaudio0] snddaudio0_used = 1 over_sample_rate = 128 sunxi,snddaudio-codec = "ac101.1-001a" sunxi,snddaudio-codec-dai = "ac101" [daudio0] daudio0_used = 1 word_select_size = 32 pcm_sync_period = 32 pcm_lsb_first = 0 over_sample_rate = 128 slot_width_select = 16 pcm_sync_type = 0 pcm_start_slot = 0 tdm_config = 1
i2s相關格式需要根據AC101 spec進行配置
而snddaudio0中,注意codec的名稱,需要與實際AC101的dev name相匹配,而codec-dai名稱則與AC101驅動中設置的dai name相匹配
2.3.7 標案音頻測試方法
該章節主要介紹在標案上進行播歌,錄音的測試命令。
2.3.7.1 播放
如《R6 AudioCodec數據通路》章節所說,驅動代碼中已固定配置了播放通路進入系統后直接通過aplay工具進行播放即可,如:
aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav
可通過下面命令調節硬件上的模擬音量:
amixer -Dhw:audiocodec cset name='headphone volume' 50
2.3.7.2 錄音
標案使用AC101進行雙聲道錄音錄音前需要配置AC101的音頻通路,SDK默認在啟動時會進行設置,相關配置腳本在:
/etc/init.d/rc.final
可以直接通過arecord命令進行錄音:
arecord -Dhw:sndac1011001a -f S16_LE -r 16000 -c 2 /tmp/test.wav
2.4 R7s音頻接口
2.4.1 硬件資源
R7s包含 2 個音頻模塊,分別是內置AudioCodec以及Daudio0。
2.4.2 時鐘源
R7s中, 2 個音頻模塊的時鐘源均來自pll_audio。
pll_audio可以輸出24.576M或者22.5792M的時鐘,分別支持48k系列,44.1k系列的播放錄音。
2.4.3 代碼結構
linux-4.9/sound/soc/sunxi/ ├── sunxi-pcm.c //提供注冊platform驅動的接口及相關函數集 ├── sunxi-pcm.h ├── sun8iw8 │ ├── sunxi_codec.c // cpudai驅動 │ ├── sunxi_codecdma.c // codec platform驅動 │ ├── sun8iw8_sndcodec_new.c // codec驅動 │ └── sunxi_sndcodec.c // codec machine驅動 ├── sunxi-daudio.c // daudio platform驅動 └── sunxi-snddaudio.c // daudio machine驅動 linux-4.9/sound/soc/soc-utils.c // daudio codec驅動
2.4.4 Audiocodec.
硬件特性
兩路DAC
支持16bit,24bit采樣精度
支持8KHz~192KHz采樣率
兩路ADC
支持16bit,24bit采樣精度
支持8KHz~48KHz采樣率
兩路模擬輸出:
一路立體聲LINEOUT輸出(LINEOUTP, LINEOUTN)
一路立體聲headphone輸出(HPOUTL, HPOUTR)
兩路模擬輸入:MIC1,MIC2
支持同時playback和record(全雙工模式)
支持ADC的AGC,DRC功能
支持DAC的DRC功能
2.4.4.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> <*> Audiocodec for the SUNXI chips
2.4.4.2 sys_config配置.
[codec] headphone_vol = 0x3b lineout_vol = 0x1a audio_pa_ctrl = port:PB05<1><0> adcagc_used = 0 adcdrc_used = 0 dacdrc_used = 0 adchpf_used = 0 dachpf_used = 0
codec配置 | codec配置說明 |
---|---|
headphone_vol | headphone volume,可設定范圍0~0x3f, 0表示mute, 1~63表示-62dB~0dB, 1dB/step |
audio_pa_ctrl | PA使能引腳 |
adcagc_used | 1:use adcagc 0:no use |
adcdrc_used | 1:use adcdrc 0:no use |
dacdrc_used | 1:use dacdrc 0:no use |
adchpf_used | 1:use adchpf 0:no use |
dachpf_used | 1:use dachpf 0:no use |
2.4.4.3 codec數據通路
播歌 DACL --> Left Output Mixer --> LINEOUTL DACR --> Right Output Mixer --> LINEOUTR 錄音 MIC1P --> LADC input Mixer --> ADCL MIC2P --> RADC input Mixer --> ADCR
控件名稱 | 功能 | 數值 |
---|---|---|
Lineout volume | lineout音量設置 | 0–31,表示-43.5–0dB |
ADC input gain control | ADC增益 0–7,表示-4.5–6dB | |
HP_L Mux HP_L | Mux設置 | 0:DACL HPL Switch; 1:MIXER_L Switch |
HP_R Mux HP_R | Mux設置 | 0:DACR HPR Switch; 1:MIXER_R Switch |
LADC input Mixer MIC1 boost Switch | LADC input Mixer設置,使能MIC1通路 | 0:關閉; 1:開啟 |
LADC input Mixer MIC2 boost Switch | LADC input Mixer設置,使能MIC2通路 | 0:關閉; 1:開啟 |
LADC input Mixer l_output mixer Switch | LADC input Mixer設置,使能l_output通路 | 0:關閉; 1:開啟 |
LADC input Mixer r_output mixer Switch | LADC input Mixer設置,使能r_output通路 | 0:關閉; 1:開啟 |
Left Output Mixer DACL Switch | Left Output Mixer設置,使能DACL通路 | 0:關閉; 1:開啟 |
Left Output Mixer DACR Switch | Left Output Mixer設置,使能DACR通路 | 0:關閉; 1:開啟 |
Left Output Mixer MIC1Booststage Switch | Left Output Mixer設置,使能MIC1通路 | 0:關閉; 1:開啟 |
Left Output Mixer MIC2Booststage Switch | Left Output Mixer設置,使能MIC2通路 | 0:關閉; 1:開啟 |
MIC1 boost AMP gain control | MIC1增益 | 0–7, 0:0dB,1~7:24–42dB,3dB/step |
MIC1_G boost stageoutput mixer control | MIC1 to L or R output Mixer增益 | 0–7,表示-4.5–6dB |
MIC2 SRC | MIC2 SRC設置 | 0:MIC3; 1:MIC2 |
MIC2 boost AMP gain control | MIC2增益 | 0–7, 0:0dB,1~7:24–42dB,3dB/step |
MIC2_G boost stage output mixer control | MIC2 to L or R output Mixer增益 | 0–7,表示-4.5–6dB |
RADC input Mixer MIC1 boost Switch | RADC input Mixer設置,使能MIC1通路 | 0:關閉; 1:開啟 |
RADC input Mixer MIC2 boost Switch | RADC input Mixer設置,使能MIC2通路 | 0:關閉; 1:開啟 |
RADC input Mixer l_output mixer Switch | RADC input Mixer設置,使能l_output通路 | 0:關閉; 1:開啟 |
RADC input Mixer r_output mixer Switch | RADC input Mixer設置,使能r_output通路 | 0:關閉; 1:開啟 |
Right Output Mixer DACL Switch | Right Output Mixer設置,使能DACL通路 | 0:關閉; 1:開啟 |
Right Output Mixer DACR Switch | Right Output Mixer設置,使能DACR通路 | 0:關閉; 1:開啟 |
Right Output Mixer MIC1Booststage Switch | Right Output Mixer設置, 使能MIC1通路 | 0:關閉; 1:開啟 |
Right Output Mixer MIC2Booststage Switch | Right Output Mixer設置,使能MIC2通路 | 0:關閉; 1:開啟 |
SPK_L Mux | SPK_L Mux設置 | 0:MIXER_L Switch; 1:MIXR+MIXL |
SPK_R Mux | SPK_R Mux設置 | 0:MIXER_L Switch; 1:MIXR+MIXL |
digital volume | 數字音量設置 | 0–63,表示-73.08–0dB |
headphone volume | headphone音量設置 | 0–63,0表示mute; 1~63表示-62dB–0dB |
通路設置舉例:
播放通路
通過lineout播放: amixer -D hw:audiocodec cset name='SPK_L Mux' 1 amixer -D hw:audiocodec cset name='SPK_R Mux' 1 amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -D hw:audiocodec cset name='digital volume' 6
錄音通路
通過MIC1,MIC2錄音: amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1 amixer -D hw:audiocodec cset name='RADC input Mixer MIC2 boost Switch' 1 amixer -D hw:audiocodec cset name='MIC2 SRC' 0 amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4 amixer -D hw:audiocodec cset name='MIC2 boost AMP gain control' 4
2.4.5 Daudio.
硬件特性
一路I2S/PCM;
支持主從模式
支持Left-justified,Right-justified,Standar mode I2S,PCM mode
支持i2s,pcm協議格式配置
支持mono和stereo模式
支持同時playback和record(全雙工模式)
支持8~192KHz采樣率
支持16,24,32bit采樣精度
2.4.5.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> <*> Allwinner Digital Audio Support
2.4.5.2 sys_config配置.
[tdm0] daudio_used = 0 daudio_master = 4 daudio_select = 1 audio_format = 1 signal_inversion = 1 sample_resolution = 16 slot_width_select = 16 pcm_lrck_period = 32 pcm_lrckr_period = 1 msb_lsb_first = 0 sign_extend = 0 tx_data_mode = 0 rx_data_mode = 0 ;i2s_mclk = port:PB08<2><1> i2s_bclk = port:PG11<2><1> i2s_lrclk = port:PG10<2><1> i2s_dout0 = port:PG12<2><1> i2s_dout1 = i2s_dout2 = i2s_dout3 = i2s_din = port:PG13<2><1>
tdm0配置 | tdm0配置說明 |
---|---|
daudio_master | 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作為slave, codec作為master2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRMmaster),一般不用3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frameslave),一般不用4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave |
daudio_select | 0: pcm mode; 1: i2s mode |
audio_format | 1: SND_SOC_DAIFMT_I2S(standard i2s format)2: SND_SOC_DAIFMT_RIGHT_J(right justfied format)3: SND_SOC_DAIFMT_LEFT_J(left justfied format)4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2ndBCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1ndBCLK rising edge after LRC rising edge) |
signal_inversion | 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame)2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM)3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM)4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM) |
sample_resolution | 采樣精度,16bit, 24bit,32bit |
slot_width_select | 支持8bit, 16bit, 32bit寬度 |
pcm_lrck_period | 可配置16/32/64/128/256個bclk |
pcm_lrckr_period | 可配置16/32/64/128/256個bclk |
msb_lsb_first | 0: msb first; 1: lsb first |
sign_extend | 0: zero pending; 1: sign extend |
tx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
rx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
i2s_bclk | i2s_bclk引腳 |
i2s_lrclk | i2s_lrclk引腳 |
i2s_dout0 | i2s_dout引腳 |
i2s_din | i2s_din引腳 |
2.4.6 標案音頻測試方法
該章節主要介紹在標案上進行播歌,錄音的測試命令。
2.4.6.1 播放
amixer -D hw:audiocodec cset name='SPK_L Mux' 1 amixer -D hw:audiocodec cset name='SPK_R Mux' 1 amixer -D hw:audiocodec cset name='Lineout volume' 24 amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -D hw:audiocodec cset name='digital volume' 0 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav
可通過下面命令調節硬件上的模擬音量:
amixer -Dhw:audiocodec cset name='Lineout volume' 50
2.4.6.2 錄音
表示下使用audiocodec進行MIC1,MIC2錄音。
amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1 amixer -D hw:audiocodec cset name='RADC input Mixer MIC2 boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4 amixer -D hw:audiocodec cset name='MIC2 SRC' 0 amixer -D hw:audiocodec cset name='MIC2 boost AMP gain control' 4 arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 /tmp/test.wav
2.5 R11音頻接口
2.5.1 硬件資源
R11包含 2 個音頻模塊,分別是內置AudioCodec以及Daudio0。
2.5.2 時鐘源
R11中, 2 個音頻模塊的時鐘源均來自pll_audio。
pll_audio可以輸出24.576M或者22.5792M的時鐘,分別支持48k系列,44.1k系列的播放錄音。
2.5.3 代碼結構
linux-3.4/sound/soc/sunxi/ ├── audiocodec │ ├── sun8iw8_sndcodec_new.c // codec 驅動 │ ├── sun8iw8_sndcodec.h │ ├── sunxi_codec.c // cpu dai驅動 │ ├── sunxi_sndcodec.c // codec machine驅動 │ ├── sunxi_codecdma.c // codec platform驅動 │ └── sunxi_codecdma.h └── daudio0 ├── snddaudio0.c // daudio codec驅動 ├── sunxi-daudio0.c // daudio cpu dai驅動 ├── sunxi-daudio0.h ├── sunxi-daudiodma0.c // daudio platform 驅動 ├── sunxi-daudiodma0.h └── sunxi-snddaudio0.c // daudio machine驅動
2.5.4 AudioCodec
硬件特性
兩路DAC
支持16bit,24bit采樣精度
支持8KHz~192KHz采樣率
兩路ADC
支持16bit,24bit采樣精度
支持8KHz~48KHz采樣率
一路模擬輸出:一路立體聲LINEOUT輸出(LINEOUTP, LINEOUTN)
一路路模擬輸入:MIC1
支持同時playback和record(全雙工模式)
支持ADC的AGC,DRC功能
支持DAC的DRC功能
2.5.4.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> <*> Audiocodec for the SUNXI chips <*> Audiocodec Machine for codec chips <*> Audiocodec for the SUN8IW8 chips
2.5.4.2 sys_config配置.
[audio0] headphone_vol = 0x3b lineout_vol = 0x1a audio_pa_ctrl = port:PB05<1><0> audio_pa_active_level = 1 adcagc_used = 0 adcdrc_used = 0 dacdrc_used = 0 adchpf_used = 0 dachpf_used = 0
audio0配置 | audio0配置說明 |
---|---|
headphone_vol | headphone volume,可設定范圍0~0x3f, 0表示mute,1~63表示-62dB~0dB, 1dB/step |
lineout_vol | lineout volume,可設定范圍0~0x1f, 0或者 1 表示mute,2~31表示-43.5dB~0dB, 1.5dB/step |
audio_pa_ctrl | PA使能引腳 |
audio_pa_active_level | 1:high level active; 0:low level active |
adcagc_used | 1:use adcagc 0:no use |
adcdrc_used | 1:use adcdrc 0:no use |
dacdrc_used | 1:use dacdrc 0:no use |
adchpf_used | 1:use adchpf 0:no use |
dachpf_used | 1:use dachpf 0:no use |
2.5.4.3 codec數據通路
播歌 DACL --> Left Output Mixer --> LINEOUTL DACR --> Right Output Mixer --> LINEOUTR 錄音 MIC1P --> LADC input Mixer --> ADCL
控件名稱 | 功能 | 數值 |
---|---|---|
Lineout volume | lineout 音量設置0–31, 表示-43.5–0dB | |
ADC input gain control | ADC 增益0–7, 表示-4.5–6dB | |
LADC input Mixer MIC1 boost Switch | LADC input Mixer 設置,使能MIC 通路 0: 關閉; 1: 開啟 | |
Left Output Mixer DACL Switch | Left Output Mixer 設置,使能DACL 通路 0: 關閉; 1: 開啟 | |
Left Output Mixer DACR Switch | Left Output Mixer 設置,使能DACR 通路 0: 關閉; 1: 開啟 | |
Left Output Mixer MIC1Booststage Switch | Left Output Mixer 設置,使能MIC1 通路 0: 關閉; 1: 開啟 | |
MIC1 boost AMP gain control | MIC1 增益0–7, 0:0dB, 1~7:24–42dB,3dB/step | |
MIC1_G boost stage output mixer control | MIC1 to L or R output Mixer 增益0–7, 表示-4.5–6dB | |
Right Output Mixer DACL Switch | Right Output Mixer 設置,使能DACL 通路 | 0: 關閉; 1: 開啟 |
Right Output Mixer DACR Switch | Right Output Mixer 設置, 使能DACR 通路 0: 關閉; 1: 開啟 | |
Right Output Mixer MIC1Booststage Switch | Right Output Mixer 設置, 使能MIC1 通路 0: 關閉; 1: 開啟 | |
SPK_L Mux SPK_L Mux | 設置0:MIXER_L Switch; 1:MIXR+MIXL | |
SPK_R Mux SPK_R Mux | 設置0:MIXER_L Switch; 1:MIXR+MIXL | |
digital volume | 數字音量設置0–63, 表示-73.08–0dB |
通路設置舉例:
播放通路
通過lineout播放: amixer -D hw:audiocodec cset name='SPK_L Mux' 1 amixer -D hw:audiocodec cset name='SPK_R Mux' 1 amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -D hw:audiocodec cset name='digital volume' 0
錄音通路
通過MIC1錄音: amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4
2.5.5 Daudio.
硬件特性
一路I2S/PCM;
支持主從模式
支持Left-justified,Right-justified,Standar mode I2S,PCM mode
支持i2s,pcm協議格式配置
支持mono和stereo模式,最高支持 2 通道
支持同時playback和record(全雙工模式)
支持8~192KHz采樣率
支持16,24,32bit采樣精度
2.5.5.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> <*> SoC daudio0 tdm interface for SUNXI chips <*> Daudio0 Public Machine for SUNXI chips
2.5.5.2 sys_config配置.
[tdm0] daudio_used = 1 daudio_master = 4 daudio_select = 1 audio_format = 1 signal_inversion = 1 sample_resolution = 16 slot_width_select = 16 pcm_lrck_period = 32 pcm_lrckr_period = 1 msb_lsb_first = 0 sign_extend = 0 tx_data_mode = 0 rx_data_mode = 0 ;i2s_mclk = port:PB08<2><1> i2s_bclk = port:PG11<2><1> i2s_lrclk = port:PG10<2><1> i2s_dout0 = port:PG12<2><1> i2s_dout1 = i2s_dout2 = i2s_dout3 = i2s_din = port:PG13<2><1>
tdm0配置 | tdm0配置說明 |
---|---|
daudio_master | 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作為slave, codec作為master2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRMmaster),一般不用3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frameslave),一般不用4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave |
daudio_select | 0: pcm mode; 1: i2s mode |
deaudio_format |1: SND_SOC_DAIFMT_I2S(standard i2s format)2: SND_SOC_DAIFMT_RIGHT_J(right justfied format)3: SND_SOC_DAIFMT_LEFT_J(left justfied format)4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2ndBCLK rising edge after LRC rising edge)5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge)| |signal_inversion |1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame)2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM)3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM)4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM)| | sample_resolution |采樣精度,16bit, 24bit,32bit| | slot_width_select| 支持8bit, 16bit, 32bit寬度| | pcm_lrck_period |可配置16/32/64/128/256個bclk| | pcm_lrckr_period |可配置16/32/64/128/256個bclk| | msb_lsb_first |0: msb first; 1: lsb first| | sign_extend |0: zero pending; 1: sign extend| | tx_data_mode |0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law| | rx_data_mode |0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law| | i2s_bclk |i2s_bclk引腳| | i2s_lrclk |i2s_lrclk引腳| | i2s_dout0 |i2s_dout引腳| | i2s_din| i2s_din引腳|
2.5.6 標案音頻測試方法
該章節主要介紹在標案上進行播歌,錄音的測試命令。
2.5.6.1 播放
amixer -D hw:audiocodec cset name='SPK_L Mux' 1 amixer -D hw:audiocodec cset name='SPK_R Mux' 1 amixer -D hw:audiocodec cset name='Lineout volume' 24 amixer -D hw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -D hw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -D hw:audiocodec cset name='digital volume' 0 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav
可通過下面命令調節硬件上的模擬音量:
amixer -Dhw:audiocodec cset name='Lineout volume' 50
2.5.6.2 錄音
表示下使用AudioCodec進行單聲道錄音
amixer -D hw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 boost AMP gain control' 4 arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 1 /tmp/test.wav
2.6 R16音頻接口
2.6.1 硬件資源
R16包含 3 個音頻模塊,分別是內置AudioCodec,I2S0以及I2S1。
2.6.2 時鐘源
R16中, 3 個音頻模塊的時鐘源均來自pll_audio。
pll_audio可以輸出24.576M或者22.5792M的時鐘,分別支持48k系列,44.1k系列的播放錄音。
2.6.3 代碼結構
linux-3.4/sound/soc/sunxi/ ├── audiocodec │ ├── sun8iw5_machine.c // codec machine驅動 │ ├── sun8iw5_sndcodec.c // codec驅動 │ ├── sun8iw5_sndcodec.h │ ├── sunxi_codecdma.c // codec platform驅動 │ ├── sunxi_codecdma.h │ └── sunxi_codec.c // cpu dai驅動 ├── i2s0 │ ├── sndi2s0.c // i2s codec驅動 │ ├── sunxi-i2s0dma.c // i2s platform驅動 │ ├── sunxi-i2s0dma.h │ ├── sunxi-i2s0.c // i2s cpu dai驅動 │ ├── sunxi-i2s0.h │ └── sunxi-sndi2s0.c // i2s machine驅動 └── i2s1 ├── sndi2s1.c // i2s codec驅動 ├── sunxi-i2s1dma.c // i2s platform驅動 ├── sunxi-i2s1dma.h ├── sunxi-i2s1.c // i2s cpu dai驅動 ├── sunxi-i2s1.h └── sunxi-sndi2s1.c // i2s machine驅動
2.6.4 AudioCodec
硬件特性
兩路DAC
支持16bit,24bit采樣精度
支持8KHz~192KHz采樣率
兩路ADC
支持16bit,24bit采樣精度
支持8KHz~48KHz采樣率
兩路模擬輸出:
一路立體聲headphone輸出(HPOUTL,HPOUTR)
一路立體聲phoneout輸出(PHONEOUTP,PHONEOUTN)
四路路模擬輸入:MIC1,MIC2,linein,phonein
支持headphone驅動
支持同時playback和record(全雙工模式)
2.6.4.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> <*> Audiocodec for the SUNXI chips <*> Audiocodec Machine for sun8iw5 chips <*> Audiocodec for the SUN8IW5 chips
2.6.4.2 sys_config配置.
[audio0] audio_used = 1 headphone_vol = 0x3b pa_double_used = 1 headphone_direct_used = 1 headset_mic_vol = 3 main_mic_vol = 1 ;audio_linein_detect = port:PB07<0><0> audio_pa_ctrl = port:PD11<1><0> pa_gpio_reverse = 0 aif2_used = 0 aif3_used = 0 headphone_mute_used = 0 aif1_lrlk_div = 0x40
audio0配置 | audio0配置說明 |
---|---|
audio0 | 是否使用audiocodec驅動。 0 :不使用; 1 :使用 |
headphone_vol | headphone volume,可設定范圍0~0x3f, 0表示mute,1~63表示-62dB~0dB, 1dB/step |
pa_double_used | 是否同時使用兩個DAC, 0 :不使用; 1 :使用 |
headphone_direct_used | 是否使用headphone輸出, 0 :不使用; 1 :使用 |
main_mic_vol | MIC1默認增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step |
headset_mic_vol | MIC2默認增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step |
audio_pa_ctrl | PA使能引腳 |
pa_gpio_reverse | PA使能引腳是否顛倒, 0:正常,即high level active; 1:顛倒,即low level active |
aif1_lrlk_div | aif1的lrck分頻系數 |
2.6.4.3 codec數據通路
通過HPOUTL/R播歌 AIF1DACL --> AIF1IN0L Mux --> DACL Mixer --> Left Output Mixer --> HP_L Mux --> HPOUTL AIF1DACR --> AIF1IN0R Mux --> DACR Mixer --> Right Output Mixer --> HP_R Mux --> HPOUTR 通過MIC1錄音 AIF1ADCL <-- AIF1OUT0L Mux <-- AIF1 AD0L Mixer <-- ADCL Mux <-- LEFT ADC input Mixer <-- MIC1 PGA <-- MIC1P/N
R16相關控件如下表:
控件名稱 | 功能 | 數值 |
---|---|---|
Headphone Switch | Headphone通路使能 | 0:關閉; 1:開啟 |
ADC input gain | ADC增益 | 0–7,表示-4.5–6dB |
ADC volume | ADCL/ADCR音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
ADCL Mux | ADCL Mux設置,只支持0:ADC | 0:ADC |
ADCR Mux | ADCR Mux設置,只支持0:ADC | 0:ADC |
AIF1 AD0L Mixer ADCL Switch | AIF1 AD0L Mixer設 置,使能ADCL通路 | 0:關閉; 1:開啟 |
AIF1 AD0L Mixer AIF1 DA0L Switch | AIF1 AD0L Mixer設置,使能AIF1 DA0L通路 | 0:關閉; 1:開啟 |
AIF1 AD0L Mixer AIF2 DACL Switch | AIF1 AD0L Mixer設置,使能AIF2 DACL通路 | 0:關閉; 1:開啟 |
AIF1 AD0L Mixer AIF2 DACR Switch | AIF1 AD0L Mixer設置,使能AIF2 DACR通路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer ADCR Switch | AIF1 AD0R Mixer設置,使能ADCR通路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer AIF1 DA0R Switch | AIF1 AD0R Mixer設置,使能AIF1 DA0R通路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer AIF2 DACL Switch | AIF1 AD0R Mixer設置,使能AIF2 DACL通路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer AIF2 DACR Switch | AIF1 AD0R Mixer設置,使能AIF2 DACR通路 | 0:關閉; 1:開啟 |
AIF1 AD1L Mixer ADCL Switch | AIF1 AD1L Mixer設置,使能ADCL通路 | 0:關閉; 1:開啟 |
AIF1 AD1L Mixer AIF2 DACL Switch | AIF1 AD1L Mixer設置,使能AIF2 DACL通路 | 0:關閉; 1:開啟 |
AIF1 AD1R Mixer ADCR Switch | AIF1 AD1R Mixer設置,使能ADCR通路 | 0:關閉; 1:開啟 |
AIF1 AD1R Mixer AIF2 DACR Switch | AIF1 AD1R Mixer設置,使能AIF2 DACR通路 | 0:關閉; 1:開啟 |
AIF1 ADC timeslot 0 mixer gain | AIF1 ADC0L/ADC0R Mixer,數字增益 | 0:0dB; 1:-6dB; |
對于ADC0L Mixer, bit0:AIF2 DACR; bit1:ADCL; bit2:AIF2 DACL; bit3:AIF2 DA0L; 對于ADC0R Mixer, bit0:AIF2 DACL; bit1:ADCR; bit2:AIF2 DACR; bit3:AIF2 DA0R; | ||
AIF1 ADC timeslot 0 volume | AIF1 ADC0L/ADC0R音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1 ADC timeslot 1 mixer gain | AIF1 ADC1L/ADC1R Mixer,數字增益 | 0:0dB; 1:-6dB; |
對于ADC1L Mixer, bit0:ADCL; bit1:AIF2 DACL; 對于ADC1R Mixer, bit0:ADCR; bit1:AIF2 DACR; | ||
AIF1 ADC timeslot 1 volume | AIF1 ADC1L/ADC1R 音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1 DAC timeslot 0 volume | AIF1 DAC0L/DAC0R 音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1 DAC timeslot 1 volume | AIF1 DAC1L/DAC1R 音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1IN0L Mux | AIF1IN0L Mux設置 | 0:AIF1_DA0L; 1:AIF1_DA0R; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R |
AIF1IN0R Mux | AIF1IN0R Mux設置 | 0:AIF1_DA0R; 1:AIF1_DA0L; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R |
AIF1IN1L Mux | AIF1IN1L Mux設置 | 0:AIF1_DA1L; 1:AIF1_DA1R; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R |
AIF1IN1R Mux | AIF1IN1R Mux設置 | 0:AIF1_DA1R; 1:AIF1_DA1L; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R |
AIF1OUT0L Mux | AIF1OUT0L Mux設置 | 0:AIF1_AD0L; 1:AIF1_AD0R; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R |
AIF1OUT0R Mux | AIF1OUT0R Mux設置 | 0:AIF1_AD0R; 1:AIF1_AD0L; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R |
AIF1OUT1L Mux | AIF1OUT1L Mux設置 | 0:AIF1_AD1L; 1:AIF1_AD1R; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R |
AIF1OUT1R Mux | AIF1OUT1R Mux設置 | 0:AIF1_AD1R; 1:AIF1_AD1L; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R |
DAC mixer gain | DAC mixer增益 | 0:0dB; 1:-6dB; |
對于DACL Mixer, bit0:ADCL; bit1:AIF2 DACL; bit2:AIF1 DAC1L; bit3:AIF1 DAC0L; 對于DACR Mixer, bit0:ADCR; bit1:AIF2 DACR; bit2:AIF1 DAC1R; bit3:AIF1 DAC0R; | ||
DAC volume | DACL/DACR音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
DACL Mixer ADCL Switch | DACL Mixer設置,使能 ADCL通路 | 0:關閉; 1:開啟 |
DACL Mixer AIF1DA0L Switch | DACL Mixer設置,使能 AIF1DA0L通路 | 0:關閉; 1:開啟 |
DACL Mixer AIF1DA1L Switch | DACL Mixer設置,使能 AIF1DA1L通路 | 0:關閉; 1:開啟 |
DACL Mixer AIF2DACL Switch | DACL Mixer設置,使能 AIF2DACL通路 | 0:關閉; 1:開啟 |
DACR Mixer ADCR Switch | DACR Mixer設置,使 能ADCR通路 | 0:關閉; 1:開啟 |
DACR Mixer AIF1DA0R Switch | DACR Mixer設置,使 能AIF1DA0R通路 | 0:關閉; 1:開啟 |
DACR Mixer AIF1DA1R Switch | DACR Mixer設置,使 能AIF1DA1R通路 | 0:關閉; 1:開啟 |
DACR Mixer AIF2DACR Switch | DACR Mixer設置,使 能AIF2DACR通路 | 0:關閉; 1:開啟 |
External Speaker Switch | 使能Headphone以及 PA | 0:關閉; 1:開啟 |
HP_L Mux | HP_L Mux設置 | 0:DACL ; 1:Left Output Mixer |
HP_R Mux | HP_R Mux設置 | 0:DACR ; 1:Right Output Mixer |
LEFT ADC input Mixer Lout_Mixer_Switch | LEFT ADC input Mixer 設置,使能Lout Mixer通路 | 0:關閉; 1:開啟 |
LEFT ADC input Mixer MIC1 boost Switch | LEFT ADC input Mixer 設置,使能MIC1通路 | 0:關閉; 1:開啟 |
LEFT ADC input Mixer MIC2 boost Switch | LEFT ADC input Mixer 設置,使能MIC2通路 | 0:關閉; 1:開啟 |
LEFT ADC input Mixer Rout_Mixer_Switch | LEFT ADC input Mixer 設置,使能Rout Mixer 通路 | 0:關閉; 1:開啟 |
Left Output Mixer DACL Switch | Left Output Mixer設 置,使能DACL通路 | 0:關閉; 1:開啟 |
Left Output Mixer DACR Switch | Left Output Mixer設 置,使能DACR通路 | 0:關閉; 1:開啟 |
Left Output Mixer MIC1Booststage Switch | Left Output Mixer設 置,使能MIC1通路 | 0:關閉; 1:開啟 |
Left Output Mixer MIC2Booststage Switch | Left Output Mixer設 置,使能MIC2通路 | 0:關閉; 1:開啟 |
MIC1 boost amplifier gain | MIC1增益 | 0–7, 0:0dB, 1~7:24–42dB,3dB/step |
MIC2 SRC | MIC2 SRC設置 | 0:MIC3; 1:MIC2 |
MIC2 boost amplifier gain | MIC2增益 | 0–7, 0:0dB, 1~7:24–42dB,3dB/step |
RIGHT ADC input Mixer Lout_Mixer_Switch | RIGHT ADC input Mixer設置,使能Lout Mixer通路 | 0:關閉; 1:開啟 |
RIGHT ADC input Mixer MIC1 boost Switch | RIGHT ADC input Mixer設置,使能MIC1 通路 | 0:關閉; 1:開啟 |
RIGHT ADC input Mixer MIC2 boost Switch | RIGHT ADC input Mixer設置,使能MIC2 通路 | 0:關閉; 1:開啟 |
RIGHT ADC input Mixer Rout_Mixer_Switch | RIGHT ADC input Mixer設置,使能Rout Mixer通路 | 0:關閉; 1:開啟 |
Right Output Mixer DACL Switch | Right Output Mixer設 置,使能DACL通路 | 0:關閉; 1:開啟 |
Right Output Mixer DACR Switch | Right Output Mixer設 置,使能DACR通路 | 0:關閉; 1:開啟 |
Right Output Mixer MIC1Booststage Switch | Right Output Mixer設 置,使能MIC1通路 | 0:關閉; 1:開啟 |
Right Output Mixer MIC2Booststage Switch | Right Output Mixer設 置,使能MIC2通路 | 0:關閉; 1:開啟 |
digital volume | 數字音量設置 | 0–63,表示-73.08–0dB |
headphone volume | headphone音量設置 | 0–63,0表示mute; 1~63表 示-62dB–0dB |
2.6.5 Daudio.
硬件特性
? 兩路I2S/PCM;
? 支持主從模式
支持Left-justified,Right-justified,Standar mode I2S,PCM mode
支持i2s,pcm協議格式配置
支持mono和stereo模式,支持 8 通道輸出和 2 通道輸入
支持同時playback和record(全雙工模式)
支持8~192KHz采樣率
支持16,24,32bit采樣精度
2.6.5.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> <*> SoC i2s0 interface for SUNXI chips <*> SoC i2s1 interface for SUNXI chips
2.6.5.2 sys_config配置.
I2S0,I2S1的配置方法是一樣的,下面僅描述I2S0
[i2s0] i1s0_used = 1 i2s0_channel = 2 i2s0_master = 4 i2s0_select = 1 audio_format = 1 signal_inversion = 1 over_sample_rate = 512 sample_resolution = 16 word_select_size = 32 pcm_sync_period = 256 msb_lsb_first = 0 slot_index = 0 slot_width = 16 frame_width = 1 tx_data_mode = 1 rx_data_mode = 1 i2s0_mclk = i2s0_bclk = port:PB05<2><1> i2s0_lrclk = port:PB04<2><1> i2s0_dout0 = port:PB06<2><1> i2s0_dout1 = i2s0_dout2 = i2s0_dout3 = i2s0_din = port:PB07<2><1>
i2s0配置 | i2s0配置說明 |
---|---|
i2s0_used | 是否使用i2s驅動。 0 :不使用; 1 :使用 |
i2s0_master | 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRMmaster), 即daudio接口作為slave, codec作為master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave |
audio_format | 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge) |
signal_inversion | 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame) 2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM) 3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM) 4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM) |
over_sample_rate | 支持128fs/192fs/256fs/384fs/512fs/768fs |
sample_resolution | 采樣精度,16bit, 24bit,32bit |
word_select_size | 支持16bits/20bits/24bits/32bits |
pcm_sync_period | 16/32/64/128/256 |
msb_lsb_first | 0: msb first; 1: lsb first |
slot_index | 0: 1st slot; 1: 2nd slot; 2: 3th slot; 3:4th slot |
slot_width | 8: 8 clocks width; 16: 16 clocks width |
frame_width | 0: long frame sync; 1: short frame sync |
tx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
rx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
i2s0_mclk | i2s0_mclk引腳 |
i2s0_bclk | i2s0_bclk引腳 |
i2s0_lrclk | i2s0_lrclk引腳 |
i2s0_dout0 | i2s0_dout引腳 |
i2s0_din | i2s0_din引腳 |
2.6.6 標案音頻測試方法
該章節主要介紹在標案上進行播歌,錄音的測試命令。
2.6.6.1 播放
通過speaker播放 amixer cset name='AIF1IN0L Mux' 'AIF1_DA0L'; amixer cset name='AIF1IN0R Mux' 'AIF1_DA0R'; amixer cset name='DACL Mixer AIF1DA0L Switch' 1; amixer cset name='DACR Mixer AIF1DA0R Switch' 1; amixer cset name='HP_L Mux' 'DACL HPL Switch' ; amixer cset name='HP_R Mux' 'DACR HPR Switch'; amixer cset name='External Speaker Switch' 1; aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wavmixer cset name='AIF1IN0L Mux' 'AIF1_DA0L'; amixer cset name='AIF1IN0R Mux' 'AIF1_DA0R'; amixer cset name='DACL Mixer AIF1DA0L Switch' 1; amixer cset name='DACR Mixer AIF1DA0R Switch' 1; amixer cset name='HP_L Mux' 'DACL HPL Switch' ; amixer cset name='HP_R Mux' 'DACR HPR Switch'; amixer cset name='Headphone Switch' 1; aplay -Dhw:sndcodec /mnt/UDISK/1KHz_0dB_16000.wav
可通過下面命令調節硬件上的模擬音量:
amixer -Dhw:sndcodec cset name='headphone volume' 58
2.6.6.2 錄音
表示下使用audiocodec進行單聲道錄音
amixer cset name='LEFT ADC input Mixer MIC1 boost Switch' 1 amixer cset name='AIF1 AD0L Mixer ADCL Switch' 1 amixer cset name='AIF1OUT0L Mux' 'AIF1_AD0L' amixer cset name='MIC1 boost amplifier gain' 4 arecord -Dhw:sndcodec -f S16_LE -r 16000 -c 1 /tmp/test.wav
2.7 R18音頻接口
2.7.1 硬件資源
R18包含 4 個音頻模塊,分別是內置AudioCodec以及Daudio0,Daudio1,Daudio2。
2.7.2 時鐘源
R18中, 4 個音頻模塊的時鐘源均來自pll_audio
pll_audio可以輸出24.576M或者22.5792M的時鐘,分別支持48k系列,44.1k系列的播放錄音。
2.7.3 代碼結構
linux-4.4/sound/soc/sunxi/ ├── sun50iw1-codec.c // codec驅動 ├── sun50iw1-codec.h ├── sun50iw1-sndcodec.c // codec machine驅動 ├── sunxi-inter-i2s.c // codec platform驅動 ├── sunxi-daudio.c // daudio platform驅動 ├── sunxi-daudio.h ├── sunxi-snddaudio.c // daudio machine驅動 ├── sunxi-snddaudio.h ├── sunxi-pcm.c //通用文件,提供注冊platform驅動的接口及相關函數集 ├── sunxi-pcm.h ├── sunxi_rw_func.c //通用文件,讀寫模擬/數字寄存器的接口 ├── sunxi_rw_func.h ├── spdif-utils.c // spdif codec驅動 ├── sunxi-sndspdif.c // spdif machine驅動 ├── sunxi-spdif.c // spdif platform驅動 ├── sunxi-spdif.h ├── sunxi-hdmi.c // hdmi codec驅動 └── sunxi-sndhdmi.c // hdmi machine驅動hdmi platform模型使用的是sunxi-daudio.c linux-4.4/sound/soc/soc-utils.c // snd-soc-dummmy驅動,可用于daudio codec模型 linux-4.4/sound/soc/codecs/ac108.c // ac108 codec驅動 linux-4.4/sound/soc/codecs/tas5731.c // tas5731數字功放codec驅動
2.7.4 AudioCodec
硬件特性
? 兩路DAC
支持16bit,24bit采樣精度
支持8KHz~192KHz采樣率
兩路ADC
支持16bit,24bit采樣精度
支持8KHz~48KHz采樣率
四路模擬輸出:
一路立體聲earpiece輸出(EAROUTP,EAROUTN)
一路立體聲phoneout輸出(PHONEOUTP,PHONEOUTN)
一路立體聲headphone輸出(HPOUTL,HPOUTR)
一路立體聲lineout輸出(LINEOUTL,LINEOUTR)
四路路模擬輸入:MIC1,MIC2,linein,phonein
支持headphone驅動
支持earpiece驅動
支持同時playback和record(全雙工模式)
支持適用于DAC的DRC功能
支持適用于ADC的AGC,DRC功能
2.7.4.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Sun50iw1 Codec Support
2.7.4.2 sys_config配置.
[sndcodec] sndcodec_used = 0x1 aif2fmt = 0x3 aif3fmt = 0x3 aif2master = 0x1 linein_detect = port:PH05<6> hp_detect_case = 0x1 ;------------------------------------------------------------------------------ [i2s] i2s_used = 0x1 ;------------------------------------------------------------------------------- [codec] codec_used = 0x1 headphonevol = 0x38spkervol = 0x1d earpiecevol = 0x1e maingain = 0x4 headsetmicgain = 0x4 adcagc_cfg = 0x0 adcdrc_cfg = 0x0 adchpf_cfg = 0x1 dacdrc_cfg = 0x0 dachpf_cfg = 0x0 aif2config = 0x0 aif3config = 0x0 aif1_lrlk_div = 0x40 aif2_lrlk_div = 0x40 pa_sleep_time = 0x0a dac_digital_vol = 0x9898 gpio-spk =
sndcodec配置,即machine驅動的相關配置
sndcodec配置 | sndcodec配置說明 |
---|---|
sndcodec_used 是否使用sndcodec驅動。 | 0 :不使用; 1 :使用 |
linein_detect | linein檢測引腳 |
hp_detect_case | jack irq level, 0:low; 1:high |
codec配置,即內置audiocodec驅動的相關配置
codec配置 | codec配置說明 |
---|---|
codec_used | 是否使用codec驅動。0 :不使用; 1 :使用 |
headphonevol | headphone volume,可設定范圍0~0x3f, 0表示mute, 1~63表 示-62dB~0dB, 1dB/step |
spkervol | spk(lineout) volume,可設定范圍0~0x1f, 0或者 1 表示mute, 2~31 表示-43.5dB~0dB, 1.5dB/step |
earpiecevol | earpiece volume,可設定范圍0~0x1f, 0或者 1 表示mute, 2~31表 示-43.5dB~0dB, 1.5dB/step |
maingain | MIC1默認增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step |
headsetmicgain | MIC2默認增益, 0–7, 0:0dB, 1~7:24–42dB,3dB/step |
adcagc_cfg | 是否使用adcagc. 0:不適用; 1 :使用 |
adcdrc_cfg | 是否使用adcdrc. 0:不適用; 1 :使用 |
adchpf_cfg | 是否使用adchpf. 0:不適用; 1 :使用 |
dacdrc_cfg | 是否使用dacdrc. 0:不適用; 1 :使用 |
dachpf_cfg | 是否使用dachpf. 0:不適用; 1 :使用 |
aif1_lrlk_div | aif1的lrck分頻系數 |
pa_sleep_time | 使能pa之前等待的時間,單位ms |
dac_digital_vol | DACL/DACR數字音量,0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB, 0x98表示-6dB |
codec配置 | codec配置說明 |
---|---|
gpio-spk | PA使能引腳 |
2.7.4.3 codec數據通路
通過HPOUTL/R播歌 AIF1DACL --> AIF1IN0L Mux --> DACL Mixer --> HP_L Mux --> HPOUTL AIF1DACR --> AIF1IN0R Mux --> DACR Mixer --> HP_R Mux --> HPOUTR 通過MIC1,2錄音 AIF1ADCL <-- AIF1OUT0L Mux <-- AIF1 AD0L Mixer <-- ADCL Mux <-- LADC input Mixer <-- MIC1 PGA <-- MIC1P/N AIF1ADCR <-- AIF1OUT0R Mux <-- AIF1 AD0R Mixer <-- ADCR Mux <-- RADC input Mixer <-- MIC2 PGA <-- MIC2P/N
R18相關控件如下表:
控件名稱 | 功能 | 數值 |
---|---|---|
Headphone Switch | Headphone通路使能 | 0:關閉; 1:開啟 |
Linein_detect Switch | Linein檢測使能 | 0:關閉; 1:開啟 |
ADC input gain control | ADC增益 | 0–7,表示-4.5–6dB |
ADC volume | ADCL/ADCR音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
ADCL Mux | ADCL Mux設置,只支持 0:ADC | 0:ADC |
ADCR Mux | ADCR Mux設置,只支持 0:ADC | 0:ADC |
AIF1 AD0L Mixer ADCL Switch | AIF1 AD0L Mixer設 置,使能ADCL通路 | 0:關閉; 1:開啟 |
AIF1 AD0L Mixer AIF1 DA0L Switch | AIF1 AD0L Mixer設 置,使能AIF1 DA0L通路 | 0:關閉; 1:開啟 |
AIF1 AD0L Mixer AIF2 DACL Switch | AIF1 AD0L Mixer設 置,使能AIF2 DACL通路 | 0:關閉; 1:開啟 |
AIF1 AD0L Mixer AIF2 DACR Switch | AIF1 AD0L Mixer設 置,使能AIF2 DACR通路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer ADCR Switch | AIF1 AD0R Mixer設 置,使能ADCR通路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer AIF1 DA0R Switch | AIF1 AD0R Mixer設 置,使能AIF1 DA0R通路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer AIF2 DACL Switch | AIF1 AD0R Mixer設 置,使能AIF2 DACL通路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer AIF2 DACR Switch | AIF1 AD0R Mixer設 置,使能AIF2 DACR通路 | 0:關閉; 1:開啟 |
AIF1 AD1L Mixer ADCL Switch | AIF1 AD1L Mixer設 置,使能ADCL通路 | 0:關閉; 1:開啟 |
AIF1 AD1L Mixer AIF2 DACL Switch | AIF1 AD1L Mixer設 置,使能AIF2 DACL通路 | 0:關閉; 1:開啟 |
AIF1 AD1R Mixer ADCR Switch | AIF1 AD1R Mixer設 置,使能ADCR通路 | 0:關閉; 1:開啟 |
AIF1 AD1R Mixer AIF2 DACR Switch | AIF1 AD1R Mixer設 置,使能AIF2 DACR通路 | 0:關閉; 1:開啟 |
AIF1 ADC timeslot 0 mixer gain | AIF1 ADC0L/ADC0R Mixer,數字增益 | 0:0dB; 1:-6dB; |
對于ADC0L Mixer, bit0:AIF2 DACR; bit1:ADCL; bit2:AIF2 DACL; bit3:AIF2 DA0L; 對于ADC0R Mixer, bit0:AIF2 DACL; bit1:ADCR; bit2:AIF2 DACR; bit3:AIF2 DA0R; | ||
AIF1 ADC timeslot 0 volume | AIF1 ADC0L/ADC0R 音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1 ADC timeslot 1 mixer gain | AIF1 ADC1L/ADC1R Mixer,數字增益 | 0:0dB; 1:-6dB; |
對于ADC1L Mixer, bit0:ADCL; bit1:AIF2 DACL; 對于ADC1R Mixer, bit0:ADCR; bit1:AIF2 DACR; | ||
AIF1 ADC timeslot 1 volume | AIF1 ADC1L/ADC1R 音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1 DAC timeslot 0 volume | AIF1 DAC0L/DAC0R 音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1 DAC timeslot 1 volume | AIF1 DAC1L/DAC1R 音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1IN0L Mux | AIF1IN0L Mux設置 | 0:AIF1_DA0L; 1:AIF1_DA0R; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R |
AIF1IN0R Mux | AIF1IN0R Mux設置 | 0:AIF1_DA0R; 1:AIF1_DA0L; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R |
AIF1IN1L Mux | AIF1IN1L Mux設置 | 0:AIF1_DA1L; 1:AIF1_DA1R; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R |
AIF1IN1R Mux | AIF1IN1R Mux設置 | 0:AIF1_DA1R; 1:AIF1_DA1L; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R |
AIF1OUT0L Mux | AIF1OUT0L Mux設置 | 0:AIF1_AD0L; 1:AIF1_AD0R; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R |
AIF1OUT0R Mux | AIF1OUT0R Mux設置 | 0:AIF1_AD0R; 1:AIF1_AD0L; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R |
AIF1OUT1L Mux | AIF1OUT1L Mux設置 | 0:AIF1_AD1L; 1:AIF1_AD1R; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R |
AIF1OUT1R Mux | AIF1OUT1R Mux設置 | 0:AIF1_AD1R; 1:AIF1_AD1L; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R |
DAC mixer gain | DAC mixer增益 | 0:0dB; 1:-6dB; |
對于DACL Mixer, bit0:ADCL; bit1:AIF2 DACL; bit2:AIF1 DAC1L; bit3:AIF1 DAC0L; 對于DACR Mixer, bit0:ADCR; bit1:AIF2 DACR; bit2:AIF1 DAC1R; bit3:AIF1 DAC0R; | ||
DAC volume | DACL/DACR音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
DACL Mixer ADCL Switch | DACL Mixer設置,使能 ADCL通路 | 0:關閉; 1:開啟 |
DACL Mixer AIF1DA0L Switch | DACL Mixer設置,使能 AIF1DA0L通路 | 0:關閉; 1:開啟 |
DACL Mixer AIF1DA1L Switch | DACL Mixer設置,使能 AIF1DA1L通路 | 0:關閉; 1:開啟 |
DACL Mixer AIF2DACL Switch | DACL Mixer設置,使能 AIF2DACL通路 | 0:關閉; 1:開啟 |
DACR Mixer ADCR Switch | DACR Mixer設置,使 能ADCR通路 | 0:關閉; 1:開啟 |
DACR Mixer AIF1DA0R Switch | DACR Mixer設置,使 能AIF1DA0R通路 | 0:關閉; 1:開啟 |
DACR Mixer AIF1DA1R Switch | DACR Mixer設置,使 能AIF1DA1R通路 | 0:關閉; 1:開啟 |
DACR Mixer AIF2DACR Switch | DACR Mixer設置,使 能AIF2DACR通路 | 0:關閉; 1:開啟 |
EAR Mux | EAR Mux設置 | 0:DACR; 1:DACL; 2:Right Analog Mixer; 3:Left Analog Mixer |
Earpiece Switch | Earpiece通路使能 | 0:關閉; 1:開啟 |
External Speaker Switch | 使能Headphone以及 PA | 0:關閉; 1:開啟 |
HP_L Mux | HP_L Mux設置 | 0:DACL ; 1:Left Output Mixer |
HP_R Mux | HP_R Mux設置 | 0:DACR ; 1:Right Output Mixer |
LADC input Mixer LINEINL | LADC input Mixer設 置,使能LINEINL通路 | 0:關閉; 1:開啟 |
LADC input Mixer MIC1 boost Switch | LADC input Mixer設 置,使能MIC1通路 | 0:關閉; 1:開啟 |
LADC input Mixer MIC2 boost Switch | LADC input Mixer設 置,使能MIC2通路 | 0:關閉; 1:開啟 |
LADC input Mixer l_output mixer Switch | LADC input Mixer設 置,使能l_output mixer通路 | 0:關閉; 1:開啟 |
LADC input Mixer r_output mixer Switch | LADC input Mixer設 置,使能r_output mixer通路 | 0:關閉; 1:開啟 |
LINEINL/R to L_R output mixer gain Left Output Mixer DACL Switch | Left Output Mixer設 置,使能DACL通路 | 0:關閉; 1:開啟 |
Left Output Mixer DACR Switch | Left Output Mixer設 置,使能DACR通路 | 0:關閉; 1:開啟 |
Left Output Mixer LINEINL Switch | Left Output Mixer設 置,使能LINEINL通路 | 0:關閉; 1:開啟 |
Left Output Mixer MIC1Booststage Switch | Left Output Mixer設 置,使能MIC1通路 | 0:關閉; 1:開啟 |
Left Output Mixer MIC2Booststage Switch | Left Output Mixer設 置,使能MIC2通路 | 0:關閉; 1:開啟 |
MIC1 boost amplifier gain | MIC1增益 | 0–7, 0:0dB, 1~7:24–42dB,3dB/step |
MIC1_G boost stage output mixer control | MIC1 to L or R output Mixer增益 | 0–7,表示-4.5–6dB |
MIC2 BST stage to L_R outp mixer gain | MIC2 to L or R output Mixer增益 | 0–7,表示-4.5–6dB |
MIC2 SRC | MIC2 SRC設置 | 0:MIC3; 1:MIC2 |
MIC2 boost AMP gain control | MIC2增益 | 0–7, 0:0dB, 1~7:24–42dB,3dB/step |
RADC input Mixer LINEINR Switch | RADC input Mixer設 置,使能LINEINR通路 | 0:關閉; 1:開啟 |
RADC input Mixer MIC1 boost Switch | RADC input Mixer設 置,使能MIC1通路 | 0:關閉; 1:開啟 |
RADC input Mixer MIC2 boost Switch | RADC input Mixer設 置,使能MIC2通路 | 0:關閉; 1:開啟 |
RADC input Mixer l_output mixer Switch | RADC input Mixer設 置,使能l_output mixer通路 | 0:關閉; 1:開啟 |
RADC input Mixer l_output Switch | RADC input Mixer設 置,使能l_output mixer通路 | 0:關閉; 1:開啟 |
Right Output Mixer DACL Switch | Right Output Mixer設 置,使能DACL通路 | 0:關閉; 1:開啟 |
Right Output Mixer DACR Switch | Right Output Mixer設 置,使能DACR通路 | 0:關閉; 1:開啟 |
Right Output Mixer LINEINR Switch | Right Output Mixer設 置,使能LINEINR通路 | 0:關閉; 1:開啟 |
Right Output Mixer MIC1Booststage Switch | Right Output Mixer設 置,使能MIC1通路 | 0:關閉; 1:開啟 |
Right Output Mixer MIC2Booststage Switch | Right Output Mixer設 置,使能MIC2通路 | 0:關閉; 1:開啟 |
SPK_L Mux | SPK_L Mux設置 | 0:MIXEL Switch; 1:MIXL MIXR Switch |
SPK_R Mux | SPK_R Mux設置 | 0:MIXER Switch; 1:MIXR MIXL Switch |
digital volume | 數字音量設置 | 0–63,表示-73.08–0dB |
earpiece volume | earpiece音量設置 | 0–31,表示-43.5–0dB |
headphone volume | headphone音量設置 | 0–63,0表示mute; 1~63表 示-62dB–0dB |
speaker volume | speaker(lineout)音量設置 | 0–31,表示-43.5–0dB |
2.75 Daudio.
硬件特性
? 三路I2S/PCM;
? 支持主從模式
支持Left-justified,Right-justified,Standar mode I2S,PCM mode
支持i2s,pcm協議格式配置
支持同時playback和record(全雙工模式)
支持8~192KHz采樣率
支持16,24,32bit采樣精度
2.7.5.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Digital Audio Support
2.7.5.2 sys_config配置.
[snddaudio0] snddaudio0_used = 1 ;----------------------------------------------------------------------------- [daudio0] daudio0_used = 1 pcm_lrck_period = 0x60 pcm_lrckr_period = 0x01 slot_width_select = 0x18 pcm_lsb_first = 0x0 tx_data_mode = 0x0 rx_data_mode = 0x0 daudio_master = 0x04 audio_format = 0x01 signal_inversion = 0x01frametype = 0x0 tdm_config = 0x01 clk_active = 0x0
snddaudio0配置,即daudio0 machine驅動的相關配置
snddaudio配置 | snddaudio配置說明 |
---|---|
snddaudio0_used | 是否使用snddaudio驅動。 0 :不使用; 1 :使用 |
daudio0配置,即daudio0 platform驅動的相關配置
daudio配置 | daudio配置說明 |
---|---|
daudio0_used | 是否使用daudio驅動。 0 :不使用; 1 :使用 |
daudio_master | 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作為slave, codec作為master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave |
audio_format | 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge) |
signal_inversion | 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame) 2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM) 3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM) 4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM) |
slot_width_select | 支持8bit, 16bit, 32bit寬度 |
pcm_lrck_period | 一般可配置16/32/64/128/256個bclk |
msb_lsb_first | 0: msb first; 1: lsb first |
frametype | 0: short frame = 1 clock width; 1: long frame = 2 clock width |
tdm_config | 0: pcm mode; 1: i2s mode |
tx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
daudio配置 | daudio配置說明 |
---|---|
rx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
具體Daudio外接codec,數字功放的配置,可參考《R18外掛codec:ac108》《R18外掛數字功放TAS5731》
2.7.6 SPDIF
硬件特性
? 支持S/PDIF_OUT
支持mono和stereo模式
輸出支持22.05kHz, 24kHz, 32kHz, 44.1kHz, 48kHz, 88.2kHz, 96kHz, 176.4kHz, 192kHz采樣率
支持16bit,24bit采樣精度
2.7.6.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner SPDIF Support
2.7.6.2 sys_config配置.
[spdif] spdif_used = 0 [sndspdif] sndspdif_used = 0
spdif配置,即platform驅動的相關配置
spdif配置 | spdif配置說明 |
---|---|
spdif_used | 是否使用spdif驅動。 0 :不使用; 1 :使用 |
sndspdif配置,即machine驅動的相關配置
sndspdif配置 | sndspdif配置說明 |
---|---|
sndspdif_used | 是否使用sndspdif驅動。 0 :不使用; 1 :使用 |
sys_config中不需要配置codec驅動相關信息
因為machine驅動代碼中默認配置了”spdif-utils”作為codec驅動,代碼路徑:
linux-4.4/sound/soc/sunxi/spdif-utils.c
2.7.7 外掛codec:AC108
R18標案tulip-noma搭配了MIC子板,含有兩片AC108,每片最高可錄 4 通道
下面對R18如何配置使用AC108作簡單介紹
2.7.7.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Digital Audio Support CODEC drivers ---> <*> Sunxi AC108 Codec
2.7.7.2 sys_config&dts配置.
R18通過twi1控制AC108,而i2s0用于音頻數據的傳輸
twi部分配置,可通過dts進行配置:
twi1: twi@0x01c2b000 { status = "okay"; ac108@35{ compatible = "Allwinnertech,MicArray_1"; debug_mode = <0>; pga_gain = <0x32>; ref_pga_gain = <0x08>; ref_chip_addr = <0x3b>; ref_channel_num = <0x2>; pa_double_used = <0x1>;codec_mic_used = <0x0>; gpio-power = <&r_pio PL 12 1 1 1 1>; twi_bus = <1>; voltage_enable = "nocare"; power_vol = <0x0>; slot_width = <0x18>; reg = <0x35>; }; ac108@3b{ compatible = "Allwinnertech,MicArray_0"; reg = <0x3b>; debug_mode = <0>; pga_gain = <0x32>; ref_pga_gain = <0x08>; ref_chip_addr = <0x3b>; ref_channel_num = <0x2>; pa_double_used = <0x1>; codec_mic_used = <0x0>; twi_bus = <1>; voltage_enable = "nocare"; gpio-power = <&r_pio PL 12 1 1 1 1>; power_vol = <0x0>; slot_width = <0x18>; }; };
I2S部分需要配置sys_config以及dts
sys_config部分主要涉及i2s相關格式,需要根據AC108spec進行配置,sdk默認daudio0 配置可正常運行AC108
dts部分主要需要指定ASOC codec以及codec-dai驅動的名稱,如
snddaudio0:sound@1 { sunxi,snddaudio-codec = "ac108.1-0035"; sunxi,snddaudio-codec-dai = "ac108-pcm1"; };
2.7.7.3 使用
進入系統后,通過命令cat /proc/asound/cards列出當前聲卡信息,如果發現ac108相關聲 卡,說明已經正常加載驅動
無需額外設置音頻通路,可直接用下面命令進行錄音:
arecord -Dhw:sndac10810035 -f S16_LE -r 16000 -c 8 /tmp/test.wav
2.7.8 外掛數字功放TAS5731.
R18標案tulip-noma搭配了一片數字功放TAS5731
下面對R18如何配置使用tas5731作簡單介紹
2.7.8.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Digital Audio Support CODEC drivers ---> <*> TAS5731 PA
2.7.8.2 sys_config&dts配置.
R18通過TWI0控制數字功放,而I2S1用于音頻數據的傳輸
twi部分配置,可通過dts進行配置:
twi0: twi@0x01c2ac00 { status = "okay"; tas5731-codec@1b{ compatible = "Allwinnertech,tas5731_PA"; tas5731_power = <&pio PH 8 1 1 1 1>; tas5731_reset = <&pio PB 2 1 1 1 1>; amp_poweren = <&r_pio PL 7 1 1 1 1>; regulator_name = "vcc-amp"; reg = <0x1b>; }; };
I2S部分需要配置sys_config以及dts
sys_config部分主要涉及i2s相關格式,需要根據具體數字功放進行配置,sdk默認daudio1 配置可正常運行tas5731
dts部分主要需要指定ASOC codec以及codec-dai驅動的名稱,如
snddaudio1:sound@2 { sunxi,snddaudio-codec = "tas5731-codec.0-001b"; sunxi,snddaudio-codec-dai = "tas5731_audio"; };
2.7.8.3 使用
進入系統后,通過命令cat /proc/asound/cards列出當前聲卡信息,如果發現tas5731相關聲 卡,說明已經正常加載驅動
無需額外設置音頻通路,可直接用下面命令進行播歌:
aplay -Dhw:sndtas5731codec /mnt/UDISK/16000-stere-10s.wav
2.7.9 HDMI音頻接口
R18使用I2S2將音頻數據傳輸到HDMI模塊,并且I2S2也只能用于HDMI。
2.7.9.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner HDMI Audio Support <*> Allwinner Digital Audio Support
2.7.9.2 sys_config配置.
[daudio2] daudio2_used = 1 [sndhdmi] sndhdmi_used = 1
daudio2配置,即daudio2 platform驅動的相關配置
daudio2配置 | daudio2配置說明 |
---|---|
daudio2_used | 是否使用daudio2驅動。 0 :不使用; 1 :使用 |
sndhdmi配置,即sndhdmi machine驅動的相關配置
sndhdmi配置 | sndhdmi配置說明 |
---|---|
sndhdmi_used | 是否使用sndhdmi驅動。 0 :不使用; 1 :使用 |
2.7.10 標案音頻測試方法.
該章節主要介紹在標案上進行播歌,錄音的測試命令。
2.7.10.1播放
amixer -Dhw:audiocodec cset name='AIF1IN0L Mux' 'AIF1_DA0L' amixer -Dhw:audiocodec cset name='AIF1IN0R Mux' 'AIF1_DA0R' amixer -Dhw:audiocodec cset name='DACL Mixer AIF1DA0L Switch' 1 amixer -Dhw:audiocodec cset name='DACR Mixer AIF1DA0R Switch' 1 amixer -Dhw:audiocodec cset name='HP_R Mux' 'DACR HPR Switch' amixer -Dhw:audiocodec cset name='HP_L Mux' 'DACL HPL Switch' amixer -Dhw:audiocodec cset name='Headphone Switch' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav
可通過下面命令調節硬件上的模擬音量:
amixer -Dhw:audiocodec cset name='headphone volume' 60
2.7.10.2錄音
amixer -Dhw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1 amixer -Dhw:audiocodec cset name='RADC input Mixer MIC2 boost Switch' 1 amixer -Dhw:audiocodec cset name='AIF1 AD0L Mixer ADCL Switch' 1 amixer -Dhw:audiocodec cset name='AIF1 AD0R Mixer ADCR Switch' 1 amixer -Dhw:audiocodec cset name='AIF1OUT0L Mux' 'AIF1_AD0L' amixer -Dhw:audiocodec cset name='AIF1OUT0R Mux' 'AIF1_AD0R' arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 /tmp/test.wav
2.8 R30音頻接口
2.8.1 硬件資源
R30包含 5 個音頻模塊,分別是內置AudioCodec,Daudio0,Daudio1,Daudio2以及Dmic
2.8.2 時鐘源
R30中, 5 個音頻模塊的時鐘源均來自pll_audio。
pll_audio可以輸出24.576M或者22.5792M的時鐘,分別支持48k系列,44.1k系列的播 放錄音。
2.8.3 代碼結構
linux-4.9/sound/soc/sunxi/ ├── sun50iw3-codec.c // codec驅動 ├── sun50iw3-codec.h ├── sun50iw3-sndcodec.c // codec machine驅動 ├── sunxi-inter-i2s.c // codec platform驅動├── sunxi-inter-i2s.h ├── sunxi-daudio.c // daudio platform驅動 ├── sunxi-daudio.h ├── sunxi-dmic.c // dmic platform驅動 ├── sunxi-dmic.h ├── sunxi-pcm.c //通用文件,提供注冊platform驅動的接口及相關函數集 ├── sunxi-pcm.h ├── sunxi_rw_func.c //通用文件,讀寫模擬/數字寄存器的接口 ├── sunxi_rw_func.h ├── sunxi-snddaudio.c // daudio machine驅動 ├── sunxi-snddaudio.h ├── sunxi-snddmic.c // dmic machine驅動 └── sunxi-snddmic.h linux-4.9/sound/soc/codecs/dmic.c // dmic codec驅動 linux-4.9/sound/soc/soc-utils.c // daudio codec驅動
2.8.4 AudioCodec
硬件特性
? 兩路DAC
支持16bit,24bit采樣精度
支持8KHz~192KHz采樣率
兩路ADC
支持16bit,24bit采樣精度
支持8KHz~48KHz采樣率
四路模擬輸出:
一路立體聲earpiece輸出(EAROUTP,EAROUTN)
一路立體聲phoneout輸出(PHONEOUTP,PHONEOUTN)
一路立體聲headphone輸出(HPOUTL,HPOUTR)
一路立體聲lineout輸出(LINEOUTL,LINEOUTR)
四路路模擬輸入:MIC1,MIC2,linein,phonein
支持headphone驅動
支持earpiece驅動
支持同時playback和record(全雙工模式)
支持適用于DAC的DRC功能
支持適用于ADC的AGC,DRC功能
2.8.4.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Sun50iw3 Codec Support
2.8.4.2 sys_config配置.
[sndcodec] sndcodec_used = 0x1 aif2fmt = 0x3 aif3fmt = 0x3 aif2master = 0x1 hp_detect_case = 0x0 ;------------------------------------------------------------------------------ [i2s] i2s_used = 0x1 ;------------------------------------------------------------------------------- [codec] codec_used = 0x1 headphonevol = 0x3b spkervol = 0x1b maingain = 0x4 headsetmicgain = 0x4 adcagc_cfg = 0x0 adcdrc_cfg = 0x0 adchpf_cfg = 0x0 dacdrc_cfg = 0x0 dachpf_cfg = 0x0 aif2config = 0x0 aif3config = 0x0 gpio-spk = port:PB3<1><0>
sndcodec配置,即machine驅動的相關配置
sndcodec配置 | sndcodec配置說明 |
---|---|
sndcodec_used | 是否使用sndcodec驅動。 0 :不使用; 1 :使用 |
aif2fmt | 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge) |
aif3fmt | 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge) |
aif2master | 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master), 即aif接口選擇master模式 2: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即aif 接口選擇slave模式 |
hp_detect_case | jack irq level, 0:low; 1:high |
I2S配置,即audiocodec platform驅動的相關配置,內部aif接口用的I2S(與I2S0,I2S1接口無關)
i2s配置 | i2s配置說明 |
---|---|
i2s_used | 是否使用i2s驅動。 0 :不使用; 1 :使用 |
codec配置,即內置audiocodec驅動的相關配置
codec配置 | codec配置說明 |
---|---|
codec_used | 是否使用codec驅動。 0 :不使用; 1 :使用 |
headphonevol | 初始化headphone volume,可設定范圍0~0x3f,表示0~-62dB, -1dB/step |
spkervol | 初始化speaker volume,可設定范圍0~0x1f, 0或者 1 表示mute, 2~31表示-43.5dB~0dB, 1.5dB/step |
headsetmicgain | 指的是MIC2增益,可設定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一般設置0x4,即24dB |
adcinputgain | adc增益,可設定范圍0~0x7,表示-4.5~6dB, 1.5dB/step,一般設置0x3,即0dB |
adcagc_cfg | 是否使用adcagc. 0:不使用; 1 :使用 |
adcdrc_cfg | 是否使用adcdrc. 0:不使用; 1 :使用 |
adchpf_cfg | 是否使用adchpf. 0:不使用; 1 :使用 |
dacdrc_cfg | 是否使用dacdrc. 0:不使用; 1 :使用 |
aif2config | 是否使用aif2. 0:不使用; 1 :使用 |
aif3config | 是否使用aif3. 0:不使用; 1 :使用 |
gpio-spk | PA使能引腳 |
2.8.4.3 codec數據通路
通過SPKL/R播歌 AIF1DACL --> AIF1IN0L Mux --> DACL Mixer --> Left Output Mixer --> SPK_L Mux --> SPKL AIF1DACR --> AIF1IN0R Mux --> DACR Mixer --> Right Output Mixer --> SPK_R Mux --> SPKR 通過LINEOUTL/R播歌 AIF1DACL --> AIF1IN0L Mux --> DACL Mixer --> Left Output Mixer --> LINEOUTL Mux --> LINEOUTL AIF1DACR --> AIF1IN0R Mux --> DACR Mixer --> Right Output Mixer --> LINEOUTR Mux --> LINEOUTR 通過HPOUTL/R播歌 AIF1DACL --> AIF1IN0L Mux --> DACL Mixer --> HP_L Mux --> HPOUTL AIF1DACR --> AIF1IN0R Mux --> DACR Mixer --> HP_R Mux --> HPOUTR 通過MIC1,2錄音 AIF1ADCL <-- AIF1OUT0L Mux <-- AIF1 AD0L Mixer <-- LADC input Mixer <-- MIC1 PGA <-- MIC1P/ N AIF1ADCR <-- AIF1OUT0R Mux <-- AIF1 AD0R Mixer <-- RADC input Mixer <-- MIC2 PGA <-- MIC2P/ N 通過LINEINL/R錄音 AIF1ADCL <-- AIF1OUT0L Mux <-- AIF1 AD0L Mixer <-- LADC input Mixer <-- LINEINN AIF1ADCR <-- AIF1OUT0R Mux <-- AIF1 AD0R Mixer <-- RADC input Mixer <-- LINEINP
R30相關控件如下表:
控件名稱 | 功能 | 數值 |
---|---|---|
Headphone Switch | Headphone通路使能 | 0:關閉; 1:開啟 |
Lineout Switch | Lineout通路使能 | 0:關閉; 1:開啟 |
ADC input gain control | ADC增益 | 0–7,表示-4.5–6dB |
ADC volume | ADCL/ADCR音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1 AD0L Mixer ADCL Switch | AIF1 AD0L Mixer設 置,使能ADCL通路 | 0:關閉; 1:開啟 |
AIF1 AD0L Mixer AIF1 DA0L Switch | AIF1 AD0L Mixer設 置,使能AIF1 DA0L通 路 | 0:關閉; 1:開啟 |
AIF1 AD0L Mixer AIF2 DACL Switch | AIF1 AD0L Mixer設 置,使能AIF2 DACL通 路 | 0:關閉; 1:開啟 |
AIF1 AD0L Mixer AIF2 DACR Switch | AIF1 AD0L Mixer設 置,使能AIF2 DACR通 路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer ADCR Switch | AIF1 AD0R Mixer設 置,使能ADCR通路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer AIF1 DA0R Switch | AIF1 AD0R Mixer設 置,使能AIF1 DA0R通 路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer AIF2 DACL Switch | AIF1 AD0R Mixer設 置,使能AIF2 DACL通 路 | 0:關閉; 1:開啟 |
AIF1 AD0R Mixer AIF2 DACR Switch | AIF1 AD0R Mixer設 置,使能AIF2 DACR通 路 | 0:關閉; 1:開啟 |
AIF1 AD1L Mixer ADCL Switch | AIF1 AD1L Mixer設 置,使能ADCL通路 | 0:關閉; 1:開啟 |
AIF1 AD1L Mixer AIF2 DACL Switch | AIF1 AD1L Mixer設 置,使能AIF2 DACL通 路 | 0:關閉; 1:開啟 |
AIF1 AD1R Mixer ADCR Switch | AIF1 AD1R Mixer設 置,使能ADCR通路 | 0:關閉; 1:開啟 |
AIF1 AD1R Mixer AIF2 DACR Switch | AIF1 AD1R Mixer設 置,使能AIF2 DACR通 路 | 0:關閉; 1:開啟 |
AIF1 ADC timeslot 0 mixer gain | AIF1 ADC0L/ADC0R Mixer,數字增益 | 0:0dB; 1:-6dB; |
對于ADC0L Mixer, bit0:AIF2 DACR; bit1:ADCL; bit2:AIF2 DACL; bit3:AIF2 DA0L; 對于ADC0R Mixer, bit0:AIF2 DACL; bit1:ADCR; bit2:AIF2 DACR; bit3:AIF2 DA0R; | ||
AIF1 ADC timeslot 0 volume | AIF1 ADC0L/ADC0R 音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1 ADC timeslot 1 mixer gain | AIF1 ADC1L/ADC1R Mixer,數字增益 | 0:0dB; 1:-6dB; |
對于ADC1L Mixer, bit0:ADCL; bit1:AIF2 DACL; 對于ADC1R Mixer, bit0:ADCR; bit1:AIF2 DACR; | ||
AIF1 ADC timeslot 1 volume | AIF1 ADC1L/ADC1R 音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1 DAC timeslot 0 volume | AIF1 DAC0L/DAC0R 音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1 DAC timeslot 1 volume | AIF1 DAC1L/DAC1R 音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
AIF1IN0L Mux | AIF1IN0L Mux設置 | 0:AIF1_DA0L; 1:AIF1_DA0R; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R |
AIF1IN0R Mux | AIF1IN0R Mux設置 | 0:AIF1_DA0R; 1:AIF1_DA0L; 2:SUM_AIF1DA0L_AIF1DA0R; 3:AVE_AIF1DA0L_AIF1DA0R |
AIF1IN1L Mux | AIF1IN1L Mux設置 | 0:AIF1_DA1L; 1:AIF1_DA1R; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R |
AIF1IN1R Mux | AIF1IN1R Mux設置 | 0:AIF1_DA1R; 1:AIF1_DA1L; 2:SUM_AIF1DA1L_AIF1DA1R; 3:AVE_AIF1DA1L_AIF1DA1R |
AIF1OUT0L Mux | AIF1OUT0L Mux設置 | 0:AIF1_AD0L; 1:AIF1_AD0R; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R |
AIF1OUT0R Mux | AIF1OUT0R Mux設置 | 0:AIF1_AD0R; 1:AIF1_AD0L; 2:SUM_AIF1AD0L_AIF1AD0R; 3:AVE_AIF1AD0L_AIF1AD0R |
AIF1OUT1L Mux | AIF1OUT1L Mux設置 | 0:AIF1_AD1L; 1:AIF1_AD1R; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R |
AIF1OUT1R Mux | AIF1OUT1R Mux設置 | 0:AIF1_AD1R; 1:AIF1_AD1L; 2:SUM_AIF1AD1L_AIF1AD1R; 3:AVE_AIF1AD1L_AIF1AD1R |
DAC mixer gain | DAC mixer增益 | 0:0dB; 1:-6dB; |
對于DACL Mixer, bit0:ADCL; bit1:AIF2 DACL; bit2:AIF1 DAC1L; bit3:AIF1 DAC0L; 對于DACR Mixer, bit0:ADCR; bit1:AIF2 DACR; bit2:AIF1 DAC1R; bit3:AIF1 DAC0R; | ||
DAC volume | DACL/DACR音量設置 | 0–0xff, 0表示mute, 0x1~0xff表 示-119.25dB~71.25dB, 0.75dB/step,如0xA0表示0dB |
DACL Mixer ADCL Switch | DACL Mixer設置,使能 ADCL通路 | 0:關閉; 1:開啟 |
DACL Mixer AIF1DA0L Switch | DACL Mixer設置,使能 AIF1DA0L通路 | 0:關閉; 1:開啟 |
DACL Mixer AIF1DA1L Switch | DACL Mixer設置,使能 AIF1DA1L通路 | 0:關閉; 1:開啟 |
DACL Mixer AIF2DACL Switch | DACL Mixer設置,使能 AIF2DACL通路 | 0:關閉; 1:開啟 |
DACR Mixer ADCR Switch | DACR Mixer設置,使 能ADCR通路 | 0:關閉; 1:開啟 |
DACR Mixer AIF1DA0R Switch | DACR Mixer設置,使 能AIF1DA0R通路 | 0:關閉; 1:開啟 |
DACR Mixer AIF1DA1R Switch | DACR Mixer設置,使 能AIF1DA1R通路 | 0:關閉; 1:開啟 |
DACR Mixer AIF2DACR Switch | DACR Mixer設置,使 能AIF2DACR通路 | 0:關閉; 1:開啟 |
External Speaker Switch | 使能Headphone以及 PA | 0:關閉; 1:開啟 |
HP_L Mux | HP_L Mux設置 | 0:DACL ; 1:Left Output Mixer |
HP_R Mux | HP_R Mux設置 | 0:DACR ; 1:Right Output Mixer |
LADC input Mixer LINEINL | LADC input Mixer設 置,使能LINEINL通路 | 0:關閉; 1:開啟 |
LADC input Mixer MIC1 boost Switch | LADC input Mixer設 置,使能MIC1通路 | 0:關閉; 1:開啟 |
LADC input Mixer MIC2 boost Switch | LADC input Mixer設 置,使能MIC2通路 | 0:關閉; 1:開啟 |
LADC input Mixer l_output mixer Switch | LADC input Mixer設 置,使能l_output mixer通路 | 0:關閉; 1:開啟 |
LADC input Mixer r_output mixer Switch | LADC input Mixer設 置,使能r_output mixer通路 | 0:關閉; 1:開啟 |
LINEINL/R to L_R output mixer gain | LINEINL/R to L or R output Mixer增益 | 0–7,表示-4.5–6dB |
LINEOUTL Mux | LINEOUTL Mux設置 | 0:left output mixer; 1:left+right output mixer |
LINEOUTR Mux | LINEOUTR Mux設置 | 0:right output mixer; 1:left+right output mixer |
Left Output Mixer DACL Switch | Left Output Mixer設 置,使能DACL通路 | 0:關閉; 1:開啟 |
Left Output Mixer DACR Switch | Left Output Mixer設 置,使能DACR通路 | 0:關閉; 1:開啟 |
Left Output Mixer LINEINL Switch | Left Output Mixer設 置,使能LINEINL通路 | 0:關閉; 1:開啟 |
Left Output Mixer MIC1Booststage Switch | Left Output Mixer設 置,使能MIC1通路 | 0:關閉; 1:開啟 |
Left Output Mixer MIC2Booststage Switch | Left Output Mixer設 置,使能MIC2通路 | 0:關閉; 1:開啟 |
MIC1 boost AMP gain control | MIC1增益 | 0–7, 0:0dB, 1~7:24–42dB,3dB/step |
MIC1_G boost stage output mixer control | MIC1 to L or R output Mixer增益 | 0–7,表示-4.5–6dB |
MIC2 BST stage to L_R outp mixer gain | MIC2 to L or R output Mixer增益 | 0–7,表示-4.5–6dB |
MIC2 SRC | MIC2 SRC設置 | 0:MIC3; 1:MIC2 |
MIC2 boost AMP gain control | MIC2增益 | 0–7, 0:0dB, 1~7:24–42dB,3dB/step |
RADC input Mixer LINEINR Switch | RADC input Mixer設 置,使能LINEINR通路 | 0:關閉; 1:開啟 |
RADC input Mixer MIC1 boost Switch | RADC input Mixer設 置,使能MIC1通路 | 0:關閉; 1:開啟 |
RADC input Mixer MIC2 boost Switch | RADC input Mixer設 置,使能MIC2通路 | 0:關閉; 1:開啟 |
RADC input Mixer l_output mixer Switch | RADC input Mixer設 置,使能l_output mixer通路 | 0:關閉; 1:開啟 |
RADC input Mixer l_output Switch | RADC input Mixer設 置,使能l_output mixer通路 | 0:關閉; 1:開啟 |
Right Output Mixer DACL Switch | Right Output Mixer設 置,使能DACL通路 | 0:關閉; 1:開啟 |
Right Output Mixer DACR Switch | Right Output Mixer設 置,使能DACR通路 | 0:關閉; 1:開啟 |
Right Output Mixer LINEINR Switch | Right Output Mixer設 置,使能LINEINR通路 | 0:關閉; 1:開啟 |
Right Output Mixer MIC1Booststage Switch | Right Output Mixer設 置,使能MIC1通路 | 0:關閉; 1:開啟 |
Right Output Mixer MIC2Booststage Switch | Right Output Mixer設 置,使能MIC2通路 | 0:關閉; 1:開啟 |
SPK_L Mux | SPK_L Mux設置 | 0:MIXEL Switch; 1:MIXL MIXR Switch |
SPK_R Mux | SPK_R Mux設置 | 0:MIXER Switch; 1:MIXR MIXL Switch |
digital volume | 數字音量設置 | 0–63,表示-73.08–0dB |
headphone volume | headphone音量設置 | 0–63,0表示mute; 1~63表 示-62dB–0dB |
lineout volume | lineout音量設置 | 0–31,表示-43.5–0dB |
speaker volume | speaker(lineout)音量 設置 | 0–31,表示-43.5–0dB |
2.8.5 Daudio.
硬件特性
? 三路I2S/PCM;
? 支持主從模式
支持Left-justified,Right-justified,Standar mode I2S,PCM mode
支持i2s,pcm協議格式配置
支持同時playback和record(全雙工模式)
支持8~192KHz采樣率
支持16,24,32bit采樣精度
2.8.5.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Digital Audio Support
2.8.5.2 sys_config配置.
[snddaudio0] snddaudio0_used = 1 [daudio0] pcm_lrck_period = 0x80 slot_width_select = 0x20 pcm_lsb_first = 0x0 tx_data_mode = 0x0 rx_data_mode = 0x0daudio_master = 0x04 audio_format = 0x01 signal_inversion = 0x01 frametype = 0x0 tdm_config = 0x01 mclk_div = 0x1 daudio0_used = 1
snddaudio0配置,即daudio0 machine驅動的相關配置
snddaudio配置 | snddaudio配置說明 |
---|---|
snddaudio0_used | 是否使用snddaudio驅動。 0 :不使用; 1 :使用 |
daudio0配置,即daudio0 platform驅動的相關配置
daudio配置 | daudio配置說明 |
---|---|
daudio0_used | 是否使用daudio驅動。 0 :不使用; 1 :使用 |
daudio_master | 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作為slave, codec作為master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave |
audio_format | 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge) |
signal_inversion | 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame) 2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM) 3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM) 4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM) |
slot_width_select | 支持8bit, 16bit, 32bit寬度 |
pcm_lrck_period | 一般可配置16/32/64/128/256個bclk |
msb_lsb_first | 0: msb first; 1: lsb first |
frametype | 0: short frame = 1 clock width; 1: long frame = 2 clock width |
tdm_config | 0: pcm mode; 1: i2s mode |
daudio配置 | daudio配置說明 |
---|---|
tx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
rx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
2.8.6 DMIC
硬件特性
? 支持 8 路輸入
支持8~48KHz采樣率
支持16/24bit采樣精度
2.8.6.1 內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner DMIC Support
2.8.6.2 sys_config配置.
[dmic] dmic_used = 0 [snddmic] snddmic_used = 0
dmic配置,即platform驅動的相關配置
dmic配置 | dmic配置說明 |
---|---|
dmic_used | 是否使用dmic驅動。 0 :不使用; 1 :使用 |
snddmic配置,即machine驅動的相關配置
snddmic配置 | snddmic配置說明 |
---|---|
snddmic_used | 是否使用snddmic驅動。 0 :不使用; 1 :使用 |
2.8.7 標案音頻測試方法
該章節主要介紹在標案上進行播歌,錄音的測試命令。
2.8.7.1 播放
通過SPKL/R播歌,例如喇叭播歌 amixer -Dhw:audiocodec cset name='AIF1IN0L Mux' 'AIF1_DA0L' amixer -Dhw:audiocodec cset name='AIF1IN0R Mux' 'AIF1_DA0R' amixer -Dhw:audiocodec cset name='DACL Mixer AIF1DA0L Switch' 1 amixer -Dhw:audiocodec cset name='DACR Mixer AIF1DA0R Switch' 1 amixer -Dhw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -Dhw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -Dhw:audiocodec cset name='SPK_R Mux' 'MIXER_Switch' amixer -Dhw:audiocodec cset name='SPK_L Mux' 'MIXEL_Switch' amixer -Dhw:audiocodec cset name='External Speaker Switch' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav 可通過下面命令調節硬件上的模擬音量: amixer -Dhw:audiocodec cset name='speaker volume' 28通過LINEOUTL/R播歌 amixer -Dhw:audiocodec cset name='AIF1IN0L Mux' 'AIF1_DA0L' amixer -Dhw:audiocodec cset name='AIF1IN0R Mux' 'AIF1_DA0R' amixer -Dhw:audiocodec cset name='DACL Mixer AIF1DA0L Switch' 1 amixer -Dhw:audiocodec cset name='DACR Mixer AIF1DA0R Switch' 1 amixer -Dhw:audiocodec cset name='Left Output Mixer DACL Switch' 1 amixer -Dhw:audiocodec cset name='Right Output Mixer DACR Switch' 1 amixer -Dhw:audiocodec cset name='LINEOUTL Mux' 'LOMIX' amixer -Dhw:audiocodec cset name='LINEOUTR Mux' 'ROMIX' amixer -Dhw:audiocodec cset name='Lineout Switch' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav 可通過下面命令調節硬件上的模擬音量: amixer -Dhw:audiocodec cset name='lineout volume' 28通過HPOUTL/R播歌,例如耳機 amixer -Dhw:audiocodec cset name='AIF1IN0L Mux' 'AIF1_DA0L' amixer -Dhw:audiocodec cset name='AIF1IN0R Mux' 'AIF1_DA0R' amixer -Dhw:audiocodec cset name='DACL Mixer AIF1DA0L Switch' 1 amixer -Dhw:audiocodec cset name='DACR Mixer AIF1DA0R Switch' 1 amixer -Dhw:audiocodec cset name='HP_R Mux' 'DACR HPR Switch' amixer -Dhw:audiocodec cset name='HP_L Mux' 'DACL HPL Switch' amixer -Dhw:audiocodec cset name='Headphone Switch' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav可通過下面命令調節硬件上的模擬音量:amixer -Dhw:audiocodec cset name='headphone volume' 60
2.8.7.2 錄音
通過MIC1,MIC2錄音 amixer -Dhw:audiocodec cset name='LADC input Mixer MIC1 boost Switch' 1 amixer -Dhw:audiocodec cset name='RADC input Mixer MIC2 boost Switch' 1 amixer -Dhw:audiocodec cset name='AIF1 AD0L Mixer ADCL Switch' 1 amixer -Dhw:audiocodec cset name='AIF1 AD0R Mixer ADCR Switch' 1 amixer -Dhw:audiocodec cset name='AIF1OUT0L Mux' 'AIF1_AD0L' amixer -Dhw:audiocodec cset name='AIF1OUT0R Mux' 'AIF1_AD0R' amixer -Dhw:audiocodec cset name='MIC1 boost AMP gain control' 4 amixer -Dhw:audiocodec cset name='MIC2 boost AMP gain control' 4 arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 /tmp/test.wav
2.9 R328音頻接口.
2.9.1 硬件資源
R328音頻接口豐富,包含 6 個音頻模塊,分別是內置AudioCodec,Daudio0,Daudio1,Daudio2, Dmic,Spdif。
另外還支持MAD作語音喚醒檢測(詳細請看R328 MAD章節)。
2.9.2 時鐘源.
R328中, 6 個音頻模塊的時鐘源均來自pll_audio。
pll_audio可以輸出24.576M或者22.5792M的時鐘,分別支持48k系列,44.1k系列的播 放錄音。
2.9.3 代碼結構
linux-4.9/sound/soc/sunxi/ ├── spdif-utils.c // spdif codec驅動 ├── sun8iw18-codec.c // codec驅動 ├── sun8iw18-codec.h ├── sun8iw18-sndcodec.c // codec machine驅動 ├── sunxi-cpudai.c // codec platform驅動 ├── sunxi-daudio.c // daudio platform驅動 ├── sunxi-daudio.h ├── sunxi-dmic.c // dmic platform驅動 ├── sunxi-dmic.h ├── sunxi-mad.c //提供MAD相關功能接口 ├── sunxi-mad.h ├── sunxi-pcm.c //通用文件,提供注冊platform驅動的接口及相關函數集 ├── sunxi-pcm.h ├── sunxi_rw_func.c //通用文件,讀寫模擬/數字寄存器的接口 ├── sunxi_rw_func.h ├── sunxi-snddaudio.c // daudio machine驅動 ├── sunxi-snddaudio.h ├── sunxi-snddmic.c // dmic machine驅動 ├── sunxi-snddmic.h ├── sunxi-sndspdif.c // spdif machine驅動 ├── sunxi-spdif.c // spdif platform驅動 └── sunxi-spdif.h linux-4.9/sound/soc/codecs/dmic.c // dmic codec驅動 linux-4.9/sound/soc/soc-utils.c // daudio codec驅動
2.9.4 AudioCodec
硬件特性
? 一路DAC
支持16bit,24bit采樣精度
支持8KHz~192KHz采樣率
三路ADC
支持16bit,24bit采樣精度
支持8KHz~48KHz采樣率
一路模擬輸出:一路差分輸出lineoutP/N,支持單端lineout輸出
三路模擬輸入:MIC1,MIC2,MIC3
支持同時playback和record(全雙工模式)
DAC及ADC均支持 5 段DRC
DAC FIFO長度12824bits, ADC FIFO長度12824bits
2.9.4.1內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Sun8iw18 Codec Support
2.9.4.2 sys_config配置
[sndcodec] sndcodec_used = 0x1 ;------------------------------------------------------------------------------ [cpudai] cpudai_used = 0x1 ;------------------------------------------------------------------------------- [codec] codec_used = 0x1 digital_vol = 0x0 lineout_vol =0x1a mic1gain = 0x4 mic2gain = 0x4 mic3gain = 0x0 adcgain = 0x3 adcagc_cfg = 0x0 adcdrc_cfg = 0x0 adchpf_cfg = 0x0dacdrc_cfg = 0x0 dachpf_cfg = 0x0 pa_ctl_level = 0x1 pa_msleep_time = 160 gpio-spk = port:PH9<1><1><1><1>
sndcodec配置,即machine驅動的相關配置
sndcodec配置 | sndcodec配置說明 |
---|---|
sndcodec_used | 是否使用sndcodec驅動。 0 :不使用; 1 :使用 |
cpudai配置,即platform驅動的相關配置
cpudai配置 | cpudai配置說明 |
---|---|
cpudai_used | 是否使用cpudai驅動。 0 :不使用; 1 :使用 |
codec配置,即內置audiocodec驅動的相關配置
codec配置 | codec配置說明 |
---|---|
codec_used | 是否使用codec驅動。 0 :不使用; 1 :使用 |
digital_vol | 初始化digital volume,可設定范圍0~0x3f,表示0~-73.08dB, -1.16dB/step |
lineout_vol | lineout volume,可設定范圍0~0x1f,表示-43.5dB~0dB, 1.5dB/step |
mic1gain | mic1增益,可設定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般設置0x4,即24dB |
mic2gain | mic2增益,可設定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般設置0x4,即24dB |
mic3gain | mic3增益,可設定范圍0~0x7, 0:0dB, 1~7:15~33dB, 3dB/step,一 般設置0x4,即24dB.如果作為aec回路,則需要設置為0dB |
adcgain | adc增益,可設定范圍0~0x7,表示-4.5~6dB, 1.5dB/step,一般設置 0x3,即0dB |
adcdrc_cfg | 是否使用adcdrc. 0:不適用; 1 :使用 |
adchpf_cfg | 是否使用adchpf. 0:不適用; 1 :使用 |
dacdrc_cfg | 是否使用dacdrc. 0:不適用; 1 :使用 |
dachpf_cfg | 是否使用dachpf. 0:不適用; 1 :使用 |
pa_ctl_level | PA引腳使能方式。0:低電平有效; 1 :高電平有效 |
pa_msleep_time | 操作PA之后的延時時間(用來避免pop音) |
gpio-spk | PA使能引腳 |
說明
如果想要正常加載 audiocodec 聲卡,需要把 codec,platform,machine 驅動都選上,即 codec_used,cpudai_used,sndcodec_used 都置為 1 ;
digital_vol,lineout_vol 等值會在驅動初始化的時候設置,進入系統后還可以通過 amixer 工具對應控件進行再次修改;
注意 gpio-spk 是否配置正確,是否有其他模塊復用了該 gpio;
注意 pa_ctl_level ,實際功放的 PA 引腳是高電平有效,還是低電平有效
2.9.4.3 codec數據通路
播歌 Playback --> DACL --> Left LINEOUT Mux --> LINEOUTL --> External Speaker Playback --> DACR --> Right LINEOUT Mux --> LINEOUTR --> External Speaker 錄音 MIC1 --> MIC1 PGA ---> Left Input Mixer --> ADCL --> Capture MIC2 --> MIC2 PGA ---> Right Input Mixer --> ADCL --> Capture MIC3 --> MIC3 PGA ---> Xadc Input Mixer --> ADCL --> Capture
R328所有控件如下表:
控件名稱 | 功能 | 數值 |
---|---|---|
Lineout Switch | 使能lineout | 0:關閉; 1:開啟 |
ADC gain volume | ADC增益 | 0–7,表示-4.5–6dB,具體計 算請看注釋 1 |
External Speaker Switch | 使能lineout以及PA | 0:關閉; 1:開啟 |
LINEOUT volume | lineout音量設置 | 0–31,表示-43.5–0dB,具體 計算請看注釋 2 |
Left Input Mixer DACL Switch | Left Input Mixer設置,使 能DACL通路 | 0:關閉; 1:開啟 |
Left Input Mixer MIC1 Boost Switch | Left Input Mixer設置,使 能MIC1通路 | 0:關閉; 1:開啟 |
Left Input Mixer MIC2 Boost Switch | Left Input Mixer設置,使 能MIC2通路 | 0:關閉; 1:開啟 |
Left Input Mixer MIC3 Boost Switch | Left Input Mixer設置,使 能MIC3通路 | 0:關閉; 1:開啟 |
Left LINEOUT Mux | Left Lineout Mux設置 | 0:DACL; 1:NULL(空) |
Right LINEOUT Mux | Right Lineout Mux設置 | 0:NULL(空); 1:DACL |
MIC1 gain volume | MIC1 Boost AMP gain | 0–7, 0:0dB, 1~7:15–33dB, 具體計算請看注釋 3 |
MIC2 gain volume | MIC2 Boost AMP gain | 與MIC1 gain volume設置 一樣 |
MIC3 gain volume | MIC3 Boost AMP gain | 與MIC1 gain volume設置 一樣 |
Right Input Mixer DACL Switch | Right Input Mixer設置, 使能DACL通路 | 0:關閉; 1:開啟 |
Right Input Mixer MIC1 Boost Switch | Right Input Mixer設置, 使能MIC1通路 | 0:關閉; 1:開啟 |
Right Input Mixer MIC2 Boost Switch | Right Input Mixer設置, 使能MIC2通路 | 0:關閉; 1:開啟 |
Right Input Mixer MIC3 Boost Switch | Right Input Mixer設置, 使能MIC3通路 | 0:關閉; 1:開啟 |
Xadc Input Mixer DACL Switch | Xadc Input Mixer設置,使 能DACL通路 | 0:關閉; 1:開啟 |
Xadc Input Mixer MIC1 Boost Switch | Xadc Input Mixer設置,使 能MIC1通路 | 0:關閉; 1:開啟 |
Xadc Input Mixer MIC2 Boost Switch | Xadc Input Mixer設置,使 能MIC2通路 | 0:關閉; 1:開啟 |
Xadc Input Mixer MIC3 Boost Switch | Xadc Input Mixer設置,使 能MIC3通路 | 0:關閉; 1:開啟 |
codec hub mode | 使能audiocodec hub功能 | 0:關閉; 1:開啟 |
digital volume | 數字端音量設置 | 0–63,表示-73.08–0dB,具 體計算請看注釋 4 |
? 注釋 1
ADC gain volume計算方法: 應用層可設置范圍:0~ 7 對應實際硬件設置的范圍:-4.5~6dB, step: 1.5dB 換算方法:-4.5+(n*1.5) 舉例,設置0dB: -4.5+(n*1.5) = 0 n = 3 所以應用層上輸入下面命令設置為0dB: amixer -D hw:audiocodec cset name='ADC gain volume' 3
? 注釋 2
LINEOUT volume計算方法: 應用層可設置范圍: 0 ~31 (設置為 0 或者 1 時,就是mute) 對應實際硬件設置的范圍:-43.5~0dB, step:1.5dB 換算方法:-43.5+((n-2)*1.5) 舉例 1 ,設置0dB: -43.5+((n-2)*1.5) = 0 n = 31 所以應用層上輸入下面命令設置為0dB: amixer -D hw:audiocodec cset name='LINEOUT volume' 31 舉例 2 ,設置-6dB: -43.5+((n-2)*1.5) = -6 n = 27 所以應用層上輸入下面命令設置為-6dB: amixer -D hw:audiocodec cset name='LINEOUT volume' 27
? 注釋 3
MIC1 gain volume計算方法: 應用層可設置范圍: 0 ~7 (設置為 0 時,就是0dB) 對應實際硬件設置的范圍:0dB或者15~33dB, step:3dB 換算方法:15+((n-1)*3) 舉例,設置24dB: 15+((n-1)*3) = 24 n = 4 所以應用層上輸入下面命令設置為24dB: amixer -D hw:audiocodec cset name='MIC1 gain volume' 4
? 注釋 4
digital volume計算方法: 應用層可設置范圍: 0 ~ 63 對應實際硬件設置的范圍:-73.08~0dB, step:1.16dB 換算方法:-73.08+(n*1.16) 舉例 1 ,設置0dB: -73.08+(n*1.16) = 0 n = 63 所以應用層上輸入下面命令設置為0dB: amixer -D hw:audiocodec cset name='digital volume' 63 舉例 2 ,設置-5.8dB: -73.08+(n*1.16) = -5.8n = 58 所以應用層上輸入下面命令設置為-5.8dB: amixer -D hw:audiocodec cset name='digital volume' 58
通路設置舉例:
播放通路
通過Speaker播放,差分輸出: amixer -D hw:audiocodec cset name='External Speaker Switch' 1 amixer -D hw:audiocodec cset name='digital volume' 63 amixer -D hw:audiocodec cset name='LINEOUT volume' 25 amixer -D hw:audiocodec cset name='Right LINEOUT Mux' 1
錄音通路
通過模擬MIC1, MIC2錄音: amixer -D hw:audiocodec cset name='Left Input Mixer MIC1 Boost Switch' 1 amixer -D hw:audiocodec cset name='Right Input Mixer MIC2 Boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 gain volume' 4 amixer -D hw:audiocodec cset name='MIC2 gain volume' 4
常用AEC通路
有兩種AEC回路方式,具體看硬件如何設計 1)外部AEC MIC1,MIC2錄音;MIC3作為AEC,外部SPKP/N連接到MIC3. amixer -D hw:audiocodec cset name='Left Input Mixer MIC1 Boost Switch' 1 amixer -D hw:audiocodec cset name='Right Input Mixer MIC2 Boost Switch' 1 amixer -D hw:audiocodec cset name='Xadc Input Mixer MIC3 Boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 gain volume' 4 amixer -D hw:audiocodec cset name='MIC2 gain volume' 4 amixer -D hw:audiocodec cset name='MIC3 gain volume' 0 2)內部AEC(可省去外部AEC電路) MIC1,MIC2錄音;MIC3作為AEC,使能內部DACL到MIC3的通路. amixer -D hw:audiocodec cset name='Left Input Mixer MIC1 Boost Switch' 1 amixer -D hw:audiocodec cset name='Right Input Mixer MIC2 Boost Switch' 1 amixer -D hw:audiocodec cset name='Xadc Input Mixer DACL Switch' 1 amixer -D hw:audiocodec cset name='MIC1 gain volume' 4 amixer -D hw:audiocodec cset name='MIC2 gain volume' 4
2.14.5 Daudio
硬件特性
? 三路I2S/PCM,可用于藍牙通話,語音采集,數字功放;
? 支持主從模式
支持Left-justified,Right-justified,Standar mode I2S,PCM mode
支持i2s,pcm協議格式配置
支持mono和stereo模式,最高支持 8 通道
支持同時playback和record(全雙工模式)
支持8~192KHz采樣率
支持16,24,32bit采樣精度
支持 3 路MCLK輸出
2.14.5.1內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Digital Audio Support
2.14.5.2 sys_config配置
[snddaudio0] snddaudio0_used = 0 daudio_master = 4 audio_format = 1 signal_inversion = 1 [daudio0] daudio0_used = 0 slot_width_select = 32 pcm_lrck_period = 128 msb_lsb_first = 0 sign_extend = 0 frametype = 0 mclk_div = 1 tdm_config = 1 tx_data_mode = 0 rx_data_mode = 0
snddaudio0配置,即daudio0 machine驅動的相關配置
snddaudio配置 | snddaudio配置說明 |
---|---|
snddaudio0_used | 是否使用snddaudio驅動。 0 :不使用; 1 :使用 |
daudio_master | 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master),即daudio接口作為slave, codec作為master 2: SND_SOC_DAIFMT_CBS_CFM(codec clk slave & FRM master),一般不用 3: SND_SOC_DAIFMT_CBM_CFS(codec clk master & frame slave),一般不用 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave),即daudio接口作為master, codec作為slave |
audio_format | 1: SND_SOC_DAIFMT_I2S(standard i2s format) 2: SND_SOC_DAIFMT_RIGHT_J(right justfied format) 3: SND_SOC_DAIFMT_LEFT_J(left justfied format) 4: SND_SOC_DAIFMT_DSP_A(pcm. MSB is available on 2nd BCLK rising edge after LRC rising edge) 5: SND_SOC_DAIFMT_DSP_B(pcm. MSB is available on 1nd BCLK rising edge after LRC rising edge) |
signal_inversion | 1: SND_SOC_DAIFMT_NB_NF(normal bit clock + frame) 2: SND_SOC_DAIFMT_NB_IF(normal BCLK + inv FRM) 3: SND_SOC_DAIFMT_IB_NF(invert BCLK + nor FRM) 4: SND_SOC_DAIFMT_IB_IF(invert BCLK + FRM) |
daudio0配置,即daudio0 platform驅動的相關配置
daudio配置 | daudio配置說明 |
---|---|
daudio0_used | 是否使用daudio驅動。 0 :不使用; 1 :使用 |
slot_width_select | 支持8bit, 16bit, 32bit寬度 |
pcm_lrck_period | 一般可配置16/32/64/128/256個bclk |
msb_lsb_first | 0: msb first; 1: lsb first |
sign_extend | 0: zero pending; 1: sign extend |
frametype | 0: short frame = 1 clock width; 1: long frame = 2 clock width |
mclk_div | 0: not output(normal setting this); 1/2/4/6/8/12/16/24/32/48/64/96/128/176/192:給外部 codec提供時鐘,頻率是pll_audio/mclk_div |
tdm_config | 0: pcm mode; 1: i2s mode |
tx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
rx_data_mode | 0: 16bit linear PCM;1: reserved;2: 8bit u-law;3: 8bit a-law |
注意事項:
daudio machine驅動的配置(snddaudio),一般來說還需要配置codec name以及codec dai name
例如daudio0使用了AC108作為外掛codec:
- [snddaudio0] snddaudio0_used = 1 sunxi,snddaudio-codec = "ac108.1-003b"; sunxi,snddaudio-codec-dai = "ac108-pcm0"; daudio_master = 4 audio_format = 1 signal_inversion = 2 [daudio0] daudio0_used = 1 slot_width_select = 32 pcm_lrck_period = 128 msb_lsb_first = 0 sign_extend = 0 frametype = 0 mclk_div = 1 tdm_config = 1 tx_data_mode = 0 rx_data_mode = 0 注意名稱需要與codec驅動中配置的名稱一致,如ac108驅動,路徑: linux-4.9/sound/soc/codecs/ac108.c 代碼中snd_soc_register_codec注冊codec驅動,其中codec device name為ac108.1-003b, codec dai name為ac108-pcm0
例如daudio2與bluetooth模組相連(沒有實際的codec驅動),那么這時候codec
name, codec dai name需要配置為dummy codec,可以如下配置: [snddaudio2] snddaudio2_used = 1 sunxi,snddaudio-codec = "snd-soc-dummy" sunxi,snddaudio-codec-dai = "snd-soc-dummy-dai" daudio_master = 1 audio_format = 5 signal_inversion = 2 因為驅動中解析snddaudio-codec等字段時,判斷出錯的時候則使用默認codec"snd-soc-dummy", 所以如果sunxi,snddaudio-codec和sunxi,snddaudio-codec-dai不配置,或者配置為空的時候, 則默認使用dummy codec: [snddaudio2] snddaudio2_used = 1 daudio_master = 1 audio_format = 5 signal_inversion = 2 或者 [snddaudio2] snddaudio2_used = 1 sunxi,snddaudio-codec = sunxi,snddaudio-codec-dai = daudio_master = 1 audio_format = 5 signal_inversion = 2
2.14.6 Dmic
硬件特性
? 支持 8 路輸入
支持8~48KHz采樣率
支持16/24bit采樣精度
2.14.6.1內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner DMIC Support
2.14.6.2 sys_config配置
配置如下:
[dmic] dmic_used = 0 [snddmic] snddmic_used = 0
dmic配置,即platform驅動的相關配置
dmic配置 dmic配置說明 dmic_used 是否使用dmic驅動。 0 :不使用; 1 :使用
snddmic配置,即machine驅動的相關配置
snddmic配置 snddmic配置說明 snddmic_used 是否使用snddmic驅動。 0 :不使用; 1 :使用
sys_config中不需要配置codec驅動相關信息
因為machine驅動代碼中默認配置了”dmic-codec”作為codec驅動,代碼路徑:
linux-4.9/sound/soc/codecs/dmic.c
2.14.7 SPDIF
硬件特性
? 支持S/PDIF_OUT和S/PDIF_IN
支持mono和stereo模式(mono模式下由硬件自動拓展為stereo)
輸出支持22.05kHz, 24kHz, 32kHz, 44.1kHz, 48kHz, 88.2kHz, 96kHz, 176.4kHz, 192kHz采樣率
輸入支持44.1KHz,48KHz采樣率
輸出和輸入支持16bit,24bit采樣精度
2.14.7.1內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner SPDIF Support
2.14.7.2 sys_config配置
[sndspdif] sndspdif_used = 0 [spdif] spdif_used = 0
spdif配置,即platform驅動的相關配置
spdif配置 spdif配置說明| spdif_used 是否使用spdif驅動。 0 :不使用; 1 :使用|
sndspdif配置,即machine驅動的相關配置
sndspdif配置sndspdif配置說明
sndspdif_used是否使用sndspdif驅動。 0 :不使用; 1 :使用
sys_config中不需要配置codec驅動相關信息
因為machine驅動代碼中默認配置了”spdif-utils”作為codec驅動,代碼路徑:
linux-4.9/sound/soc/sunxi/spdif-utils.c
2.14.8 MAD
硬件特性
支持三路I2S,一路DMIC PCM音頻傳輸接口,時分復用,固定16bit
支持16KHz,48KHz采樣率
支持基于能量識別的語音檢測模塊LPSD
支持一塊128KB的SRAM,可用于保存音頻數據
2.14.8.1內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> <*> Allwinner Mad Support
2.14.8.2 sys_config配置
[mad] mad_used = 1 lpsd_clk_src_cfg = 0 standby_sram_io_type = 1
mad配置 | mad配置說明 |
---|---|
mad_used | 是否使用mad驅動。 0 :不使用; 1 :使用 |
2.14.8.3 mixer控件說明
mad綁定到I2S
控件名稱 | 功能 | 數值 |
---|---|---|
daudio bind mad Function | 是否綁定MAD功能 | 0:不綁定; 1:綁定 |
lpsd channel sel Function | 選擇作為能量喚醒的通道 | 0:通道0; 1:通道1; |
如此類推,最高可指定通道7 | ||
mad_standby channel sel Function | 設定休眠時mad錄音通 道數 | 0:表示使用實際錄音通道數; |
mad綁定到dmic
控件名稱 | 功能 | 數值 |
---|---|---|
dmic bind mad Function | 是否綁定MAD功能 | 0:不綁定; 1:綁定 |
lpsd channel sel Function | 選擇作為能量喚醒的通道 | 0:通道0; 1:通道1; |
如此類推,最高可指定通道 7 | ||
mad_standby channel sel Function | 設定休眠時mad錄音通道數 | 0:表示使用實際錄音通道數; 1:表示只錄制兩通道 2:表示只錄制四通道 |
2.14.8.4使用說明
固件上的配置,只要修改sys_config以及內核配置即可。
應用上需要使能MAD相關的mixer control。
I2S設置舉例,例如使用的是AC108:
mad使能,綁定mad到daudio中 amixer -Dhw:sndac1081003b cset name='daudio bind mad Function' 1 設置通道 0 作為喚醒通道 amixer -Dhw:sndac1081003b cset name='lpsd channel sel Function' 0 設定mad standby時,錄音的通道數 amixer -Dhw:sndac1081003b cset name='mad_standby channel sel Function' 2
DMIC設置舉例:
amixer -Dhw:snddmic cset name='dmic bind mad Function' 1 amixer -Dhw:snddmic cset name='lpsd channel sel Function' 0 amixer -Dhw:snddmic cset name='mad_standby channel sel Function' 0
然后應用正常進行錄音即可,如果需要進入休眠,有下面幾點必須實現的:
暫定錄音、播放。snd_pcm_pause將playback,capture均暫停;
設置wakeup_count。更新當前喚醒次數;
進入休眠。寫mem到/sys/power/state即可;
Tina SDK中有一個能量喚醒demo可供參考。
make menuconfig選中mad-demo軟件包
Allwinner ---> <*> mad-demo
執行mad-ac108-demo,默認配置(腳本/usr/bin/mad-ac108-demo上設定了默認配置):
? 使用通道 0 作為喚醒通道;
錄制 4 通道,16bit, 16K;
每次錄音5s后進入休眠,可通過語音能量喚醒;
執行mad-dmic-demo,默認配置(腳本/usr/bin/mad-dmic-demo上設定了默認配置):
? 使用通道 0 作為喚醒通道;
錄制 4 通道,16bit, 16K;
每次錄音5s后進入休眠,可通過語音能量喚醒;
如果想查看錄音數據,可以增加 dump 參數, 例如mad-dmic-demo dump, 錄音文件保存 在/mnt/UDISK/目錄下。
2.14.8.5能量喚醒閾值參數
能量喚醒模塊lpsd,識別能量主要有兩個方向,瞬時能量和累計能量(前者比如是關門聲,后者 比如是不斷說話)能量檢測參數配置均在/sys/module/sunxi_mad/parameters/目錄下
lpsd_rrun和lpsd_rstop的推薦值:
lpsd_rrun | lpsd_rstop |
---|---|
77 | 88 |
77 | 108 |
77 | 128 |
77 | 148 |
瞬時能量檢測參數,主要是lpsd_rrun和lpsd_rstop。
一般我們只對stop值進行修改;
如果錄音數據經常缺少喚醒詞的第一個字,則可以嘗試降低stop值,可以有效提高喚醒詞數據 的完整性。但同時會提高誤喚醒率,環境噪音也會很容易觸發能量檢測,喚醒系統;
如果想要降低誤喚醒率(環境噪音造成喚醒),則可以嘗試提高stop值。同樣的,這會導致一些 喚醒詞錄音數據不完整,例如一些音量較低,音調較低的語料;
喚醒詞識別率以及誤喚醒率無法同時兼得,客戶需要根據實際需求、場景,權衡配置參數;
累積能量檢測參數,主要是lpsd_th。
? 我們建議使用默認值 1200 。建議修改范圍50~1200;
2.14.8.6注意事項
MAD綁定動作,需要在應用打開聲卡前就設置好;
應用操作上的一些要求,具體請查看《MAD使用說明》章節;
如果讀取wakeup_count時一直阻塞,說明當前仍有wake_lock處于激活狀態,例如usb 線連接著PC,usb驅動會保持一個wake_lock,不讓系統進入休眠,所以需要拔掉usb或 者連接到usb適配器上,或者改動代碼,去掉usb驅動中wake_lock的使用;
2.14.9 VAD.
VAD是基于MAD實現的,可以通過內部AudioCodec的ADC采集音頻數據,并作能量喚醒。 由于硬件上MAD功能只能用于I2S或者DMIC,內部codec無法直接關聯到MAD,因此通 過I2S作為音頻數據的橋梁,實現了VAD功能,使得模擬MIC也可以利用MAD功能作能量喚 醒。
VAD完整的數據通路:
ADC RxFiFo ---> I2S TxFiFo ---> I2S RxFiFo ---> MAD SRAM ---> MEM
2.14.9.1內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support ---> [*] Allwinner I2S PCM DMA MAP Support <*> Allwinner Mad Support <*> Allwinner Sun8iw18 Codec Support <*> Allwinner Digital Audio Support
2.14.9.2 sys_config配置
需要使能MAD配置:
[mad] mad_used = 1 lpsd_clk_src_cfg = 0 standby_sram_io_type = 1
mad配置 | mad配置說明 |
---|---|
mad_used | 是否使用mad驅動。 0 :不使用; 1 :使用 |
2.14.9.3 mixer控件說明
控件名稱 | 功能 | 數值 |
---|---|---|
codec I2S Port | 指定VAD使用的I2S | 0:不適用; 1:使用I2S0; 2:使用I2S1; 3:使用I2S2 |
sndcodec bind mad Function | 是否綁定MAD功能 | 0:不綁定; 1:綁定 |
lpsd channel sel Function | 選擇作為能量喚醒的通道 | 0:通道0; 1:通道1; |
如此類推,最高可指定 通道 7 | ||
mad_standby channel sel Function | 設定休眠時mad錄音通道數 | 0:表示使用實際錄音通 道數; 1:表示只錄制兩 通道2:表示只錄制四通道 |
注意:
對于控件“codec I2S Port”,需要指定實際沒有使用(sys_config沒有使能的)的一路I2S。設置舉例:
實際沒有使用I2S0(sys_config中snddaudio0,audio0均沒有配置),那么這里可以設置為1,表示VAD使用I2S0;
實際沒有使用I2S1(sys_config中snddaudio1,audio1均沒有配置),那么這里可以設置為2,表示VAD使用I2S1;
設置舉例:
amixer -Dhw:audiocodec cset name='codec I2S Port' 2 amixer -Dhw:audiocodec cset name='sndcodec bind mad Function' 1 amixer -Dhw:audiocodec cset name='lpsd channel sel Function' 0 amixer -Dhw:audiocodec cset name='mad_standby channel sel Function' 0
2.14.9.4使用說明
VAD的使用與MAD類似。
固件上的配置,只要修改sys_config以及內核配置即可。
應用上除了打開內部audiocodec的錄音通路之外,還需要下面一些配置:
vad需要使用一路i2s,這里指定使用i2s1 amixer -Dhw:audiocodec cset name='codec I2S Port' 2 使能mad,綁定mad到audiocodec中 amixer -Dhw:audiocodec cset name='sndcodec bind mad Function' 1 設置通道 0 作為喚醒通道 amixer -Dhw:audiocodec cset name='lpsd channel sel Function' 0
然后應用正常進行錄音即可,如果需要進入休眠,有下面幾點必須實現的:
暫定錄音、播放。snd_pcm_pause將playback,capture均暫停
設置wakeup_count。更新當前喚醒次數
進入休眠。寫mem到/sys/power/state即可
Tina SDK中有一個能量喚醒demo可供參考make menuconfig選中mad-demo軟件包
Allwinner ---> <*> mad-demo
執行vad-demo,默認配置(腳本/usr/bin/vad-demo上設定了默認配置):
? 使用I2S1
錄制 2 通道,16bit, 16K
每次錄音5s后進入休眠,可通過語音能量喚醒
如果想查看錄音數據,可以執行vad-demo dump,錄音文件保存在/mnt/UDISK/vad-test.wav能量喚醒閾值的調整,可以參考《能量喚醒閾值參數》
2.14.9.5注意事項
VAD同樣需要注意MAD注意事項章節中提到的幾點。
另外需要注意,VAD隱式使用了一路I2S,所以硬件上需要保留一路I2S,并且sys_config中不能使能該I2S配置
2.14.10標案音頻測試方法.
該章節主要介紹在標案上進行播歌,錄音的測試命令
2.14.10.1播放
通過Speaker播放 amixer -D hw:audiocodec cset name='External Speaker Switch' 1 amixer -D hw:audiocodec cset name='Right LINEOUT Mux' 1 aplay -Dhw:audiocodec /mnt/UDISK/1KHz_0dB_16000.wav
2.14.10.2錄音
通過MIC1,MIC2錄制兩通道 amixer -D hw:audiocodec cset name='Left Input Mixer MIC1 Boost Switch' 1 amixer -D hw:audiocodec cset name='Right Input Mixer MIC2 Boost Switch' 1 amixer -D hw:audiocodec cset name='MIC1 boost volume' 4 amixer -D hw:audiocodec cset name='MIC2 boost volume' 4 arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 /tmp/test.wav
####
2.20 V853音頻接口
V853包含多個音頻模塊,分別是內置AudioCodec,I2S0,I2S1,DMIC。
2.20.1 時鐘源.
V853中,音頻模塊的時鐘源來自pll_audio0。
pll_audio0可輸出22.5792M和24.576M頻率的時鐘,分別支持44.1k系列、48k系列的播放錄音,但無法同時輸出。
2.20.2 代碼結構
linux-4.9/sound/soc/sunxi_v2/ ├── snd_sun8iw21_codec.c // codec驅動 ├── snd_sun8iw21_codec.h ├── snd_sunxi_aaudio.c ├── snd_sunxi_common.c ├── snd_sunxi_common.h ├── snd_sunxi_daudio.c //daudio platform驅動 ├── snd_sunxi_daudio.h ├── snd_sunxi_dmic.c // dmic platform驅動 ├── snd_sunxi_dmic.h ├── snd_sunxi_log.h ├── snd_sunxi_mach.c ├── snd_sunxi_mach.h ├── snd_sunxi_mach_utils.c ├── snd_sunxi_mach_utils.h ├── snd_sunxi_pcm.c ├── snd_sunxi_pcm.h ├── snd_sunxi_rxsync.c ├── snd_sunxi_rxsync.h ├── snd_sunxi_txhub.c └── snd_sunxi_txhub.h
2.20.3 AudioCodec
2.20.3.1硬件特性
? 一路DAC
支持16bit,20bit有效采樣精度
支持8KHz~192KHz采樣率
兩路ADC
支持16bit,20bit有效采樣精度
支持8KHz~48KHz采樣率
一路模擬輸出:
一路立體聲輸出LINEOUT,支持single/differ
兩路模擬輸入:MIC1,MIC2
MIC支持single/differ,
支持同時playback和record(全雙工模式)
DAC及ADC均支持DRC
支持mono模式,最高支持 2 通道
2.20.3.2內核配置
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> <*> ALSA for SoC audio support ---> Allwinner SoC Audio support V2 ---> <*> Allwinner AAUDIO support <*> Allwinner DAUDIO Support <*> Allwinner Function Components <*> Components Rx Sync
2.20.3.3 DTS配置.
2.20.3.3.1 DeviceTree 配置說明 設備樹為芯片平臺的模塊配置,面對芯片特性進行配 置,設備樹文件的路徑為:lichee/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi
codec:codec@0x02030000 { #sound-dai-cells = <0>; compatible = "allwinner,sunxi-snd-codec"; reg = <0x0 0x02030000 0x0 0x34C>; clocks = <&clk_pll_audio>,<&clk_codec_dac>, <&clk_codec_adc>; status = "disabled"; }; codec_plat:codec_plat { #sound-dai-cells = <0>; compatible = "allwinner,sunxi-snd-aaudio"; playback_cma = <128>; capture_cma = <128>; tx_fifo_size = <128>; rx_fifo_size = <128>; dac_txdata = <0x02030020>; adc_txdata = <0x02030040>; status = "disabled"; }; codec_mach:codec_mach { compatible = "allwinner,sunxi-snd-mach"; soundcard-mach,name = "audiocodec"; soundcard-mach,pin-switches = "MIC1", "MIC2", "LINEIN", "LINEOUT", "SPK"; soundcard-mach,routing = "MIC1_PIN", "MIC1", "MIC2_PIN", "MIC2", "LINEINL_PIN", "LINEIN", "LINEINR_PIN", "LINEIN", "LINEOUT", "LINEOUTL_PIN", "SPK", "LINEOUTL_PIN"; status = "disabled"; soundcard-mach,cpu { /* pll freq = 24.576M or 22.5792M * pll-fs */ soundcard-mach,pll-fs = <1>; sound-dai = <&codec_plat>; }; soundcard-mach,codec { sound-dai = <&codec>; }; };
配置項說明(僅對常用項進行展開):
AudioCodec模塊由 3 個設備樹節點構建。
ASoC層codec: codec
?
表2-128: AudioCodec codec節點配置項(linux4.9)
?
配置項名稱 | 配置項說明 |
---|---|
#sound-dai-cells | machine層檢測codec和platform節點的標志 |
reg | 設置audiocodec寄存器起始地址和地址長度 |
clocks | 設置audiocodec所需的時鐘源和模塊時鐘 |
ASoC層platform: codec_plat
?
表2-129: AudioCodec codec_plat節點配置項(linux4.9)
?
配置項名稱 | 配置項說明 |
---|---|
#sound-dai-cells | machine層檢測codec和platform節點的標志 |
playback_cma | 設置播放流DMA申請的size大小,必須為(2?n)Kbyte,默認 128 |
capture_cma | 設置錄音流DMA申請的size大小,必須為(2?n)Kbyte,默認 128 |
tx_fifo_size | 設置播放流snd_pcm_runtime的fifo_size大小,用于聲卡硬件參數 限定,默認 128 |
rx_fifo_size | 設置錄音流snd_pcm_runtime的fifo_size大小,用于聲卡硬件參數 限定,默認 128 |
dac_txdata | 設置播放流DMA搬運地址(audiocodec模塊的tx_fifo寄存器地址) |
adc_txdata | 設置錄音流DMA搬運地址(audiocodec模塊的rx_fifo寄存器地址) |
ASoC層machine: codec_mach
?
表2-130: AudioCodec codec_mach節點配置項(linux4.9)
?
配置項名稱 | 配置項說明 |
---|---|
soundcard- mach | machine層配置前綴 |
name | 聲卡名字 |
pin-switches | 用于定義模塊接口開關(需參考驅動代碼dapm進行設定) |
routing | 用于定義模塊接口開關所鏈接的dapm通路(需參考驅動代碼dapm進 行設定) |
cpu | machine層所綁定的cpu節點(即platform層),用sound-dai屬 性指定節點 |
codec | machine層所綁定的codec節點(即codec層),用sound-dai屬 性指定節點 |
pll-fs | 指定模塊時鐘源頻率(24.576M or 22.5792M * pll-fs) |
2.20.3.3.2 board.dts板級配置說明
board.dts用于保存板級平臺設備差異化的信息的補充,面對 板型特性 進行配置,其配置信息會覆蓋device tree默認配置信息,board.dts文件的路徑為:/device/config/chips/v853/configs/{BOARD}/board.dts
&codec { /* external-avcc; */ /* avcc-supply = ; */ 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軟件包。
它會生成/etc/asound.conf文件,下面作簡單介紹:
設定amixer操作的defautl聲卡(執行snd_hctl_open會獲取該配置) ctl.!default { type hw card audiocodec } 設定default聲卡(執行snd_pcm_open會獲取該配置) pcm.!default { type asym playback.pcm "PlaybackDmix" capture.pcm "CaptureDsnoop" } 使用dmix插件,可以混合播歌,即支持多次打開聲卡進行播歌 pcm.PlaybackDmix { type plug slave.pcm { type dmix ipc_key 1111 ipc_perm 0666 slave { pcm "hw:audiocodec" rate 48000 channels 2 } } } 使用dsnoop插件,可以混合錄音,即支持多次打開聲卡進行錄音 pcm.CaptureDsnoop { type plug slave.pcm { type dsnoop ipc_key 1111 ipc_perm 0666 slave { pcm "hw:audiocodec,0" rate 48000 channels 2 } } } 使用dmix插件以及softvol插件,softvol插件可以增加一個control,用于控制音量(軟件上作調節) pcm.PlaybackDmix { type plug slave.pcm { type softvol slave.pcm { type dmix ipc_key 1111 ipc_perm 0666 slave { pcm "hw:audiocodec,0" rate 48000 channels 1 } } control { name "Soft Volume Master" card audiocodec } min_dB -51.0 max_dB 0.0 resolution 256 } }
3.2 3.2 tinyalsa-utils.
tinyalsa是alsa-lib的一個簡化版。它提供了pcm和control的基本接口;沒有太多太復雜的 操作、功能。可以按需使用接口。tinyalsa-utils是基于tinyalsa的一些工具,下面對幾個常用 的工具作介紹。
3.2.1 3.2.1 tinymix
與amixer作用類似,用于操作mixer control。
? 常用選項
選項 | 功能 |
---|---|
-D,–card | 指定聲卡設備,默認使用card0 |
? 常用命令
命令 | 功能 |
---|---|
controls | 列出指定聲卡的所有控件 |
contents | 列出指定聲卡的所有控件的具體信息 |
get | 獲取指定控件的信息 |
set | 設定指定控件的值 |
舉例:
獲取card0的所有控件名 tinymix -D 0 controls 獲取card0當前硬件音量 tinymix -D 0 get 'LINEOUT volume' 設置card0當前硬件音量 tinymix -D 0 set 'LINEOUT volume' 25
3.2.2 3.2.2 tinyplay
與aplay作用類似,用于操作聲卡設備進行播放
? 常用選項
選項 | 功能 |
---|---|
-D,–card | 指定聲卡設備,默認使用card0 |
-p,–period-size | 指定period大小,單位為幀 |
-c,–channels | 指定通道數 |
-r,–rate | 指定采樣率 |
-b,–bits | 指定采樣精度 |
如果播放的是wav文件,可以解析頭部,識別通道數,采樣率等參數
舉例:
tinyplay -D 0 /tmp/16000-stere-10s.wav
3.2.3 3.2.3 tinycap
與arecord作用類似,用于操作聲卡進行錄音功能
? 常用選項
選項 | 功能 |
---|---|
-D,–device | 指定聲卡設備,默認使用card0 |
-p,–period-size | 指定period大小,單位為幀 |
-c,–channels | 指定通道數 |
-r,–rate | 指定采樣率 |
-b,–bits | 指定采樣精度 |
舉例:
錄制通道數為2,采樣率為16000,采樣精度為16bit,保存為wav文件 tinycap -D 0 -b 16 -r 16000 -c 2 /mnt/UDISK/test.wav
3.3 3.3 dump寄存器
我們sunxi平臺均提供了sunxi_dump驅動,用于查看讀寫寄存器。
節點位于/sys/class/sunxi_dump目錄。
但是audiocodec模擬寄存器的操作會有些特殊,我們一般在audio驅動中都會增加相關調試節 點,去操作自己模塊的寄存器,以便調試。
3.3.1 3.3.1 dump audiocodec寄存器
audiocodec驅動的寄存器調試節點位于:
/sys/devices/platform/soc/codec/audio_reg_debug/audio_reg
使用方法:
通過echo寫入下列參數
參數1: 0-read; 1-write
參數2: 1-digitar reg; 2-analog reg
參數3: reg value
參數4: write value
舉例:
查看所有寄存器狀態:
cat /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 打印如下(其中地址為0x300以上的寄存器為模擬寄存器,其他均為數字寄存器): dump audio reg: SUNXI_DAC_DPC [0x000]: 0x0 Save:0x0 SUNXI_DAC_FIFO_CTL [0x010]: 0x3004000 Save:0x0 SUNXI_DAC_FIFO_STA [0x014]: 0x80800c Save:0x0 SUNXI_DAC_CNT [0x024]: 0xb4014 Save:0x0 SUNXI_DAC_DG [0x028]: 0x0 Save:0x0 SUNXI_ADC_FIFO_CTL [0x030]: 0xe000400 Save:0x0 SUNXI_ADC_FIFO_STA [0x038]: 0x0 Save:0x0 SUNXI_ADC_CNT [0x044]: 0x0 Save:0x0 SUNXI_ADC_DG [0x04c]: 0x0 Save:0x0 SUNXI_DAC_DAP_CTL [0x0f0]: 0x0 Save:0x0 SUNXI_ADC_DAP_CTL [0x0f8]: 0x0 Save:0x0 SUNXI_HP_CTL [0x300]: 0x0 Save:0x0 SUNXI_MIX_DAC_CTL [0x303]: 0x0 Save:0x0 SUNXI_LINEOUT_CTL0 [0x305]: 0x10 Save:0x0 SUNXI_LINEOUT_CTL1 [0x306]: 0x19 Save:0x0 SUNXI_MIC1_CTL [0x307]: 0x34 Save:0x0 SUNXI_MIC2_MIC3_CTL [0x308]: 0x4 Save:0x0 SUNXI_LADCMIX_SRC [0x309]: 0x4 Save:0x0 SUNXI_RADCMIX_SRC [0x30a]: 0x8 Save:0x0 SUNXI_XADCMIX_SRC [0x30b]: 0x10 Save:0x0SUNXI_ADC_CTL [0x30d]: 0x3 Save:0x0 SUNXI_MBIAS_CTL [0x30e]: 0x21 Save:0x0 SUNXI_APT_REG [0x30f]: 0xd6 Save:0x0 SUNXI_OP_BIAS_CTL0 [0x310]: 0x55 Save:0x0 SUNXI_OP_BIAS_CTL1 [0x311]: 0x55 Save:0x0 SUNXI_ZC_VOL_CTL [0x312]: 0x2 Save:0x0 SUNXI_BIAS_CAL_CTRL [0x315]: 0x0 Save:0x0
查看某個數字寄存器狀態:
echo 0,1,0x10 > /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 打印如下: [ 127.036609] sunxi-internal-codec codec: ret:3, reg_group:1, reg_offset:16, reg_val:0x0 [ 127.045557] sunxi-internal-codec codec: [ 127.045557] [ 127.045557] Reg[0x10] : 0x03004000 [ 127.045557] 表示0x10數字寄存器的值為0x03004000
查看某個模擬寄存器狀態:
echo 0,2,0x5 > /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 打印如下: [ 306.126103] sunxi-internal-codec codec: ret:3, reg_group:2, reg_offset:5, reg_val:0x0 [ 306.134971] sunxi-internal-codec codec: [ 306.134971] [ 306.134971] Reg[0x05] : 0x10 [ 306.134971] 表示0x05模擬寄存器的值為0x10
改寫某個數字寄存器:
echo 1,1,0x24,0 > /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 表示將0x24數字寄存器寫為0x0
改寫某個模擬寄存器:
echo 1,2,0x3,0x1 > /sys/devices/platform/soc/codec/audio_reg_debug/audio_reg 表示將0x03模擬寄存器寫為0x1
3.3.2 3.3.2 dump daudio寄存器
查看spec可以知道i2s模塊的寄存器基地址
i2s0: 0x05090000 i2s1: 0x05091000 i2s2: 0x05092000
可以通過sunxi_dump節點查詢寄存器狀態,例如查看i2s0的寄存器:
cd /sys/class/sunxi_dump echo 0x05090000,0x050900a0 > dump cat dump
3.3.3 3.3.3 dump dmic寄存器
查看spec可以知道dmic模塊的寄存器基地址
dmic: 0x05095000
可以通過sunxi_dump節點查詢寄存器狀態:
cd /sys/class/sunxi_dump echo 0x05095000,0x05095050 > dump cat dump
3.3.4 3.3.4 dump spdif寄存器
查看spec可以知道spdif模塊的寄存器基地址
spdif: 0x05093000
可以通過sunxi_dump節點查詢spdif寄存器狀態:
cd /sys/class/sunxi_dump echo 0x05093000,0x05093040 > dump cat dump
3.4 3.4 sound procfs.
通過procfs文件系統下面的聲卡相關節點,可以得到各個聲卡各個音頻流的狀態。實際調試中會 非常有用。
內核需要選中下面選項才能在procfs下生成對應節點:
Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> [*] Sound Proc FS Support [*] Verbose procfs contents
以card0為例看下提供的節點信息:
ddd /proc/asound/card0/ ├── id /*聲卡名稱*/ ├── pcm0c /* pcm0錄音流*/ │ ├── info /* pcm信息*/ │ └── sub0 │ ├── hw_params /*硬件參數信息*/ │ ├── info /* pcm信息*/ │ ├── status /* pcm流運行狀態*/ │ └── sw_params /*軟件參數信息*/ └── pcm0p /* pcm0播放流*/ ├── info └── sub0
其中,hw_params, status都能拿到比較有用的信息:
cat /proc/asound/card0/pcm0c/sub0/hw_params access: RW_INTERLEAVED /*交錯模式排列通道*/ format: S16_LE /*當前音頻流的采樣精度*/ subformat: STD channels: 2 /*通道數*/ rate: 16000 (16000/1) /*采樣率*/ period_size: 320 /*周期(決定dma中斷時間,例如這里period_time=320/16000=20ms) */ buffer_size: 2560 /*內核ALSA框架中環形緩沖區大小,決定能夠緩存多少個period */ cat /proc/asound/card0/pcm0c/sub0/status state: RUNNING /*音頻流運行狀態,RUNNING, SETUP等狀態*/ owner_pid : 22653 trigger_time: 81828.078175765 tstamp : 82373.796969347 /*開始運行后的時間戳信息*/ delay : 256 avail : 256 /*當前可用音頻數據幀數*/ avail_max : 320 ----- hw_ptr : 8731456 /*硬件邏輯指針,單位(幀) */ appl_ptr : 8731200 /*應用邏輯指針,單位(幀) */
從period_size可以知道當前dma中斷頻率,太快會影響系統響應速度,太慢可能就存在一 定延時。
buffer_size可以知道緩存區大小,太小容易因調度不及時出現xrun,太大同樣存在一定延時。
從hw_ptr, appl_ptr可以知道當前錄音/播音的幀數,是否發生過xrun等。
4 4常用接口說明
這里主要介紹alsa-lib中的常用接口
4.1 4.1 control接口
為了方便操作訪問,alsa-lib中封裝了相關接口,通過control節點(/dev/snd/controlCX)去獲 取、設置control elements
主要涉及到的接口:
snd_ctl_open snd_ctl_elem_info_get_id snd_ctl_elem_info_set_id snd_ctl_elem_info snd_ctl_ascii_value_parse snd_ctl_elem_read snd_ctl_elem_write snd_ctl_close
詳細control接口說明請查閱:
https://www.alsa-project.org/alsa-doc/alsa-lib/control.html
https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html
下面是一個設置音量接口的例子:
#include #include #include #include #include #include #include #define DEV_NAME "hw:audiocodec" #define VOLUME_CONTROL "name='LINEOUT volume'" /* Fuction to convert from percentage to volume. val = volume */ static int convert_volume(int percent, long min, long max) { long range = max - min;if (range == 0) return 0; return (int)((range * percent / 100) + min);
}
bool controlVolume(int volume_percent) { int err = -1; snd_ctl_t *handle = NULL; char *card = DEV_NAME; char *volume_control = VOLUME_CONTROL; char volume_string[4]; long min, max, raw; snd_ctl_elem_info_t *info = NULL; snd_ctl_elem_id_t *id = NULL; snd_ctl_elem_value_t control = NULL; if (volume_percent > 100 || volume_percent < 0) return false; snd_ctl_elem_info_alloca(&info); snd_ctl_elem_id_alloca(&id); snd_ctl_elem_value_alloca(&control); err = snd_ctl_ascii_elem_id_parse(id, volume_control); if (err < 0) { fprintf(stderr, "Wrong control identifier: %sn", volume_control); goto failed; } err = snd_ctl_open(&handle, card, 0); if (err < 0) { fprintf(stderr, "Control device %s open error:%sn", card, snd_strerror(err)); goto failed; } snd_ctl_elem_info_set_id(info, id); err = snd_ctl_elem_info(handle, info); if (err < 0) { fprintf(stderr, "Cannot find the given element from control %sn", card); goto failed; } snd_ctl_elem_info_get_id(info, id); snd_ctl_elem_value_set_id(control, id); err = snd_ctl_elem_read(handle, control); if (err < 0) { fprintf(stderr, "Cannot read the given element from control %sn", card); goto failed; } min = snd_ctl_elem_info_get_min(info); max = snd_ctl_elem_info_get_max(info); snprintf(volume_string, sizeof(volume_string), "%d", convert_volume(volume_percent, min , max)); /printf("set volume %s, [%u%%]n", volume_string, volume_percent);*/ err = snd_ctl_ascii_value_parse(handle, control, info, volume_string); if (err < 0) { fprintf(stderr, "Control %s parse error: %sn", card, snd_strerror(err)); goto failed; } err = snd_ctl_elem_write(handle, control);
if (err < 0) { fprintf(stderr, "Control %s write error: %sn", card, snd_strerror(err)); goto failed; } failed: if (info) snd_ctl_elem_info_free(info); if (id) snd_ctl_elem_id_free(id); if (control) snd_ctl_elem_value_free(control); if (handle) snd_ctl_close(handle); return ((err < 0)? false : true); }
4.2 4.2 PCM接口.
為了方便操作訪問,alsa-lib中封裝了相關接口,通過pcmCXDXp/pcmCXDXc節點(/dev/s- nd/pcmCXDXx)去實現播放、錄音功能。
主要涉及到的接口:
snd_pcm_open snd_pcm_info snd_pcm_hw_params_any snd_pcm_hw_params_set_access snd_pcm_hw_params_set_format snd_pcm_hw_params_set_channels snd_pcm_hw_params_set_rate_near snd_pcm_hw_params_set_buffer_size_near snd_pcm_hw_params snd_pcm_sw_params_current snd_pcm_sw_params snd_pcm_readi snd_pcm_writei snd_pcm_close
詳細pcm接口說明請查閱:
https://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html
https://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html
接口使用例子可以參考aplay,arecord的實現,代碼可以在alsa-utils中找到(dl/alsa-utils- 1.1.0.tar.bz2)
5 開機音樂功能
這里開機音樂功能,指的是在uboot階段開始啟動dma將音頻數據搬運到AudioCodec的 FIFO中進行播歌,同時CPU繼續開機流程進入內核。進入系統后,在合適的啟動腳本中加載音 頻驅動模塊(如果builtin,那么音樂會提前中止),這樣開機音樂可以大大的提前,給用戶一種迅 速開機的錯覺。
目前SDK代碼中支持uboot開機音樂功能的平臺有:R6,R7s,R11,R16,R328,R311,MR133
配置使用方法都比較類似,下面以R328為例進行說明。
5.1 配置方法
修改uboot配置文件
可修改默認配置configs/sun8iw18p1_defconfig增加下面幾項 CONFIG_SOUND_SUNXI_SOC_RWFUNC=y CONFIG_SOUND_SUNXI_SUN8IW18_CODEC=y CONFIG_SOUND_SUNXI_BOOT_TONE=y
也可以通過kconfig進行配置lichee/brandy-2.0/u-boot-2018目錄下執行makemenu- config ARCH=arm,選上對應功能項:選中sun8iw18的codec驅動以及開機音樂功能
修改sys_config文件
配置boottone_used為1,表示使用開機音樂功能 ;---------------------------------------------------------------------------------- ;boot tone configuration ; ;boottone_used ---boot tone enable ;len_limit ---set size in bytes, normally do not need to set it and driver will use file size ;---------------------------------------------------------------------------------- [boottone] boottone_used = 1另外codec節點也需要配置正確,下面是部分重要配置 [codec] codec_used = 0x1 lineout_vol =0x1a gpio-spk = port:PH9<1><1><1><1>
創建boottone分區
開機音樂的音頻文件需要放置在單獨一個分區中,例如boottone分區,修改sys_partition.fex 文件: [partition] name = boottone size = 2048 downloadfile = "boottone.fex" user_type = 0x8000上述 2048 表示1M的空間,注意根據實際音頻文件大小填寫合適的size 然后將音頻文件重命名為boottone.fex,并放置到方案配置目錄下,以cowbell-perf1方案 為例: mv kaiji.wav target/allwinner/cowbell-perf1/configs/boottone.fex
修改env配置文件
主要增下面幾行: uboot_tone_addr=0x4327ffd4 boottone_partition=boottone load_boottone=sunxi_flash read ${uboot_tone_addr} ${boottone_partition}uboot_tone_addr用于指定音頻文件加載到dram的地址 boottone_partition用于指定音頻文件所在分區名 load_boottone用于加載音頻文件到dram的命令
將內核AudioCodec驅動編譯成模塊
make kernel_menuconfig去除下面幾個配置: @@ -702,14 +705,9 @@ CONFIG_SND_SOC_I2C_AND_SPI=y # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8985 is not set-CONFIG_SND_SUN8IW18_CODEC=y # CONFIG_SND_SUNXI_MAD is not set -CONFIG_SND_SUNXI_SOC=y -CONFIG_SND_SUNXI_SOC_CPUDAI=y -CONFIG_SND_SUNXI_SOC_DAUDIO=y -CONFIG_SND_SUNXI_SOC_RWFUNC=y -CONFIG_SND_SUNXI_SOC_SUN8IW18_CODEC=y -CONFIG_SND_SUNXI_SOC_SUNXI_DAUDIO=y +# CONFIG_SND_SUNXI_SOC_SUN8IW18_CODEC is not set +# CONFIG_SND_SUNXI_SOC_SUNXI_DAUDIO is not set # CONFIG_SND_SUNXI_SOC_SUNXI_DMIC is not set # CONFIG_SND_SUNXI_SOC_SUNXI_SPDIF is not set CONFIG_SND_SUPPORT_OLD_API=ymake menuconfig增加驅動模塊配置 @@ -2923,7 +2929,7 @@ CONFIG_PACKAGE_kmod-sound-core=y # CONFIG_PACKAGE_kmod-sound-soc-ac97 is not set # CONFIG_PACKAGE_kmod-sound-soc-core is not set # CONFIG_PACKAGE_kmod-sound-via82xx is not set -# CONFIG_PACKAGE_kmod-sunxi-sound is not set +CONFIG_PACKAGE_kmod-sunxi-sound=y
5.2 注意事項
uboot退出時,不能關掉dma。如果發生在跳轉kenrel時聲音變化或消失,請確認跳轉到內 核前是否調用了sunxi_dma_exit();
內核并不知道uboot將音頻加載到dram的位置。理論上,kernel可能會在初始化過程中, 用到那片內存,導致音樂播放不正常。
可以在dts中,將該片內存改為reserve屬性,可以確保kernel不會使用到。
選用kernel初始化不會用到的內存塊
可以在uboot命令行下執行boottone命令進行調試
6 各平臺音頻模塊注意事項
6.1 R328.
只有一個DAC,所以在播放兩通道數據的時候,硬件上會將第二個通道的數據丟掉。如果想
要將兩通道數據都完成播放出來,需要在軟件上將兩通道合成,可利用alsa插件實現,例如下 面配置: pcm.playback { type plug slave { pcm "hw:audiocodec,0" rate 48000 channels 1 } }alsa插件會將兩通道數據的幅度衰減為由原來的一半(如果直接相加,幅度為原來的兩倍,有 可能造成削頂),再組合為一通道寫入聲卡中。
使用模擬mic作AEC時,需要將該MIC gain設置為0dB.如果有增益,則會導致錄音開始及結束時產生pop音(開關PA產生的pop音,經過差分MIC消除后仍然存在極小的雜音,如果再經過MIC增益放大,則會變為明顯的pop音)
審核編輯:湯梓紅
-
音頻
+關注
關注
29文章
2834瀏覽量
81356 -
Linux
+關注
關注
87文章
11229瀏覽量
208931 -
開發指南
+關注
關注
0文章
34瀏覽量
7531 -
音頻模塊
+關注
關注
1文章
144瀏覽量
12308 -
Tina
+關注
關注
2文章
45瀏覽量
16957
發布評論請先 登錄
相關推薦
評論