• 正文
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

【技術(shù)干貨】原來ARM+Linux音頻方案如此簡單!

2022/07/14
1099
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

嵌入式產(chǎn)品開發(fā)中經(jīng)常遇到音頻的輸入輸出問題,如何為其添加“喇叭”、“麥克風(fēng)”設(shè)備呢?本文將簡單介紹ARM+Linux產(chǎn)品中的音頻解決方案。
    

我們先認(rèn)識下I2S(Inter-IC Sound)總線。I2S又稱集成電路內(nèi)置音頻總線,該總線專門用于音頻設(shè)備之間的數(shù)據(jù)傳輸,廣泛應(yīng)用于各種多媒體系統(tǒng)。它采用了沿獨立的導(dǎo)線傳輸時鐘與數(shù)據(jù)信號的設(shè)計,通過將數(shù)據(jù)和時鐘信號分離,有效避免因時差誘發(fā)的失真。
   

以HDG2L-IoT評估套件為例,RZ/G2L處理器提供至少一路I2S總線,通過該總線與音頻編解碼芯片(IC型號WM8960)連接,用于提供高質(zhì)量的錄音播音功能。音頻模塊硬件部署如下所示。

圖1  HDG2L-IoT音頻接口
    

G2L核心板與WM8960的音頻通訊引腳如下所示:

在Linux系統(tǒng)的音頻編解碼驅(qū)動中,通過I2C通訊接口與音頻IC通訊,把音頻IC內(nèi)的各個功能寄存器抽象成音頻控件,這樣用戶即可在User空間內(nèi)直接調(diào)整IC內(nèi)的參數(shù)。I2S音頻引腳,則是數(shù)字信號發(fā)送、接收的通道。

播音時,音頻IC接收到數(shù)字信號后則轉(zhuǎn)換為模擬信號發(fā)送出去,錄音時,音頻IC把收到的音頻模擬量轉(zhuǎn)換為數(shù)字量,發(fā)送給處理器。
  

 ALSA是linux的主流音頻體系結(jié)構(gòu),它包含內(nèi)核驅(qū)動集合, API 庫和工具對 Linux 聲音進(jìn)行支持,應(yīng)用程序只要調(diào)用alsa-lib提供的API,即可以完成對底層音頻硬件的控制。
   

Linux通過alsa庫以及alsa工具管理音頻IC的控件,通過“amixer controls”列出當(dāng)前系統(tǒng)內(nèi)的音頻控制項:

 root@g2liot:~# amixer controls

numid=12,iface=MIXER,name='Headphone Playback ZC Switch'

numid=11,iface=MIXER,name='Headphone Playback Volume'

numid=17,iface=MIXER,name='PCM Playback -6dB Switch'

...

numid=16,iface=MIXER,name='Speaker AC Volume'

numid=15,iface=MIXER,name='Speaker DC Volume'

numid=13,iface=MIXER,name='Speaker Playback Volume'

numid=14,iface=MIXER,name='Speaker Playback ZC Switch'

root@g2liot:~#
    

音頻功能的關(guān)鍵控件信息如下所示。(錄音通道、播音通道、耳機音量大小、喇叭音量大小)。

開發(fā)板下,運行aplay程序可以對音頻播放進(jìn)行測試。在測試前,需要將耳機插入開發(fā)板的耳機插孔中。

為測試基于I2S的音頻輸出接口,在命令行下執(zhí)行如下命令:

root@g2liot:~# aplay /home/root/audios/2.wav

其中2.wav為需要播放的音頻文件,且此處假定2.wav位于/home/root/audios目錄下。

在進(jìn)行音頻播放時,對于基于I2S的音頻輸出接口,可以使用amixer程序?qū)σ袅窟M(jìn)行調(diào)節(jié)。使用amixer程序?qū)Χ鷻C播放音量進(jìn)行調(diào)節(jié)的命令行格式為:

amixer cset numid=11音量值

其音量值取值范圍在0~127之間,127表明最大音量。例如要將音量設(shè)置為100,可在命令行下執(zhí)行如下命令:

root@g2liot:~#amixer cset numid=11 100

揚聲器接入HDG2L-IOT開發(fā)板的左右聲道插座中,在播放音頻前可先設(shè)置揚聲器播放音量以及總音量,然后播放音頻文件:

root@g2liot:~#amixer cset numid=10 240

root@g2liot:~#amixer cset numid=13 120

root@g2liot:~# aplay /home/root/audios/2.wav

錄音功能需設(shè)置錄音控件的參數(shù),如下所示。

root@g2liot:~#amixer cset numid=1 60

root@g2liot:~#amixer cset numid=36 240

用arecord命令錄音并保存為“/tmp/t.wav”,然后用aplay命令回放進(jìn)行驗證。

root@g2liot:~# arecord -f cd /tmp/t.wav

root@g2liot:~#aplay /tmp/t.wav 

由于當(dāng)前的麥克風(fēng)輸出信號僅接到了音頻處理的Left端作為輸入,所以播放錄音文件時僅左聲道有輸出,若希望將麥克風(fēng)輸出信號同時記錄在左右聲道可做如下設(shè)置:

root@g2liot:~#amixer cset numid=41 1

將“ADC Data Output Select”設(shè)定為1,其值含義為“Left Data = Left ADC;  Right Data = Left ADC”。

由上可知,音頻編解碼芯片在Linux系統(tǒng)中以控件的形式存在,內(nèi)部的參數(shù)一般只記錄在內(nèi)存中,當(dāng)系統(tǒng)掉電時,修改的參數(shù)就會消失,所以需要保存和恢復(fù)指令將上次的參數(shù)保存在配置文件中。
    

alsa的配置文件為:/var/lib/alsa/asound.state
    

控件修改后的寫入操作如下所示。

alsactl store
    

控件恢復(fù)參數(shù)的操作如下所示(注:重啟板子后會自動讀取配置文件)。

alsactl restore
 

Arm

Arm

ARM公司是一家知識產(chǎn)權(quán)(IP)供應(yīng)商,主要為國際上其他的電子公司提供高性能RISC處理器、外設(shè)和系統(tǒng)芯片技術(shù)授權(quán)。目前,ARM公司的處理器內(nèi)核已經(jīng)成為便攜通訊、手持計算設(shè)備、多媒體數(shù)字消費品等方案的RISC標(biāo)準(zhǔn)。公司1990年11月由Acorn、Apple和VLSI合并而成。

ARM公司是一家知識產(chǎn)權(quán)(IP)供應(yīng)商,主要為國際上其他的電子公司提供高性能RISC處理器、外設(shè)和系統(tǒng)芯片技術(shù)授權(quán)。目前,ARM公司的處理器內(nèi)核已經(jīng)成為便攜通訊、手持計算設(shè)備、多媒體數(shù)字消費品等方案的RISC標(biāo)準(zhǔn)。公司1990年11月由Acorn、Apple和VLSI合并而成。收起

查看更多

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

以博士后為核心的嵌入式團(tuán)隊,專注于為企業(yè)客戶提供嵌入式核心模塊、 邊緣計算網(wǎng)關(guān)、 嵌入式網(wǎng)關(guān)模塊、 PASS軟件等產(chǎn)品。