0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Rockchip Machine Driver选型指南:从“每块板子写驱动”到“只改几行配置”

jf_44130326 来源:Linux1024 2026-05-30 07:08 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

如果你做过嵌入式音频开发,一定经历过这种痛苦:硬件上只是换了一颗CODEC芯片,软件上却要重新写一个Machine DriverC代码+编译+调试),动辄一两天。更难受的是,这些驱动代码80%都是重复的——解析DTS、设置dai_link、注册声卡......

有没有办法把这些重复劳动消灭掉?有,而且Rockchip平台已经帮你铺好了三条路。

一、Machine Driver到底是干什么的?

用大白话说,Machine Driver"组装说明书"。它告诉内核:SoC的哪个音频接口I2S/SAI/PDM)连接了哪颗CODEC,它们之间用什么格式通信,谁提供时钟

CPU DAI(I2S/SAI)+ CODEC(ES8388/RK817)+MachineDriver=一个完整的声卡

没有这个"说明书"CPU DAI驱动和CODEC驱动就是两个独立的零件,谁也找不到谁。

wKgZPGoaHMqAHGeJAAJXajcIsjA761.png

二、三条路,按需求选

Rockchip平台目前主要提供三种Machine Driver方案:

方案

复杂度

适用场景

Simple Card

低(只改DTS

DAI +CODEC,绝大多数情况

Multi Codecs

DAI接多CODEC,带耳机检测/按键

HDMI Audio

HDMI/DP音频输出

下面逐一讲解。

三、Simple Card:最省心的"万能胶"

3.1它解决了什么痛点?

Simple Card出现之前,每适配一块新板子都要写独立的Machine Driver

板子A(I2S + ES8388)→ es8388_machine.c板子B(I2S + RT5645)→ rt5645_machine.c板子 C(SAI + 自定义 CODEC)→ 又得写一份......

有了Simple Card,内核框架帮你做了所有通用逻辑,你只需要在DTS里写几行配置,声卡就注册好了。不需要写一行C代码。

3.2最小DTS配置有多简单?

sound {  compatible ="simple-audio-card";  simple-audio-card,name ="rockchip-es8388";  simple-audio-card,format="i2s";  simple-audio-card,mclk-fs = <256>;  simple-audio-card,cpu {    sound-dai = <&i2s0>;   /* CPU 侧音频接口 */  };  simple-audio-card,codec {    sound-dai = <&es8388>;  /* CODEC 芯片 */  };};

就这几行,一个声卡就注册完成了。内核里的simple-card.c会自动解析这些属性,帮你完成以前需要手写的所有步骤。

3.3常用配置属性速查

属性

作用

示例值

format

DAI通信格式

"i2s""dsp_a""left_j"

mclk-fs

MCLK倍频

128256512

bitclock-master

BCLK由谁提供

<&cpu_dai><&codec_dai>

frame-master

LRCK由谁提供

同上

bitclock-inversion

BCLK反相

蓝牙音频常见

dai-tdm-slot-num

TDM Slot数量

8

dai-tdm-slot-width

每个Slot位宽

32

3.4主从模式怎么配?

最常见的情况:CPUMasterSoC产生时钟)

simple-audio-card,bitclock-master= <&cpu_dai>;simple-audio-card,frame-master= <&cpu_dai>;

特殊情况:CODECMaster(比如某些低延迟场景)

simple-audio-card,bitclock-master= <&codec_dai>;simple-audio-card,frame-master= <&codec_dai>;

配错主从关系,最直接的后果就是时钟对不上,声卡要么注册失败,要么播放出来的是杂音。

3.5一个实际例子:RK3576车载平台的三路声卡

/* 声卡 0:TDM 8 通道 */sound0 {  compatible ="simple-audio-card";  simple-audio-card,name ="rockchip,tdm";  simple-audio-card,format ="i2s";  simple-audio-card,mclk-fs = <256>;  simple-audio-card,cpu {    sound-dai = <&sai1>;    dai-tdm-slot-num = <8>;    dai-tdm-slot-width = <32>;  };  simple-audio-card,codec {    sound-dai = <&dummy_codec0>;  };};/* 声卡 1:低延迟播放(CODEC 为主时钟) */sound1 {  compatible ="simple-audio-card";  simple-audio-card,name ="rockchip,low-latency";  simple-audio-card,format ="i2s";  simple-audio-card,mclk-fs = <256>;  simple-audio-card,bitclock-master = <&dummy_clk1>;  simple-audio-card,frame-master = <&dummy_clk1>;  simple-audio-card,cpu {    sound-dai = <&sai4>;  }; dummy_clk1: simple-audio-card,codec {    sound-dai = <&dummy_codec1>;  };};/* 声卡 2:蓝牙音频(PCM 格式 + 时钟反相) */sound2 {  compatible ="simple-audio-card";  simple-audio-card,name ="rockchip,bt";  simple-audio-card,format ="dsp_a";  simple-audio-card,bitclock-inversion;  simple-audio-card,mclk-fs = <256>;  simple-audio-card,cpu {    sound-dai = <&sai2>;  };  simple-audio-card,codec {    sound-dai = <&bt_codec 1>;  };};

一块芯片上同时跑TDM、低延迟、蓝牙三路音频,每种场景的配置差异一目了然。

四、Multi Codecs:一个DAI驱动多个CODEC

4.1什么时候需要它?

Simple Card只能做到"一对一":一个DAI接一个CODEC。但产品经常有这样的需求:

同一个I2S既要接耳机CODEC,又要接扬声器功放

需要检测耳机插入/拔出,自动切换音频输出

耳机线上有按键(播放/暂停、音量加减)

需要支持ASRC异步采样率转换

这些需求Simple Card搞不定,需要用rockchip_multicodecs.c

4.2核心能力一览

功能

说明

Jack检测

GPIO中断+ ADC电压判断耳机/耳麦类型

ADC按键

通过ADC电压映射识别耳机线上的按键

extcon通知

通知Android系统耳机插拔事件

DAPM路由

耳机/扬声器/麦克风的动态电源管理

4.3 Jack检测是怎么工作的?

耳机插入 → GPIO 中断触发   读取 ADC 电压值       ├──0~222mV  → 普通耳机(无麦)       ├──223~1500mV→ 耳麦(带麦克风)       └── >1501mV  → 普通耳机   上报 Jack 状态 → 通知 Android → 启动按键轮询

原理很简单:不同阻抗的耳机会在检测引脚上产生不同的分压,驱动根据电压范围判断类型。这不是什么玄学,就是初中物理的分压电路。

4.4 DTS配置示例

multicodecs_sound: multicodecs-sound {  compatible ="rockchip,multicodecs-card";  rockchip,card-name ="rockchip-multicodecs";  rockchip,cpu = <&i2s0>;  rockchip,codec = <&es8388>, <&hdmi_codec>;  rockchip,mclk-fs = <256>; /* 耳机检测 GPIO */  rockchip,hp-det-gpio = <&gpio3 RK_PA5 GPIO_ACTIVE_LOW>;  rockchip,hp-ctl-gpio = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>;  rockchip,spk-ctl-gpio = <&gpio3 RK_PA7 GPIO_ACTIVE_HIGH>; /* ADC 按键配置 */  adc-keys{    compatible ="adc-keys";    io-channels = <&saradc 0>;    button-play {      label ="play";      linux,code = ;      press-threshold-microvolt = <100000>; /* 100mV */    };    button-volup {      label ="volume up";      linux,code = ;      press-threshold-microvolt = <300000>; /* 300mV */    };  };};

注意rockchip,codec后面可以跟多个phandle,这就是"一个DAI接多个CODEC"的关键。

五、HDMI Audio:音视频一体输出

5.1架构

HDMI音频和模拟音频最大的区别是:音频数据不是直接送给扬声器,而是先交给HDMI编码器,和画面打包后一起发出去。

SoCI2S/SAI → HDMI 编码器 → HDMI 线缆 → 显示器/TV 出声  │       │  │       └── hdmi-codec.c(通用 HDMI CODEC 驱动)  └── rockchip_hdmi.c(Rockchip HDMI Machine Driver)

5.2 DTS配置

hdmi_sound: hdmi-sound {  compatible ="rockchip,hdmi";  rockchip,mclk-fs = <128>;     /* HDMI 通常用 128 倍频 */  rockchip,card-name ="rockchip-hdmi";  rockchip,cpu = <&sai6>;  rockchip,codec = <&hdmi>;  rockchip,jack-det;        /* 启用 HDMI 热插拔检测 */};

DP音频的配置类似,只是倍频和接口不同:

dp0_sound: dp0-sound {  compatible ="rockchip,hdmi";  rockchip,mclk-fs = <512>;     /* DP 用 SPDIF,512 倍频 */  rockchip,card-name ="rockchip-dp0";  rockchip,cpu = <&spdif_tx3>;  rockchip,codec = <&dp0 1>;  rockchip,jack-det;};

六、DAPM路由:别把声音送错门

DAPMDynamic Audio Power Management)是ASoC的自动电源管理机制。Machine Driver通过audio-routing定义音频信号在芯片内部的走线:

sound {  simple-audio-card,audio-routing =   "Headphone","HPOL",   /* 左声道输出 → 耳机 */   "Headphone","HPOR",   /* 右声道输出 → 耳机 */   "Speaker","SPKLN",    /* 左声道 → 扬声器 */   "Speaker","SPKLP",    /* 右声道 → 扬声器 */   "MICBIAS","Main Mic",  /* 主麦克风需要偏置电压 */   "IN1P","Main Mic";    /* 麦克风信号输入 */};

注意格式:每一行都是"目标", "源"的顺序。目标通常是外部接口(Headphone/Speaker/Mic),源是CODEC内部的widget名称。

如果路由配错了,可能出现"播放正常但耳机没声""录音有信号但来源不对"等奇怪问题。排查时可以用这个命令查看DAPM状态:

cat/sys/kernel/debug/asoc/*/dapm/widget

七、三种方案怎么选?一张图说清楚

需求

推荐方案

普通播放/录制,单CODEC

Simple Card

要耳机检测+自动切换

Multi Codecs

耳机线上有按键

Multi Codecs

一个DAI同时接耳机+扬声器

Multi Codecs

需要ASRC采样率转换

Multi Codecs

HDMI/DP音频输出

HDMI Audio

TDM多通道音频

Simple Card(配TDM参数)

八、总结

Machine Driver的本质是"连接说明书"Rockchip平台通过三种方案覆盖了从最简单到较复杂的所有场景:

Simple Card90%的场景不再需要写C代码,改DTS就能适配新板子

Multi CodecsSimple Card基础上扩展了耳机检测、ADC按键、多CODEC支持

HDMI Audio专门处理音视频一体的输出场景

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    9648

    浏览量

    157855
  • 音频
    +关注

    关注

    31

    文章

    3254

    浏览量

    86587
  • Rockchip
    +关注

    关注

    0

    文章

    97

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【ELF 2学习板试用】05 ASoC中的machine class

    driver的开发widgets、route的定义、dailink的配置到最后的声卡注册。 2. DAI Link以及Machine Class初始化 DAI Link用于表示CP
    发表于 02-18 16:29

    BPS恒流驱动IC选型指南

    表格是晶丰明源LED恒流驱动IC 选型指南。大家可以了解一下。后续会发方案。如有需要的也可以加我QQ*** 获取样品和资料。向各位奋斗在工程领域的高手们致敬!
    发表于 10-18 14:11

    一个网页代码如何分成几行

    一个网页代码如何分成几行
    发表于 02-15 06:11

    分析一下Rockchip DRM的主驱动程序

    device_node *parent_np; struct drm_crtc *crtc; /* 申请一个DRM设备数据结构,对应驱动rockchip_drm_driver */ drm_dev
    发表于 05-17 15:01

    RK3288 Android6.0 Audio的ASOC驱动及数据结构分析

    驱动中处理。rk_i2s.c:Platform下的cpu dai driver,不包含和板子相关的控制,和平台相关,因为I2S控制器是一定的。rk_pcm.c:Platform
    发表于 11-01 17:16

    Rockchip Linux SDK uboot logo开发指南

    arm嵌入式vs-rk3399 板卡uboot logo 开发指南概述:本文档主要介绍 rockchip linux sdk uboot logo 显示的相关功能、配置以及开发过程中的注意事项。适用于 rockhip linux
    发表于 10-09 08:12

    Rockchip i2c开发指南

    视壮嵌入式板卡rk3399《rockchip i2c 开发指南 v1.0》分享i2c设备的设备应用非常广泛,常见的包含重力传感器,触摸屏驱动芯片,音频解码等,这个文档是rk3399的i2c开发文档:《
    发表于 10-10 08:17

    电机驱动开发学习板选型指南

    电机驱动开发学习板选型指南,有需要的朋友下来看看。
    发表于 01-12 18:29 0次下载

    Rockchip处理器路线图及芯片选型

    Rockchip处理器路线图及芯片选型
    发表于 06-02 10:21 19次下载

    Rockchip PCBA测试开发指南_1.08

    Rockchip PCBA测试开发指南_1
    发表于 02-18 15:39 12次下载

    Rockchip RKDevInfoWriteTool工具及使用指南

    电子发烧友网站提供《Rockchip RKDevInfoWriteTool工具及使用指南.7z》资料免费下载
    发表于 09-21 09:26 39次下载
    <b class='flag-5'>Rockchip</b> RKDevInfoWriteTool工具及使用<b class='flag-5'>指南</b>

    RK平台UART开发!驱动配置测试全流程

    完善的 UART 开发支持,本文将结合官方开发指南功能特点、驱动配置、测试验证三个维度,带大家快速掌握 RK 平台 UART 开发技巧,文末还附上知识脑图方便梳理思路~
    的头像 发表于 02-04 17:44 2293次阅读
    RK平台UART开发!<b class='flag-5'>从</b><b class='flag-5'>驱动</b><b class='flag-5'>配置</b><b class='flag-5'>到</b>测试全流程

    RK 平台 SPI 开发完全指南驱动 + 配置 + 测试 + 优化)

    Linux 平台 SPI 驱动已形成完善的开发体系,支持 Master/Slave 双模式、多速率适配及灵活配置。本文基于 Rockchip 官方开发指南
    的头像 发表于 01-30 22:35 1483次阅读
    RK 平台 SPI 开发完全<b class='flag-5'>指南</b>(<b class='flag-5'>驱动</b> + <b class='flag-5'>配置</b> + 测试 + 优化)

    深入解析Rockchip SFC驱动:SPI Flash传输流程与问题排查指南

    Controller)驱动 (spi-rockchip-sfc.c),用于高效管理SPI Flash的读写传输。本文基于Linux内核驱动代码与Rockchip官方开发
    的头像 发表于 02-04 07:13 988次阅读
    深入解析<b class='flag-5'>Rockchip</b> SFC<b class='flag-5'>驱动</b>:SPI Flash传输流程与问题排查<b class='flag-5'>指南</b>

    大电流功率电感选型指南参数、结构应用,工程师必看

    电源电感选型指南
    的头像 发表于 03-03 15:52 723次阅读