0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ALSA驅(qū)動(dòng)抽象:ASoc理解與分析

漫談嵌入式 ? 來(lái)源:漫談嵌入式 ? 作者:漫談嵌入式 ? 2022-11-14 10:28 ? 次閱讀

最近一直在研究 ALSA 驅(qū)動(dòng),停了一段時(shí)間,突然發(fā)現(xiàn)Asla 驅(qū)動(dòng)不是一天兩天能講清楚的。

1. ASoC 概述

ASoC (ALSA System on Chip) ,是建立在標(biāo)準(zhǔn)ALSA驅(qū)動(dòng)層上,為了更好地支持嵌入式處理器和移動(dòng)設(shè)備中的音頻Codec的一套軟件體系。在ASoc出現(xiàn)之前,內(nèi)核對(duì)于SoC中的音頻已經(jīng)有部分的支持,不過(guò)會(huì)有一些局限性:

Codec驅(qū)動(dòng)與SoC CPU的底層耦合過(guò)于緊密,這種不理想會(huì)導(dǎo)致代碼的重復(fù)。

音頻事件沒有標(biāo)準(zhǔn)的方法來(lái)通知用戶,例如耳機(jī)、麥克風(fēng)的插拔和檢測(cè),這些事件在移動(dòng)設(shè)備中是非常普通的,而且通常都需要特定于機(jī)器的代碼重新對(duì)音頻路勁進(jìn)行配置。

當(dāng)進(jìn)行播放或錄音時(shí),驅(qū)動(dòng)會(huì)讓整個(gè)codec處于上電狀態(tài),這對(duì)于PC沒問(wèn)題,但對(duì)于移動(dòng)設(shè)備來(lái)說(shuō),這意味著浪費(fèi)大量的電量。同時(shí)也不支持通過(guò)改變過(guò)取樣頻率和偏置電流來(lái)達(dá)到省電的目的。

ASoC正是為了解決上述種種問(wèn)題而提出的,目前已經(jīng)被整合至內(nèi)核的代碼樹中:sound/soc。ASoC不能單獨(dú)存在,他只是建立在標(biāo)準(zhǔn)ALSA驅(qū)動(dòng)上的一個(gè)它必須和標(biāo)準(zhǔn)的ALSA驅(qū)動(dòng)框架相結(jié)合才能工作。

2. 硬件架構(gòu)

嵌入式設(shè)備的音頻系統(tǒng)可以被劃分為板載硬件(Machine)、Soc(Platform)、Codec三大部分,如下圖所示:

dd922fdc-6282-11ed-8abf-dac502259ad0.png

Machine :是指某一款機(jī)器,可以是某款設(shè)備,某款開發(fā)板,由此可以看出Machine幾乎是不可重用的,每個(gè)Machine上的硬件實(shí)現(xiàn)可能都不一樣,CPU不一樣,Codec不一樣,音頻的輸入、輸出設(shè)備也不一樣,Machine為CPU、Codec、輸入輸出設(shè)備提供了一個(gè)載體。

Platform:一般是指某一個(gè)SoC平臺(tái),比如s3cxxxx,與音頻相關(guān)的通常包含該SoC中的時(shí)鐘DMA、I2S、PCM等等,只要指定了SoC,那么我們可以認(rèn)為它會(huì)有一個(gè)對(duì)應(yīng)的Platform,它只與SoC相關(guān),與Machine無(wú)關(guān),這樣我們就可以把Platform抽象出來(lái),使得同一款SoC不用做任何的改動(dòng),就可以用在不同的Machine中。實(shí)際上,把Platform認(rèn)為是某個(gè)SoC更好理解。

Codec:字面上的意思就是編解碼器,Codec里面包含了I2S接口、D/A、A/D、Mixer、PA(功放),通常包含多種輸入(Mic、Line-in、I2S、PCM)和多個(gè)輸出(耳機(jī)、喇叭、聽筒,Line-out),Codec和Platform一樣,是可重用的部件,同一個(gè)Codec可以被不同的Machine使用。嵌入式Codec通常通過(guò)I2C對(duì)內(nèi)部的寄存器進(jìn)行控制。

注釋:對(duì)于現(xiàn)在的很多嵌入式平臺(tái),內(nèi)部集成了codec,我們?cè)诜治鰰r(shí)也可以將其劃分到codec 上,不同的Soc 內(nèi)部Codec 有所不同,同時(shí)亦可兼容內(nèi)部codec 和 外部Codec。

3. 軟件架構(gòu)

在軟件層面,ASoC也把嵌入式設(shè)備的音頻系統(tǒng)同樣分為3大部分,Machine,Platform和Codec。

Machine: Machine 驅(qū)動(dòng)負(fù)責(zé)處理機(jī)器特有的一些控件和音頻事件(例如,當(dāng)播放音頻時(shí),需要先行打開一個(gè)放大器);單獨(dú)的Platform 和 Codec驅(qū)動(dòng)是不能工作的,它必須由Machine驅(qū)動(dòng)把它們結(jié)合在一起才能完成整個(gè)設(shè)備的音頻處理工作。

Platform:它包含了該SoC平臺(tái)的音頻 DMA 和音頻接口的配置和控制(I2S,PCM,AC97等等);它也不能包含任何與板子或機(jī)器相關(guān)的代碼。

Codec : ASoC 中的一個(gè)重要設(shè)計(jì)原則就是要求Codec驅(qū)動(dòng)是平臺(tái)無(wú)關(guān)的,它包含了一些音頻的控件(Controls),音頻接口,DAMP(動(dòng)態(tài)音頻電源管理)的定義和某些Codec IO功能。為了保證硬件無(wú)關(guān)性,任何特定于平臺(tái)和機(jī)器的代碼都要移到 Platform 和Machine驅(qū)動(dòng)中。所有的Codec驅(qū)動(dòng)都要提供以下特性:

Codec DAI 和 PCM的配置信息;Codec的IO控制方式(I2C,SPI等);Mixer和其他的音頻控件;Codec的ALSA音頻操作接口;

必要時(shí),也可以提供以下功能:

DAPM描述信息;

DAPM事件處理程序;

DAC數(shù)字靜音控制

4. ASOC 分析

4.1 硬件抽象

通常一個(gè)聲卡設(shè)備,大概包含以下幾個(gè)物理設(shè)備或者外設(shè):

Codec:音頻編解碼控制器,可以是內(nèi)部Codec(soc 集成),也可以是外部Codec. Codec 通過(guò)支持音頻編解碼,包括模擬麥或者spk, 有的甚至支持?jǐn)?shù)字麥。

AMIC/SPK/DMIC:純硬件電路。麥克風(fēng)或者spk,軟件無(wú)需干預(yù)。

DMA:對(duì)于硬件設(shè)備的數(shù)據(jù)量,大多數(shù)情況都是通過(guò)dma 搬運(yùn)來(lái)提高效率。

cpu:整個(gè)soc 平臺(tái),主要提供音頻通信接口來(lái)實(shí)現(xiàn)和codec 傳輸。比如(I2S/PDM等)

DAI:音頻接口,抽象概念,比如I2S等。

Card:抽象概念,聲卡。

Capture:抽象概念,表示錄音設(shè)備

Playback:抽象概念,表示軟件設(shè)備

對(duì)于大多數(shù)平臺(tái),dma 和 i2s/pdm 等集成在一個(gè)soc 上,有些甚至集成了Codec。

ddb3f522-6282-11ed-8abf-dac502259ad0.png

4.2 音頻數(shù)據(jù)流

音頻數(shù)據(jù)的數(shù)據(jù)流,大致如下。我們可以看到,不同的硬件平臺(tái),其聲卡設(shè)備的硬件邏輯和數(shù)據(jù)流大致一致,故抽象ASoc 很有必要。

ddd0e5e2-6282-11ed-8abf-dac502259ad0.png

4.3 ASoc 軟件抽象

如下是筆者根據(jù)自己理解劃分 Alsa 聲卡驅(qū)動(dòng)各個(gè)部分:

Machine:驅(qū)動(dòng)頂層和入口,處理聲卡操作。包括聲卡創(chuàng)建,音頻流的傳輸與控制。

platform:主要負(fù)責(zé)Soc 平臺(tái)的DMA 和 CPU_DAI 操作。

Codec:主要負(fù)責(zé)Codec driver 和 Codec_dai 操作。

可以看到一個(gè)ALSA 聲卡驅(qū)動(dòng)是十分復(fù)雜的,包含了各種復(fù)雜驅(qū)動(dòng)。

codec driver:音頻配置和傳輸

dma:dma 處理

dai:i2s等接口配置

pcm:和上層應(yīng)用交互的中間層

control:和上層應(yīng)用交互的中間層

其他:比如i2c/spi ,codec 控制操作。

ddf13be4-6282-11ed-8abf-dac502259ad0.png

4.4 ASoc 驅(qū)動(dòng)分析

我們以 linux-kernel-4.4.94 為例子來(lái)分析 ASoc 驅(qū)動(dòng)。限于篇幅,我們只分析 Machine 驅(qū)動(dòng)框架,對(duì)于Codec 驅(qū)動(dòng)和其他設(shè)備驅(qū)動(dòng),有時(shí)間再分析。

ASoc Machine 驅(qū)動(dòng)調(diào)用如下:

de192a46-6282-11ed-8abf-dac502259ad0.jpg

/*ASoCplatformdriver*/
staticstructplatform_driversoc_driver={
.driver={
.name="soc-audio",
.pm=&snd_soc_pm_ops,
},
.probe=soc_probe,        .remove=soc_remove,
};

最頂層入口是soc_probe,位于 sound/soc/soc-core.c,不同的Machine 位置可能不同。大部分在soc/xxx/下。

/*probesanewsocdev*/
staticintsoc_probe(structplatform_device*pdev)
{
structsnd_soc_card*card=platform_get_drvdata(pdev);

/*
|*nocard,somachinedrivershouldberegisteringcard
|*weshouldnotbehereinthatcasesoreterror
|*/
if(!card)
return-EINVAL;

dev_warn(&pdev->dev,
|"ASoC:machine%sshouldusesnd_soc_register_card()
",
|card->name);

/*Bodgewhileweunpickinstantiation*/
card->dev=&pdev->dev;

returnsnd_soc_register_card(card);
}

最關(guān)鍵的就是 snd_soc_register_card 這個(gè)函數(shù)了。詳細(xì)分析看上圖uml 時(shí)許圖。

4.5 ASoc 數(shù)據(jù)結(jié)構(gòu)

de379378-6282-11ed-8abf-dac502259ad0.jpg

ASoc 數(shù)據(jù)結(jié)構(gòu)如上圖。最頂層我們構(gòu)建了snd_soc_card。貫穿整個(gè)驅(qū)動(dòng)生命周期中,snd_soc_pcm_runtime,至關(guān)重要。

dai_link 關(guān)聯(lián)著dai_driver 和 compoent_driver

snd_soc_codec:codec 相關(guān)

snd_soc_paltform:platform 相關(guān)

snd_soc_dai:cpu_dai 和 codec_dai 相關(guān)操作

snd_soc_component:關(guān)聯(lián)dai_driver 和 component_driver。關(guān)聯(lián)platform_driver 和 component_driver

snd_soc_ops/snd_soc_dai_ops/snd_pcm_ops:比較關(guān)鍵的幾個(gè)ops

對(duì)于剛開始學(xué)習(xí)ASLA 驅(qū)動(dòng)時(shí),我們先關(guān)注這幾個(gè)結(jié)構(gòu)體就行。后續(xù)將從音頻流和控制兩大塊,詳細(xì)分析整個(gè)數(shù)據(jù)流和控制的調(diào)用過(guò)程。

5. 總結(jié)

本文詳細(xì)的介紹了ALSA 驅(qū)動(dòng)最關(guān)鍵的一環(huán)ASoC ,理解了ASoc 頂層設(shè)計(jì)框架對(duì)于我們后續(xù)深入學(xué)習(xí)ASLA 驅(qū)動(dòng)至關(guān)重要。

當(dāng)我們熟悉了一個(gè)平臺(tái)的驅(qū)動(dòng)框架后,再去看另外一個(gè)平臺(tái)就知道哪些是我們需要關(guān)注的,哪些是linux 內(nèi)核已經(jīng)實(shí)現(xiàn)的,從而達(dá)到事半功倍的作用。

希望本文,對(duì)讀者朋友學(xué)習(xí)理解Alsa 驅(qū)動(dòng)有所幫助!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18912

    瀏覽量

    300787
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10772

    瀏覽量

    210438
  • soc
    soc
    +關(guān)注

    關(guān)注

    38

    文章

    4067

    瀏覽量

    217556
  • alsa
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    3595

原文標(biāo)題:ALSA 驅(qū)動(dòng)抽象:ASoc 理解與分析

文章出處:【微信號(hào):漫談嵌入式,微信公眾號(hào):漫談嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ALSA-lib移植的相關(guān)資料分享

    Linux ALSA音頻框架分析六:ALSA-lib移植 雖然linux下alsa框架給用戶空間提供了系統(tǒng)調(diào)用,但alsa-lib對(duì)系統(tǒng)調(diào)用
    發(fā)表于 12-24 07:35

    嵌入式linux ASoC架構(gòu)聲卡驅(qū)動(dòng)開發(fā)的相關(guān)資料分享

    嵌入式linux ASoC架構(gòu)聲卡驅(qū)動(dòng)開發(fā)文章目錄嵌入式linux ASoC架構(gòu)聲卡驅(qū)動(dòng)開發(fā)需求分析AS
    發(fā)表于 12-24 06:28

    基于抽象文法的通用程序理解架構(gòu)研究_羅玉玲

    基于抽象文法的通用程序理解架構(gòu)研究_羅玉玲
    發(fā)表于 03-17 09:53 ?0次下載

    Linux下聲卡的安裝(ALSA

    Advanced Linux Sound Architecture (ALSA) 的網(wǎng)站: http://www.alsa-project.org/ 1、現(xiàn)在最新版的的驅(qū)動(dòng)
    發(fā)表于 11-07 10:28 ?0次下載

    Linux內(nèi)核的git歷史記錄一些最奇怪的事情

    正如我所看到的,這個(gè)有66個(gè)父節(jié)點(diǎn)的不同尋常的提交在某種程度上只是對(duì)于ASoc代碼修改的正常合并。ASoc 代表了芯片上的ALSA系統(tǒng)。ALSA系統(tǒng)是音頻子系統(tǒng);“單片系統(tǒng)是集成在單片
    的頭像 發(fā)表于 08-10 11:22 ?3696次閱讀

    Linux ALSA聲卡驅(qū)動(dòng)ALSA架構(gòu)簡(jiǎn)介

    ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經(jīng)成為了linux的主流音頻體系結(jié)構(gòu),想了解更多的關(guān)于ALSA的這一開源項(xiàng)目的信息和知識(shí)
    發(fā)表于 04-26 15:55 ?1114次閱讀
    Linux <b class='flag-5'>ALSA</b>聲卡<b class='flag-5'>驅(qū)動(dòng)</b>之<b class='flag-5'>ALSA</b>架構(gòu)簡(jiǎn)介

    Linux ALSA聲卡驅(qū)動(dòng)之八:ASoC架構(gòu)中的Platform

    前面幾章內(nèi)容已經(jīng)說(shuō)過(guò),ASoC被分為Machine,Platform和Codec三大部件,Platform驅(qū)動(dòng)的主要作用是完成音頻數(shù)據(jù)的管理,最終通過(guò)CPU的數(shù)字音頻接口(DAI)把音頻數(shù)據(jù)傳送給Codec進(jìn)行處理,最終由Codec輸出
    發(fā)表于 05-06 17:39 ?1951次閱讀
    Linux <b class='flag-5'>ALSA</b>聲卡<b class='flag-5'>驅(qū)動(dòng)</b>之八:<b class='flag-5'>ASoC</b>架構(gòu)中的Platform

    Linux ALSA聲卡驅(qū)動(dòng)之一:ASoC架構(gòu)中的Codec

    ASoC對(duì)Codec的這些功能都定義好了一些列相應(yīng)的接口,以方便地對(duì)Codec進(jìn)行控制。ASoC對(duì)Codec驅(qū)動(dòng)的一個(gè)基本要求是:驅(qū)動(dòng)程序的代碼必須要做到平臺(tái)無(wú)關(guān)性,以方便同一個(gè)Cod
    發(fā)表于 05-06 14:50 ?1423次閱讀

    Linux ALSA聲卡驅(qū)動(dòng)之一:Control設(shè)備的創(chuàng)建

    Control接口主要讓用戶空間的應(yīng)用程序(alsa-lib)可以訪問(wèn)和控制音頻codec芯片中的多路開關(guān),滑動(dòng)控件等。對(duì)于Mixer(混音)來(lái)說(shuō),Control接口顯得尤為重要,從ALSA 0.9.x版本開始,所有的mixer工作都是通過(guò)control接口的API來(lái)實(shí)現(xiàn)
    發(fā)表于 05-06 15:03 ?1457次閱讀

    Linux ALSA聲卡驅(qū)動(dòng)之一:移動(dòng)設(shè)備中的ALSAASoC

    Codec驅(qū)動(dòng)與SoC CPU的底層耦合過(guò)于緊密,這種不理想會(huì)導(dǎo)致代碼的重復(fù),例如,僅是wm8731的驅(qū)動(dòng),當(dāng)時(shí)Linux中有分別針對(duì)4個(gè)平臺(tái)的驅(qū)動(dòng)代碼。
    發(fā)表于 05-06 15:34 ?1702次閱讀
    Linux <b class='flag-5'>ALSA</b>聲卡<b class='flag-5'>驅(qū)動(dòng)</b>之一:移動(dòng)設(shè)備中的<b class='flag-5'>ALSA</b>(<b class='flag-5'>ASoC</b>)

    Linux ALSA聲卡驅(qū)動(dòng)之一:ASoC架構(gòu)中的Machine

    ASoC把聲卡注冊(cè)為Platform Device,我們以裝配有WM8994的一款Samsung的開發(fā)板SMDK為例子做說(shuō)明,WM8994是一顆Wolfson生產(chǎn)的多功能Codec芯片。
    發(fā)表于 05-06 15:56 ?911次閱讀

    Linux ALSA聲卡驅(qū)動(dòng)之一:ALSA架構(gòu)簡(jiǎn)介

    ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經(jīng)成為了linux的主流音頻體系結(jié)構(gòu),想了解更多的關(guān)于ALSA的這一開源項(xiàng)目的信息和知識(shí)
    發(fā)表于 05-10 13:44 ?1556次閱讀
    Linux <b class='flag-5'>ALSA</b>聲卡<b class='flag-5'>驅(qū)動(dòng)</b>之一:<b class='flag-5'>ALSA</b>架構(gòu)簡(jiǎn)介

    Linux應(yīng)用開發(fā)【第八章】ALSA應(yīng)用開發(fā)

    文章目錄 8 ALSA應(yīng)用開發(fā) 8.1 音頻相關(guān)概念 8.1.1 采樣頻率 8.1.2 量化位數(shù) 8.2 ALSA架構(gòu) 8.2.1 ALSA架構(gòu)介紹 8.3 移植ALSA庫(kù)及工具 8.
    的頭像 發(fā)表于 12-10 19:19 ?843次閱讀
    Linux應(yīng)用開發(fā)【第八章】<b class='flag-5'>ALSA</b>應(yīng)用開發(fā)

    alsa底層框架系統(tǒng)配置與插件

    網(wǎng)上大多數(shù)是 alsa 底層框架、音頻驅(qū)動(dòng)的文章,應(yīng)用開發(fā)的入門少得可憐。從業(yè)務(wù)需求出發(fā),摸索積累了一些 alsa 應(yīng)用開發(fā)心得。出此文以便后來(lái)者快速入門。
    的頭像 發(fā)表于 07-04 09:04 ?7302次閱讀

    如何理解java中的抽象

    的功能,同時(shí)也可以強(qiáng)制子類實(shí)現(xiàn)特定的方法。 為了理解抽象類的概念,我們首先來(lái)看一下為什么需要抽象類。在面向?qū)ο蟮木幊讨?,繼承是一種重要的概念,它允許一個(gè)類繼承另一個(gè)類的屬性和方法。在一些情況下,我們希望一些類只
    的頭像 發(fā)表于 11-21 10:16 ?510次閱讀