女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ALSA驅動抽象:ASoc理解與分析

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

最近一直在研究 ALSA 驅動,停了一段時間,突然發現Asla 驅動不是一天兩天能講清楚的。

1. ASoC 概述

ASoC (ALSA System on Chip) ,是建立在標準ALSA驅動層上,為了更好地支持嵌入式處理器和移動設備中的音頻Codec的一套軟件體系。在ASoc出現之前,內核對于SoC中的音頻已經有部分的支持,不過會有一些局限性:

Codec驅動與SoC CPU的底層耦合過于緊密,這種不理想會導致代碼的重復。

音頻事件沒有標準的方法來通知用戶,例如耳機、麥克風的插拔和檢測,這些事件在移動設備中是非常普通的,而且通常都需要特定于機器的代碼重新對音頻路勁進行配置。

當進行播放或錄音時,驅動會讓整個codec處于上電狀態,這對于PC沒問題,但對于移動設備來說,這意味著浪費大量的電量。同時也不支持通過改變過取樣頻率和偏置電流來達到省電的目的。

ASoC正是為了解決上述種種問題而提出的,目前已經被整合至內核的代碼樹中:sound/soc。ASoC不能單獨存在,他只是建立在標準ALSA驅動上的一個它必須和標準的ALSA驅動框架相結合才能工作。

2. 硬件架構

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

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

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

Platform:一般是指某一個SoC平臺,比如s3cxxxx,與音頻相關的通常包含該SoC中的時鐘DMA、I2S、PCM等等,只要指定了SoC,那么我們可以認為它會有一個對應的Platform,它只與SoC相關,與Machine無關,這樣我們就可以把Platform抽象出來,使得同一款SoC不用做任何的改動,就可以用在不同的Machine中。實際上,把Platform認為是某個SoC更好理解。

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

注釋:對于現在的很多嵌入式平臺,內部集成了codec,我們在分析時也可以將其劃分到codec 上,不同的Soc 內部Codec 有所不同,同時亦可兼容內部codec 和 外部Codec。

3. 軟件架構

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

Machine: Machine 驅動負責處理機器特有的一些控件和音頻事件(例如,當播放音頻時,需要先行打開一個放大器);單獨的Platform 和 Codec驅動是不能工作的,它必須由Machine驅動把它們結合在一起才能完成整個設備的音頻處理工作。

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

Codec : ASoC 中的一個重要設計原則就是要求Codec驅動是平臺無關的,它包含了一些音頻的控件(Controls),音頻接口,DAMP(動態音頻電源管理)的定義和某些Codec IO功能。為了保證硬件無關性,任何特定于平臺和機器的代碼都要移到 Platform 和Machine驅動中。所有的Codec驅動都要提供以下特性:

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

必要時,也可以提供以下功能:

DAPM描述信息;

DAPM事件處理程序;

DAC數字靜音控制

4. ASOC 分析

4.1 硬件抽象

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

Codec:音頻編解碼控制器,可以是內部Codec(soc 集成),也可以是外部Codec. Codec 通過支持音頻編解碼,包括模擬麥或者spk, 有的甚至支持數字麥。

AMIC/SPK/DMIC:純硬件電路。麥克風或者spk,軟件無需干預。

DMA:對于硬件設備的數據量,大多數情況都是通過dma 搬運來提高效率。

cpu:整個soc 平臺,主要提供音頻通信接口來實現和codec 傳輸。比如(I2S/PDM等)

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

Card:抽象概念,聲卡。

Capture:抽象概念,表示錄音設備

Playback:抽象概念,表示軟件設備

對于大多數平臺,dma 和 i2s/pdm 等集成在一個soc 上,有些甚至集成了Codec。

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

4.2 音頻數據流

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

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

4.3 ASoc 軟件抽象

如下是筆者根據自己理解劃分 Alsa 聲卡驅動各個部分:

Machine:驅動頂層和入口,處理聲卡操作。包括聲卡創建,音頻流的傳輸與控制。

platform:主要負責Soc 平臺的DMA 和 CPU_DAI 操作。

Codec:主要負責Codec driver 和 Codec_dai 操作。

可以看到一個ALSA 聲卡驅動是十分復雜的,包含了各種復雜驅動。

codec driver:音頻配置和傳輸

dma:dma 處理

dai:i2s等接口配置

pcm:和上層應用交互的中間層

control:和上層應用交互的中間層

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

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

4.4 ASoc 驅動分析

我們以 linux-kernel-4.4.94 為例子來分析 ASoc 驅動。限于篇幅,我們只分析 Machine 驅動框架,對于Codec 驅動和其他設備驅動,有時間再分析。

ASoc Machine 驅動調用如下:

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);
}

最關鍵的就是 snd_soc_register_card 這個函數了。詳細分析看上圖uml 時許圖。

4.5 ASoc 數據結構

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

ASoc 數據結構如上圖。最頂層我們構建了snd_soc_card。貫穿整個驅動生命周期中,snd_soc_pcm_runtime,至關重要。

dai_link 關聯著dai_driver 和 compoent_driver

snd_soc_codec:codec 相關

snd_soc_paltform:platform 相關

snd_soc_dai:cpu_dai 和 codec_dai 相關操作

snd_soc_component:關聯dai_driver 和 component_driver。關聯platform_driver 和 component_driver

snd_soc_ops/snd_soc_dai_ops/snd_pcm_ops:比較關鍵的幾個ops

對于剛開始學習ASLA 驅動時,我們先關注這幾個結構體就行。后續將從音頻流和控制兩大塊,詳細分析整個數據流和控制的調用過程。

5. 總結

本文詳細的介紹了ALSA 驅動最關鍵的一環ASoC ,理解了ASoc 頂層設計框架對于我們后續深入學習ASLA 驅動至關重要。

當我們熟悉了一個平臺的驅動框架后,再去看另外一個平臺就知道哪些是我們需要關注的,哪些是linux 內核已經實現的,從而達到事半功倍的作用。

希望本文,對讀者朋友學習理解Alsa 驅動有所幫助!

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5141

    文章

    19526

    瀏覽量

    314875
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11033

    瀏覽量

    215978
  • soc
    soc
    +關注

    關注

    38

    文章

    4335

    瀏覽量

    221648
  • alsa
    +關注

    關注

    0

    文章

    19

    瀏覽量

    3721

原文標題:ALSA 驅動抽象:ASoc 理解與分析

文章出處:【微信號:漫談嵌入式,微信公眾號:漫談嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    【ELF 2學習板試用】2ALSA介紹以及通過設備樹屬性確定ASoC相關的源代碼文件

    的rockchip_i2s_tdm.c和rockchip_i2s_tdm.h以及machine的rockchip_multicodecs.c組成。 這樣由以上三個文件作為起點,理解ASoC中codec、platform和machine是如何創建的,三者如何結合到一起最終創
    發表于 02-17 22:33

    ALSA-lib移植的相關資料分享

    Linux ALSA音頻框架分析六:ALSA-lib移植 雖然linux下alsa框架給用戶空間提供了系統調用,但alsa-lib對系統調用
    發表于 12-24 07:35

    嵌入式linux ASoC架構聲卡驅動開發的相關資料分享

    嵌入式linux ASoC架構聲卡驅動開發文章目錄嵌入式linux ASoC架構聲卡驅動開發需求分析AS
    發表于 12-24 06:28

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

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

    Linux下聲卡的安裝(ALSA

    Advanced Linux Sound Architecture (ALSA) 的網站: http://www.alsa-project.org/ 1、現在最新版的的驅動
    發表于 11-07 10:28 ?0次下載

    Linux內核的git歷史記錄一些最奇怪的事情

    正如我所看到的,這個有66個父節點的不同尋常的提交在某種程度上只是對于ASoc代碼修改的正常合并。ASoc 代表了芯片上的ALSA系統。ALSA系統是音頻子系統;“單片系統是集成在單片
    的頭像 發表于 08-10 11:22 ?3886次閱讀

    Linux ALSA聲卡驅動ALSA架構簡介

    ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經成為了linux的主流音頻體系結構,想了解更多的關于ALSA的這一開源項目的信息和知識
    發表于 04-26 15:55 ?1246次閱讀
    Linux <b class='flag-5'>ALSA</b>聲卡<b class='flag-5'>驅動</b>之<b class='flag-5'>ALSA</b>架構簡介

    Linux ALSA聲卡驅動之八:ASoC架構中的Platform

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

    Linux ALSA聲卡驅動之一:ASoC架構中的Codec

    ASoC對Codec的這些功能都定義好了一些列相應的接口,以方便地對Codec進行控制。ASoC對Codec驅動的一個基本要求是:驅動程序的代碼必須要做到平臺無關性,以方便同一個Cod
    發表于 05-06 14:50 ?1621次閱讀

    Linux ALSA聲卡驅動之一:Control設備的創建

    Control接口主要讓用戶空間的應用程序(alsa-lib)可以訪問和控制音頻codec芯片中的多路開關,滑動控件等。對于Mixer(混音)來說,Control接口顯得尤為重要,從ALSA 0.9.x版本開始,所有的mixer工作都是通過control接口的API來實現
    發表于 05-06 15:03 ?1627次閱讀

    Linux ALSA聲卡驅動之一:移動設備中的ALSAASoC

    Codec驅動與SoC CPU的底層耦合過于緊密,這種不理想會導致代碼的重復,例如,僅是wm8731的驅動,當時Linux中有分別針對4個平臺的驅動代碼。
    發表于 05-06 15:34 ?1870次閱讀
    Linux <b class='flag-5'>ALSA</b>聲卡<b class='flag-5'>驅動</b>之一:移動設備中的<b class='flag-5'>ALSA</b>(<b class='flag-5'>ASoC</b>)

    Linux ALSA聲卡驅動之一:ASoC架構中的Machine

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

    Linux ALSA聲卡驅動之一:ALSA架構簡介

    ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經成為了linux的主流音頻體系結構,想了解更多的關于ALSA的這一開源項目的信息和知識
    發表于 05-10 13:44 ?1693次閱讀
    Linux <b class='flag-5'>ALSA</b>聲卡<b class='flag-5'>驅動</b>之一:<b class='flag-5'>ALSA</b>架構簡介

    alsa底層框架系統配置與插件

    網上大多數是 alsa 底層框架、音頻驅動的文章,應用開發的入門少得可憐。從業務需求出發,摸索積累了一些 alsa 應用開發心得。出此文以便后來者快速入門。
    的頭像 發表于 07-04 09:04 ?8568次閱讀

    如何理解java中的抽象

    的功能,同時也可以強制子類實現特定的方法。 為了理解抽象類的概念,我們首先來看一下為什么需要抽象類。在面向對象的編程中,繼承是一種重要的概念,它允許一個類繼承另一個類的屬性和方法。在一些情況下,我們希望一些類只
    的頭像 發表于 11-21 10:16 ?777次閱讀