一、名詞介紹
下面是音頻調試中常見的名詞縮略語。
1、AEC(Acoustic Echo Cancellor):回聲消除。
2、AGC(Automatic Gain Control):自動增益補償,調整MIC收音量。
3、ALSA(Advanced Linux Sound Architecture):高級Linux聲音架構。
4、ANS(Automatic Noise Suppression):背景噪音抑制,ANS可探測出背景固定頻率的雜音并消除背景噪音。
5、BCK(Bit Clock Line):位時鐘,對應數字音頻的每一位數據。標準稱為SCK(Serial Clock),串行時鐘。SCK=2x采樣頻率x采樣位數
6、DAI(Digital Audio Interface):數字音頻接口。
7、DAPM(Dynamic Audio Power Management):動態電源管理,DAPM可使基于linux的移動設備上的音頻子系統,在任何時候都工作在最小功耗狀態。
8、DRC(Dynamic Range Control):動態壓縮,將音頻輸出控制在一定范圍內。
9、EQ(Equaliser):均衡器,通過對聲音某一個或多個頻段進行增益或衰減,達到調整音色的目的。
10、I2S(Inter-IC Sound):IC間傳輸數字音頻資料的一種接口標準,采用序列的方式傳輸2組(左右聲道)資料。
11、LRCK(Left-Right Clock):幀時鐘,用于切換左右聲道數據,0:左聲道;1:右聲道。標準稱為WS(World Select),聲道選擇;或稱為FS(Frame Sync),幀同步;LRCK的頻率=采樣頻率。
12、MCLK(Master Clock):主時鐘,一般MCLK=256*LRCK。不是I2S標準中的一部分,主要用來同步模擬/數字轉換器的內部操作。
13、Mono:單聲道。
14、OSS(Open Sound System):開放聲音系統。
15、PCM(Pulse Code Modulation):脈沖編碼調制,I2S是PCM的子集。
16、ramp:逐步增加或減少音量等級,避免聲音急速變化,用于暫停或恢復音樂。
17、Stereo:雙聲道
18、TDM(Time Division Multiplexing):時分復用。I2S最多只能傳2聲道數據,TDM最多支持16通道。
二、I2S接口
I2S是飛利浦定義的數字音頻傳輸標準,用于數字音頻數據在系統內部器件之間傳輸。
I2S是PCM的一個分支,接口定義相同。I2S的采樣率一般為44.1/48KHZ,PCM采樣頻率一般為8/16KHZ等。
I2S接口有4組信號:SCK(位時鐘)、LRCK(幀時鐘)、SDI/SDO(數據)。
在I2S總線上,只能同時存在一個主設備和發送設備,主設備可以是發送設備或接收設備。常見的I2S框圖如下:
三、I2S協議
I2S接口常見的協議模式包括:I2S正常模式、I2S左對齊模式和I2S右對齊模式等。
1、I2S正常模式
I2S正常模式屬于I2S左對齊中的一種特例,也叫Philips模式。下圖是I2S正常模式的波形。
LRCK(i2s_LRCK_rx/i2s_LRCK_tx)信號變低表示左聲道,變高表示右聲道。
SD(i2s_sdo,i2s_sdi)信號首先傳輸MSB或LSB,并在LRCK改變后的一個SCLK時鐘周期發送第一個bit。
SD信號寬度的范圍是從16到32位。
2、I2S左對齊模式
下圖是I2S左對齊模式的波形。
LRCK(i2s_LRCK_rx/i2s_LRCK_tx)信號變高表示左聲道,變低表示右聲道。
SD(i2s_sdo,i2s_sdi)信號首先傳輸MSB或LSB,并在LRCK改變的同時發送第一個bit。
SD信號寬度的范圍是從16到32位。
3、I2S右對齊模式
下圖是I2S右對齊模式的波形。
LRCK(i2s_LRCK_rx/i2s_LRCK_tx)信號變高表示左通道,變低表示右通道。
SD(i2s_sdo、i2s_sdi)信號首先傳輸MSB或LSB,與I2S正常或左對齊模式不同,其數據與LRCK信號的邊緣處的最后一位對齊。
SD信號寬度范圍從16到32位。
其他協議格式還有:PCM early mode、PCM late1 mode和PCM late2 mode等。
四、ALSA框架
Linux內核2.6之后,ALSA取代了OSS成為了Linux內核音頻子系統是一部分。
ALSA系統包括:
1、alsa-driver:alsa系統驅動。
2、alsa-lib:alsa庫,用戶空間調用,和內核空間交互。
3、alsa-utils:命令行工具。
4、alsa-plugin:alsa插件。
5、alsa-tools:alsa工具。
ALSA框架組成如下:
alsa-driver中相關功能如下(以rockchip 4a單板為例):
1、Codec:音頻芯片共有的部分,包括codec初始化函數,控制接口,寄存器緩存,控件,dapm部件,音頻路由,偏置電壓設置函數等描述信息。
Rockchip 4A單板,Codec選用的是ES8316芯片,該芯片的dts配置如下:
2、Codec DAI:codec上的音頻接口驅動描述,包括:時鐘配置,格式配置,能力描述等。
Codec DAI相關實現如下:
3、CPU DAI:指 SoC 的 I2S、PCM 總線控制器,負責把音頻數據從 I2S tx FIFO 搬運到 codec。
RK3399 CPU DAI的dts相關配置如下:
4、DAI Link:音頻數據鏈路,它指定鏈路用到的codec、codec_dai、cpu_dai和platform。
Linux 4.4 內核支持兩種方式創建聲卡:一種是通用的simple-card framework;一種是傳統的編寫自定義的 machine driver 來創建。
Simple card是簡單通用的machine driver,如果 simple-card框架足夠滿足需求,可優先選擇simple card 框架。
DAI Link的dts相關配置如下:
DAI Link的相關實現如下:
5、DAPM:動態電源管理,是基于kcontrol改進過后的相應框架,增加了相應的電源管理機制, widget是DAPM的基本單位。
Codec(es8316)中kcontrol、dapm widget和dapm routes的相關實現如下:
6、DMA:負責把 dma buffer 中的音頻數據搬運到 I2S tx FIFO。
五、調試命令
ALSA是Linux處理音頻的基本接口,但ALSA只提供基層的接口,操作較為繁復,一般情況下可以直接使用其附帶提供的 utils 工具集,utils 工具集是一些封裝好了的功能模塊,直接以命令的方式提供,用戶只需要敲入相關命令和參數即可實現音頻操作功能。
1、查看聲卡信息
root@xiaotianbsp:~# cat /proc/asound/cards 0 [rockchipes8316c]: rockchip_es8316 - rockchip,es8316-codec rockchip,es8316-codec 1 [HDMICODEC ]: HDMI-CODEC - HDMI-CODEC HDMI-CODEC root@xiaotianbsp:~# ls -l /dev/snd/ total 0 drwxr-xr-x 2 root root 80 Aug 16 14:43 by-path crw-rw----+ 1 root audio 116, 2 Aug 16 14:43 controlC0 crw-rw----+ 1 root audio 116, 5 Aug 16 14:43 controlC1 crw-rw----+ 1 root audio 116, 4 Aug 16 14:43 pcmC0D0c crw-rw----+ 1 root audio 116, 3 Aug 16 14:43 pcmC0D0p crw-rw----+ 1 root audio 116, 6 Aug 16 14:43 pcmC1D0p crw-rw----+ 1 root audio 116, 1 Aug 16 14:43 seq crw-rw----+ 1 root audio 116, 33 Aug 16 14:43 timer
controlCx:控制接口,提供靈活的方式管理注冊的聲卡和對存在的聲卡進行查詢。
pcmCxDxc:PCM接口,對應錄音設備。
pcmCxDxp:PCM接口,對應放音設備。
timer:支持聲音的同步事件提供聲卡上的定時器。
seq:音序器接口,一個比原始MIDI接口高級的MIDI編程和聲音同步高層接口。
2、查看聲卡采集、播放PCM信息
root@xiaotianbsp:~# cat /proc/asound/pcm 00-00: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 : : playback 1 : capture 1 01-00: ff8a0000.i2s-i2s-hifi i2s-hifi-0 : : playback 1
3、查看ALSA驅動版本
root@xiaotianbsp:~# cat /proc/asound/version Advanced Linux Sound Architecture Driver Version k4.4.154-90-rockchip-ga14f6502e045.
4、查看聲卡0的信息
root@xiaotianbsp:~# cat /proc/asound/card0/pcm0p/sub0/status closed
5、查看寄存器
## regmap名稱 root@xiaotianbsp:~# cat /sys/kernel/debug/regmap/1-0011/name es8316 root@xiaotianbsp:~# cat /sys/kernel/debug/regmap/ff880000.i2s/name rockchip-i2s ## rk3399 i2s0控制器寄存器 root@xiaotianbsp:~# cat /sys/kernel/debug/regmap/ff880000.i2s/registers 00: 0000000f 04: 0000000f 08: 00033f3f 0c: 00000000 10: 000f0010 14: 01f00000 18: XXXXXXXX 1c: 00000000 20: XXXXXXXX 28: 00000000 ## es8316寄存器 root@xiaotianbsp:~# cat /sys/kernel/debug/regmap/1-0011/registers 00: c0 01: f3 02: 08 03: 20 04: 11 05: 00 06: 11 07: 00 08: 00 09: 04 0a: 0c 0b: 0c 0c: ff 0d: 3f 0e: ff 0f: ff 10: 11 11: fc 12: 28 13: 00 14: 00 15: 33 16: 00 17: 00 18: 00
?
?
6、查看時鐘
?
?
## 采樣率44.1KHZ,mclk = 256 * sample = 256*44.1*1000 = 11289600 HZ root@xiaotianbsp:~# cat /sys/kernel/debug/clk/clk_summary | grep i2s0 clk_i2s0_div 1 1 800000000 0 0 clk_i2s0_frac 1 1 11289600 0 0 clk_i2s0_mux 1 1 11289600 0 0 clk_i2s0 1 2 11289600 0 0 hclk_i2s0 1 2 100000000 0 0
7、amixer命令
root@xiaotianbsp:~# amixer -h Usage: amixer[command] Available options: -h,--help this help -c,--card N select the card -D,--device N select the device, default 'default' -d,--debug debug mode -n,--nocheck do not perform range checking -v,--version print version of this program -q,--quiet be quiet -i,--inactive show also inactive controls -a,--abstract L select abstraction level (none or basic) -s,--stdin Read and execute commands from stdin sequentially -R,--raw-volume Use the raw value (default) -M,--mapped-volume Use the mapped volume Available commands: scontrols show all mixer simple controls scontents show contents of all mixer simple controls (default command) sset sID P set contents for one mixer simple control sget sID get contents for one mixer simple control controls show all controls for given card contents show contents of all controls for given card cset cID P set control contents for one control cget cID get control contents for one control
7.1查看card0內容
root@xiaotianbsp:~# amixer -c 0 contents numid=16,iface=MIXER,name='ADC Double FS Mode' ; type=BOOLEAN,access=rw------,values=1 : values=off numid=14,iface=MIXER,name='ADC Soft Ramp' ; type=BOOLEAN,access=rw------,values=1 : values=on numid=13,iface=MIXER,name='ADC Capture Volume' ; type=INTEGER,access=rw---R--,values=1,min=0,max=192,step=0 : values=192 | dBscale-min=-96.00dB,step=0.50dB,mute=1 numid=15,iface=MIXER,name='Capture Polarity' ; type=ENUMERATED,access=rw------,values=1,items=2 ; Item #0 'Normal' ; Item #1 'Invert' : values=0
7.2查看和配置某個numid命令
## 查看 root@xiaotianbsp:~# amixer -c 0 cget numid=16 numid=16,iface=MIXER,name='ADC Double FS Mode' ; type=BOOLEAN,access=rw------,values=1 : values=off ## 配置 root@xiaotianbsp:~# amixer -c 0 cset numid=16 on numid=16,iface=MIXER,name='ADC Double FS Mode' ; type=BOOLEAN,access=rw------,values=1 : values=on
8、設備名
?
?
root@xiaotianbsp:~# aplay -l **** List of PLAYBACK Hardware Devices **** card 0: rockchipes8316c [rockchip,es8316-codec], device 0: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: HDMICODEC [HDMI-CODEC], device 0: ff8a0000.i2s-i2s-hifi i2s-hifi-0 [] Subdevices: 1/1 Subdevice #0: subdevice #0 root@linaro-alip:~# arecord -l **** List of CAPTURE Hardware Devices **** card 0: rockchipes8316c [rockchip,es8316-codec], device 0: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 [] Subdevices: 1/1 Subdevice #0: subdevice #0
?
?
9、放音
?
?
aplay -D hw:0,0 -r 44100 -c 2 -f s16_le play.wav
?
?
10、錄音
?
?
arecord -D hw:0,0 -r 16000 -c 1 -f s16_le record.wav
?
?
-D:播放設備,aplay -l 或arecord -l列出的設備名
-r:采樣率
-c:音頻文件通道
-f:采樣格式,常用的有S16_LE ,S24_LE ,S32_LE, cd (可忽略)
也可參考tinyalsa命令,如:tinymix、tinypcminfo、tinyplay和tinycap的用法。
11、mp3轉wav
?
?
lame test.mp3 test.wav --decode
?
?
審核編輯:黃飛
?
評論
查看更多