国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

深度解析ES8389/ES8390/音頻芯片Linux驅動(Linux6.1內核)

jf_44130326 ? 來源:Linux1024 ? 作者:Linux1024 ? 2026-02-02 11:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式音頻開發中,順芯(EverestES8389/ES8390是一款高集成度的音頻Codec芯片,廣泛應用于智能音箱、車載終端、便攜設備等場景。本文基于Linux6.1內核,從驅動架構、寄存器配置、核心函數、數據流走向四個維度,完整拆解ES8389Linux驅動實現,幫你吃透這款芯片的驅動邏輯。

注意:在講解rk3576系列課程的視頻中有提到es8388已經停產了,目前這個8390pinpin替代的,估計也是升級版。

一、驅動整體架構:基于ASoC+I2C框架

ES8389驅動完全遵循Linux音頻子系統的ASoCALSA System on Chip框架設計,同時依托I2C完成芯片寄存器的讀寫交互,整體架構分為三層:

?I2C驅動層:實現芯片與內核的I2C通信,是驅動的基礎載體;

?ASoC Component:封裝Codec的硬件操作(probe/remove/suspend/resume)、音頻控制(音量/靜音/混音);

?ASoC DAI:定義音頻接口I2S/TDM)、采樣率/格式等參數,是CPUCodec的音頻數據交互入口。

核心代碼中,es8389_i2c_driverI2C驅動主體,soc_codec_dev_es8389ASoC Component驅動,es8389_daiDAIDigital Audio Interface)驅動,三者共同構成完整的驅動體系。

二、核心數據結構:驅動的骨架

1.私有數據結構體(es8389_private

驅動通過該結構體管理芯片的運行時狀態,是貫穿整個驅動的核心:

structes8389_private{ structsnd_soc_component*component; // 關聯ASoC組件 structregmap*regmap;        // 寄存器映射(簡化I2C讀寫) structclk*mclk;          // 主時鐘句柄 unsignedintsysclk;         // 系統時鐘頻率 intmastermode;           // 主/從模式標識
  u8 adc_slot;   // ADC TDM時隙  u8 dac_slot;   // DAC TDM時隙 intdmic;     // DMIC使能標識  u8 mclk_src;   // 主時鐘源 enumsnd_soc_bias_levelbias_level; // 功耗偏置等級};

2.時鐘系數結構體(_coeff_div

ES8389的時鐘配置高度依賴采樣率和主時鐘(MCLK)的匹配,驅動預定義了不同MCLK/采樣率組合下的寄存器配置表:

struct_coeff_div {  u16 fs;     // 采樣率(如8000/16000/48000)  u32 mclk;    // 主時鐘頻率  u32 rate;    // 音頻速率  u8 Reg0x04;   // 時鐘分頻寄存器0x04配置值 // ... 省略其他寄存器配置項  u8 Reg0x19;   // 系統寄存器0x19配置值};

代碼中coeff_div數組包含了8kHz/16kHz/44.1kHz/48kHz等主流采樣率的時鐘參數,get_coeff()函數負責根據實際MCLK和采樣率匹配對應的寄存器配置。

三、關鍵寄存器解析:硬件的指令集

ES8389驅動的核心是寄存器操作,按功能可分為5大類,以下結合代碼中的關鍵操作解析:

1.時鐘配置寄存器(0x04-0x0A0x0F0x11

?作用:配置時鐘分頻、倍頻、源選擇,是音頻采樣率匹配的核心;

?關鍵操作es8389_pcm_hw_params()函數中,根據采樣率匹配coeff_div表后,批量寫入時鐘寄存器:

regmap_write(es8389->regmap, ES8389_CLK_DIV1_REG04, coeff_div[coeff].Reg0x04);regmap_write(es8389->regmap, ES8389_CLK_MUL_REG05, coeff_div[coeff].Reg0x05);// ... 其他時鐘寄存器寫入

2. ADC/DAC核心寄存器(0x200x40

?作用:配置音頻格式(S16_LE/S24_LE/S32_LE)、I2S/TDM模式、靜音等;

?關鍵操作

?格式配置:hw_params()中根據PCM參數設置數據長度:

switch(params_format(params)){ caseSNDRV_PCM_FORMAT_S16_LE:    state |= ES8389_S16_LE; // 16位小端格式   break; // ... 其他格式配置}regmap_update_bits(es8389->regmap, ES8389_ADC_REG20, ES8389_DATA_LEN_MASK, state);

?靜音控制:es8389_mute()中通過0x20/0x40寄存器的低2位控制ADC/DAC靜音:

regmap_update_bits(es8389->regmap, ES8389_DAC_REG40,0x03,0x03); // 靜音DAC

3.模擬偏置寄存器(0x60-0x63

?作用:配置模擬電路的偏置電壓、電源模式,是芯片正常工作的基礎;

?關鍵操作es8389_init()中初始化模擬電路:

regmap_write(es8389->regmap, ES8389_VMID_REG60,0x2A); // 偏置電壓配置regmap_write(es8389->regmap, ES8389_ANA_CTL1_REG61,0xC9); // 模擬控制1

4.混音/路由寄存器(0x2B0x440x31

?作用:配置ADC/DAC的混音源、通道路由(如左右聲道交換、ADC MUX選擇);

?關鍵操作:通過DAPMDynamic Audio Power Management)控件配置路由,例如:

// 配置ADC MUX選擇AMIC/DMICstaticconststructsoc_enum es8389_dmic_mux_enum =  SOC_VALUE_ENUM_SINGLE(ES8389_DMIC_EN_REG6D,6,3, es8389_dmic_mux_txt, es8389_dmic_mux_values);

5.功耗控制寄存器(0x000x100x69

?作用控制芯片的復位、功耗等級(ON/STANDBY/OFF);

?關鍵操作es8389_set_bias_level()中切換功耗狀態:

caseSND_SOC_BIAS_ON: regmap_write(es8389->regmap,ES8389_RESET_REG00,0x01);// 退出復位 regmap_update_bits(es8389->regmap,ES8389_HPSW_REG69,0x20,0x20);// 開啟耳機電源 break;caseSND_SOC_BIAS_STANDBY: regmap_write(es8389->regmap,ES8389_RESET_REG00,0x3E);// 進入待機 break;

四、核心函數分析:驅動的靈魂

1. probe函數:驅動初始化入口

es8389_probe()是驅動加載時的核心函數,完成以下關鍵操作:

1.從設備樹讀取配置(mclk-srcadc-slotdmic-enabled等);

2.獲取并使能主時鐘(MCLK);

3.調用es8389_init()完成芯片默認寄存器配置;

4.關聯ASoC組件和私有數據。

2. hw_params函數:音頻參數適配

es8389_pcm_hw_params()在音頻流啟動前被調用,核心邏輯:

1.解析PCM參數(采樣率、格式、通道數);

2.配置ADC/DAC的數據格式(如S16_LE);

3.匹配時鐘系數表,寫入時鐘寄存器;

4.完成硬件參數與芯片寄存器的映射。

3. set_bias_level函數:功耗管理

ES8389支持4種功耗等級(OFF/STANDBY/PREPARE/ON),該函數負責切換不同等級:

?ON:芯片全功能運行,開啟模擬電路、時鐘;

?STANDBY:低功耗待機,關閉部分時鐘和模擬電路;

?OFF:深度休眠,僅保留必要的電源。

4. mute函數:靜音控制

es8389_mute()實現ADC/DAC的靜音/取消靜音:

?靜音:設置ADC/DAC寄存器的靜音位;

?取消靜音:清除靜音位,同時恢復ADC使能和時鐘配置。

五、音頻數據流走向:從CPU到耳機/麥克風

ES8389的數據流分為播放(Playback采集(Capture兩條路徑,驅動通過DAPM路由定義了完整的數據流鏈路,以下結合流程圖詳解:

1.播放(Playback)數據流

wKgZO2mAHJKAIvS_AADAxNw8GbQ455.png

關鍵節點

?I2S INCPU通過I2S接口發送音頻數據到Codec

?DACL/DACR:數字音頻解碼為模擬信號

?OUT MUX:支持左右聲道交換(如DAC2→DAC1);

?HPOL/HPOR:最終輸出到耳機左/右聲道。

2.采集(Capture)數據流

wKgZO2mAHJKAUG5HAADJHHAuth4808.png

關鍵節點

?PGAL/PGAR:模擬信號前置放大(增益可通過寄存器0x72/0x73配置);

?ADC Mixer:支持DAC信號回灌到ADC(如音頻回環測試);

?ADC MUX:切換模擬麥克風(AMIC/數字麥克風(DMIC);

?I2S OUT:數字音頻數據通過I2S發送到CPU

六、總結與拓展

核心要點

1.框架依賴:驅動基于ASoC+I2C框架,遵循Linux音頻子系統的標準設計,適配性強;

2.時鐘核心:采樣率匹配的關鍵是coeff_div時鐘表,需確保MCLK與采樣率的匹配;

3.功耗管理:通過bias_level實現不同功耗等級的切換,平衡性能與功耗;

4.路由靈活DAPM路由支持混音、聲道交換、麥克風類型切換,滿足復雜音頻場景。

適配注意事項

1.設備樹需配置everest,mclk-src(時鐘源)、everest,dmic-enabledDMIC使能)等屬性;

2.不同硬件平臺的MCLK頻率不同,需確認coeff_div表中是否有匹配的時鐘參數;

3.Linux6.1內核下,ASoC框架的接口無重大變化,適配其他版本(如5.15/6.6)僅需微調寄存器配置。

如需獲取相關驅動,請評論區留言,需要適配其他Linux內核版本(如4.19/5.10),或定制音頻路由、功耗策略,可私信交流具體的修改方案。

wKgZO2mAHJKAPbmHAAANNC5Lq5E714.png

本文從驅動架構到數據流,完整拆解了ES8389音頻CodecLinux驅動實現,希望能幫助嵌入式開發者快速掌握這款芯片的驅動邏輯,解決實際開發中的音頻適配問題。

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

    關注

    88

    文章

    11758

    瀏覽量

    219006
  • 音頻芯片
    +關注

    關注

    3

    文章

    162

    瀏覽量

    18835
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux音頻開發必藏!這個官網藏著從驅動到應用的全套解決方案

    打開alsa-project.org,首先會被這句簡介擊中:"為 Linux 系統提供音頻與 MIDI 功能的核心架構"。作為 2.6 版本后 Linux 內核默認的
    的頭像 發表于 02-06 16:56 ?3068次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>音頻</b>開發必藏!這個官網藏著從<b class='flag-5'>驅動</b>到應用的全套解決方案

    拆解RK3568啟動日志:Debian12+Linux6.1下的調試密碼,初學者也能看懂

    在嵌入式開發中,啟動日志(Boot Log) 是硬件調試、驅動開發、系統優化的“第一手資料”。尤其是基于瑞芯微 RK3568(四核 A55,主打邊緣計算、物聯網設備)的方案,搭配 Debian12 系統與 Linux6.1 內核
    的頭像 發表于 02-06 16:52 ?2872次閱讀
    拆解RK3568啟動日志:Debian12+<b class='flag-5'>Linux6.1</b>下的調試密碼,初學者也能看懂

    初次編譯rk3568(rk3576)Linux 6.1內核踩坑記錄:從報錯終止到成功解決的完整流程

    很多剛接觸瑞芯微 rk 系列芯片開發的小伙伴,在初次編譯基于 Linux 6.1 內核的系統時,很容易因為環境依賴問題卡殼。最近我在編譯 rk3576(rk3568 流程類似)
    的頭像 發表于 02-06 16:47 ?2559次閱讀
    初次編譯rk3568(rk3576)<b class='flag-5'>Linux</b> <b class='flag-5'>6.1</b><b class='flag-5'>內核</b>踩坑記錄:從報錯終止到成功解決的完整流程

    ES7243E+ES8311音頻錄制與播放電路資料

    本電路為一款低成本音頻錄制與播放參考電路,含sch原理圖和pcb板圖。ES7243E接2路模擬麥克風實現音頻采集,ES8311接1路功放實現音頻
    發表于 02-04 17:18 ?1次下載

    RK3576+Android15+Linux6.1調試EM05 4G模塊全記錄:從底層到上層的踩坑與破局

    )服務。最近我們在 RK3576 開發板 + Android15 系統 + Linux6.1 內核 環境下調試EM05 4G 模塊 時,就遇到了從“RIL 起不來” 到 “庫缺失” 再到 “上層功能未開” 的一系列問題。今天就把完整的調試流程、踩過的坑和解決方案整理出來,
    的頭像 發表于 02-03 15:27 ?1474次閱讀
    RK3576+Android15+<b class='flag-5'>Linux6.1</b>調試EM05 4G模塊全記錄:從底層到上層的踩坑與破局

    保姆級教程!RK3588 Linux6.1?固件簽名完整實現方案(不含rootfs)

    ? ? ? 在嵌入式 Linux 開發中,固件簽名是保障設備安全的關鍵環節 —— 它能有效防止惡意固件篡改、非法刷入,從源頭筑牢設備的系統安全防線。最近在 RK3588 平臺( Linux6.1
    的頭像 發表于 01-14 17:21 ?1822次閱讀
    保姆級教程!RK3588 <b class='flag-5'>Linux6.1</b>?固件簽名完整實現方案(不含rootfs)

    探索TLE8082ES+TLE8080EM評估板:從硬件到軟件的深度解析

    探索TLE8082ES+TLE8080EM評估板:從硬件到軟件的深度解析 在電子工程師的日常工作中,評估板是驗證和開發新設計的重要工具。今天,我們將深入探討TLE8082ES+TLE8
    的頭像 發表于 12-21 15:50 ?695次閱讀

    Linux內核printk日志級別全解析:從參數解讀到實操配置

    一、開篇:一個命令引出的核心問題 在?Linux?終端執行?cat /proc/sys/kernel/printk,你可能會看到這樣的輸出: 這串數字不是隨機的,而是內核日志系統的“核心配置開關
    的頭像 發表于 11-20 15:54 ?1696次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>printk日志級別全<b class='flag-5'>解析</b>:從參數解讀到實操配置

    【免費送書】成為硬核Linux開發者:《Linux 設備驅動開發(第 2 版)》

    Linux系統的設備驅動開發,一直給人門檻較高的印象,主要因內核機制抽象、需深度理解硬件原理、開發調試難度大所致。2021年,一本講解驅動
    的頭像 發表于 11-18 08:06 ?1388次閱讀
    【免費送書】成為硬核<b class='flag-5'>Linux</b>開發者:《<b class='flag-5'>Linux</b> 設備<b class='flag-5'>驅動</b>開發(第 2 版)》

    【書籍評測活動NO.67】成為硬核Linux開發者:《Linux 設備驅動開發(第 2 版)》

    )。成為硬核Linux開發者Linux系統的設備驅動開發,一直給人門檻較高的印象,主要因內核機制抽象、需深度理解硬件原理、開發調試難度大所致
    發表于 11-17 17:52

    ES8311+音頻PA雙引擎,AirAUDIO_1010釋放聲音潛能!

    AirAUDIO_1010音頻配件板以ES8311為核心,搭配高效音頻PA,構建穩定、高保真的音頻鏈路。無論是高音通透還是低音渾厚,雙芯協作都能精準駕馭,釋放聲音的無限可能。 ? 一
    的頭像 發表于 08-28 13:04 ?1243次閱讀
    <b class='flag-5'>ES</b>8311+<b class='flag-5'>音頻</b>PA雙引擎,AirAUDIO_1010釋放聲音潛能!

    揭秘,瑞芯微全系擁抱Linux 6.1內核的底層邏輯

    近期,瑞芯微(Rockchip)基本完成了旗下產品Linux6.1BSP內核更新,引發了不小的行業熱議。除了低端RK3506依舊使用Buildroot構建系統外,RK3588、RK3576
    的頭像 發表于 05-16 08:31 ?1315次閱讀
    揭秘,瑞芯微全系擁抱<b class='flag-5'>Linux</b> <b class='flag-5'>6.1</b><b class='flag-5'>內核</b>的底層邏輯

    新品 | Module Audio,ES8388音頻交互模塊

    ModuleAudio是一款面向音頻交互的M5Stack擴展模塊,基于高性能的ES8388音頻編解碼方案,提供雙通道3.5mm音頻接口(TRS音頻
    的頭像 發表于 04-25 14:16 ?1506次閱讀
    新品 | Module Audio,<b class='flag-5'>ES</b>8388<b class='flag-5'>音頻</b>交互模塊

    杰理科技推出AC706N多功能音頻芯片

    音頻設備領域,芯片性能直接決定了產品的用戶體驗。杰理科技最新推出的AC706N多功能音頻芯片,憑借技術創新與場景化設計,再次刷新行業標準。該芯片
    的頭像 發表于 04-19 10:47 ?2172次閱讀

    樹莓派4 性能大比拼:標準Linux與實時Linux 4.19內核的延遲測試

    引言本文是對我之前關于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標準內核,以及應用了RT補丁的相似內核版本。對于實時版,我
    的頭像 發表于 03-25 09:39 ?809次閱讀
    樹莓派4 性能大比拼:標準<b class='flag-5'>Linux</b>與實時<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內核</b>的延遲測試