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

    文章

    11854

    浏览量

    219825
  • 音频芯片
    +关注

    关注

    3

    文章

    175

    浏览量

    18946
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    openKylin受邀参加Linux内核领域顶级技术峰会

    近日,Linux内核领域顶级技术峰会——LSF/MM/BPF 2026在克罗地亚萨格勒布举行。大会聚焦Linux内核存储、文件系统、内存管理以及BPF等关键技术方向,吸引了来自全球开源
    的头像 发表于 05-14 11:08 533次阅读

    安森美ES3A - ES3J快速整流器:设计与应用解析

    安森美ES3A - ES3J快速整流器:设计与应用解析 作为电子工程师,在设计电路时,整流器是不可或缺的组件。今天,我们来深入了解安森美(onsemi)的ES3A -
    的头像 发表于 05-12 14:05 173次阅读

    安森美Fast Rectifiers ES1F - ES1J:高性能快速整流器解析

    安森美Fast Rectifiers ES1F - ES1J:高性能快速整流器解析 在电子设计领域,整流器是不可或缺的基础元件,其性能直接影响到整个电路的效率和稳定性。安森美(onsemi
    的头像 发表于 05-12 14:00 143次阅读

    onsemi ES2A - ES2D 快速整流器:设计与性能解析

    onsemi ES2A - ES2D 快速整流器:设计与性能解析 在电子设计领域,整流器是不可或缺的基础元件,其性能直接影响到整个电路的效率和稳定性。今天,我们就来深入探讨 onsemi 公司推出
    的头像 发表于 05-12 13:55 164次阅读

    Linux Kernel 6.1 tools目录全解析 | RK平台ARM64交叉编译实战指南

    、硬件测试等全场景能力。 本文完整拆解 Linux Kernel 6.1 tools 目录所有模块功能,并给出 RK 平台 ARM64 架构交叉编译的标准指令 ,一站式解决内核工具使用与编译问题,适合
    的头像 发表于 04-16 18:42 7767次阅读
    <b class='flag-5'>Linux</b> Kernel <b class='flag-5'>6.1</b> tools目录全<b class='flag-5'>解析</b> | RK平台ARM64交叉编译实战指南

    如何理解Linux内核中的PCIe驱动

    各异的芯片组,加上各种 PCI 设备自身独特的功能需求,Linux 内核中的 PCI 支持远比我们希望的要复杂得多。今天这篇文章,我们将从驱动开发的视角,梳理
    的头像 发表于 04-11 17:22 1403次阅读

    RK3576+ES8388音频开发:tinymix控件全解析

    无从下手,尤其不知道如何结合硬件原理图精准配置。本文将全面解析这些控件的含义,并手把手教你基于原理图的配置方法。 一、tinymix基础认知 tinymix是Linux下操作ALSA音频混音器(Mixer
    的头像 发表于 03-10 08:03 6914次阅读
    RK3576+<b class='flag-5'>ES</b>8388<b class='flag-5'>音频</b>开发:tinymix控件全<b class='flag-5'>解析</b>

    Linux音频开发必藏!这个官网藏着从驱动到应用的全套解决方案

    打开alsa-project.org,首先会被这句简介击中:"为 Linux 系统提供音频与 MIDI 功能的核心架构"。作为 2.6 版本后 Linux 内核默认的
    的头像 发表于 02-06 16:56 3288次阅读
    <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 3429次阅读
    拆解RK3568启动日志:Debian12+<b class='flag-5'>Linux6.1</b>下的调试密码,初学者也能看懂

    初次编译rk3568(rk3576)Linux 6.1内核踩坑记录:从报错终止到成功解决的完整流程

    很多刚接触瑞芯微 rk 系列芯片开发的小伙伴,在初次编译基于 Linux 6.1 内核的系统时,很容易因为环境依赖问题卡壳。最近我在编译 rk3576(rk3568 流程类似)
    的头像 发表于 02-06 16:47 3455次阅读
    初次编译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 4次下载

    RK3576+Android15+Linux6.1调试EM05 4G模块全记录:从底层到上层的踩坑与破局

    )服务。最近我们在 RK3576 开发板 + Android15 系统 + Linux6.1 内核 环境下调试EM05 4G 模块 时,就遇到了从“RIL 起不来” 到 “库缺失” 再到 “上层功能未开” 的一系列问题。今天就把完整的调试流程、踩过的坑和解决方案整理出来,
    的头像 发表于 02-03 15:27 3750次阅读
    RK3576+Android15+<b class='flag-5'>Linux6.1</b>调试EM05 4G模块全记录:从底层到上层的踩坑与破局

    保姆级教程!RK3588 Linux6.1 固件签名完整实现方案(不含rootfs)

          在嵌入式 Linux 开发中,固件签名是保障设备安全的关键环节 —— 它能有效防止恶意固件篡改、非法刷入,从源头筑牢设备的系统安全防线。最近在 RK3588 平台( Linux6.1
    的头像 发表于 01-14 17:21 2450次阅读
    保姆级教程!RK3588 <b class='flag-5'>Linux6.1</b> 固件签名完整实现方案(不含rootfs)

    探索TLE8082ES+TLE8080EM评估板:从硬件到软件的深度解析

    探索TLE8082ES+TLE8080EM评估板:从硬件到软件的深度解析 在电子工程师的日常工作中,评估板是验证和开发新设计的重要工具。今天,我们将深入探讨TLE8082ES+TLE8
    的头像 发表于 12-21 15:50 1047次阅读

    【免费送书】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    Linux系统的设备驱动开发,一直给人门槛较高的印象,主要因内核机制抽象、需深度理解硬件原理、开发调试难度大所致。2021年,一本讲解驱动
    的头像 发表于 11-18 08:06 1953次阅读
    【免费送书】成为硬核<b class='flag-5'>Linux</b>开发者:《<b class='flag-5'>Linux</b> 设备<b class='flag-5'>驱动</b>开发(第 2 版)》