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