1. 程式人生 > >linux驅動由淺入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音訊子系統之一

linux驅動由淺入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音訊子系統之一

目前linux中主流的音訊體系結構是ALSA(Advanced Linux Sound Architecture),ALSA在核心驅動層提供了alsa-driver,在應用層提供了alsa-lib,應用程式只需要呼叫alsa-lib提供的API就可以完成對底層硬體的操作。說的這麼好,但是Android中沒有使用標準的ALSA,而是一個ALSA的簡化版叫做tinyalsa。Android中使用tinyalsa控制管理所有模式的音訊通路,我們也可以使用tinyalsa提供的工具進行檢視、除錯。

編譯tinyalsa後生成四個小工具:

tinymix
tinyplay
tinycap
tinypcminfo

編譯命令:

mmm external/tinyalsa/


下面依次演示一下四個小工具的使用:(以下使用聯芯科技的LC1860平臺配合LC1160電源+音訊晶片,截圖及演示效果均來自M7301P5測試機)

1,  tinypcminfo

tinypcminfo用於檢視pcm通道的相關資訊

輸入:

tinypcminfo -D /proc/asound/cards

結果如下:


從上面獲得的資訊中可以知道PCM的取樣率,通道個數,取樣點數等資訊。

其中 –D 後邊跟的引數為音效卡檔案,一般位於/proc/asound/cards。可以使用
cat /proc/asound/cards
檢視當前音效卡

2,  tinymix

如下圖所示,直接輸入tinymix可以得到音訊通路相關的各項配置引數。也可以通過新增引數修改其中的配置,如希望提高ADC1 Gain值到110,輸入tinymix 12 110即可。


單獨檢視上述資訊比較難以梳理,配合音訊通路圖會更加清晰。


上圖中紅色字型標明瞭LC1160與麥克風、耳機等硬體裝置的連線關係。(注:M73xx專案由於內部ClassD不滿足要求,喇叭連在了AUX通路上)

各個通路上的增益調節部分使用綠色字型標出了與tinymix中選項的對應關係。

圖中加號與Mux是通路選擇開關,對應tinymix中的其它的選項,用於在各種模式下切換音訊通道。此部分比較多沒有在圖中一一標出,但根據已知的通路名是比較容易對應的。

圖中黃色箭頭標出的是通話時下行音訊資料流,從PCM介面進入到LC1160,然後經過MonoDAC進行數模轉化後送到聽筒。

圖中紫色箭頭標出的是通話時上行音訊資料流,從主MIC採集聲音後,經過ADC1進行模數轉換後由PMC的DO線送出

3,  tinyplay

tinyplay是一個簡易的音樂播放器,一般用於播放測試。tinyplay只能播放wav原始格式的音樂,不能進行Mp3等格式的解碼,支援44.1kHz,48kHz取樣率的wav音樂。

在呼叫tinyplay播放音樂之前需要先使用tinymix切換好音訊通路:

tinymix 0 I2SR		//選擇Stereo DACR的音源為i2s
tinymix 1 I2SL		//選擇Stereo DACL的音源為i2s
tinymix 2 0 0		//將Stereo DAC左右聲道的mute關閉
tinymix 24 1		//開啟喇叭的外部PA晶片
tinymix 40 1		//將Stereo DACR的聲音路由到AUX口輸出(因為實驗機器喇叭掛載AUX介面上)
tinymix 41 1		//將Stereo DACR的聲音路由到AUX口輸出(因為實驗機器喇叭掛載AUX介面上)
tinyplay z.wav

4,  tinycap

tinycap是一個簡易的錄音軟體,一般用於錄音測試。

在呼叫tinycap錄音之前需要先調整好音訊通路:

tinymix 14 30			//mic1 volume
tinymix 19 1			//mic1 boost on
tinymix 26 1			//adc1 -> mic1
tinymix 50 ADC1			//i2sR out -> adc1
tinymix 51 ADC1		//i2sL out -> adc2
echo "0xfb 0x01" >  /sys/devices/platform/comip_codec/lc1160_reg		//bias poweron
echo "0xad 0x08" >  /sys/devices/platform/comip_codec/lc1160_reg	//adc1 enable
echo "0xac 0x01" >  /sys/devices/platform/comip_codec/lc1160_reg		//mic1 pga enable
echo "0x3b 0xcc" >  /sys/devices/platform/comip_codec/lc1160_reg		//ldo
echo 2 > /sys/bus/i2c/drivers/fm2018/0-0060/mode		//bypass 外部的回聲消除音訊晶片(M730x專案特有)

tinycap /sdcard/Music/l.wav

錄音結束通過ctrl+C強行退出即可,之後在/sdcard/Music/路徑下檢視到l.wav音訊檔案

使用adb pull到本地電腦中,使用goldwave播放、檢視。

adb pull /sdcard/Music/l.wav d:\



另外

LC1160的暫存器是分頁的,即同一個地址上存在兩個不同含義的暫存器,通過控制0xFC暫存器中的值來切換到第二功能頁
echo "0xfc 0x01" >  /sys/devices/platform/comip_codec/lc1160_reg 
cat /sys/devices/platform/comip_codec/lc1160_reg
echo "0xfc 0x00" >  /sys/devices/platform/comip_codec/lc1160_reg