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

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

3天内不再提示

RK平台新声卡添加与驱动调试指南

jf_44130326 来源:Linux1024 2026-02-09 16:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

瑞芯微RK)平台的嵌入式系统开发中,音频功能的实现核心依赖于Sound Card(声卡)的正确配置与驱动调试。声卡作为连接硬件音频编解码器Codec)与系统上层应用的桥梁,其添加流程涉及硬件适配、驱动开发、系统配置等多个环节,而新驱动的调试则需要针对性解决注册、通路、硬件兼容等问题。本文基于RK平台音频技术文档,详细拆解声卡添加步骤与驱动的调试方法,为开发人员提供实操指引。

wKgZO2kah4mAXx3kAAD2NK8eTsY767.png

一、RK平台声卡添加核心流程

RK平台声卡的添加需遵循硬件适配-驱动配置-系统映射的逻辑,核心围绕Codec芯片与系统的软硬件联动实现,具体步骤如下:

(一)硬件层面认知与适配

声卡的硬件基础是CodecCPU通信架构,需先明确核心硬件连接逻辑:

1.核心通信接口CodecCPU通过两类总线交互——I2C总线负责寄存器读写(配置音量、通路切换等),数字音频接口DAI)负责音频数据传输,支持I2SPCMAC97等格式,其中I2S是最常用的立体声传输格式。

2.扩展接口支持蓝牙音频通过UART接口(立体声播放)或I2S接口(通话SCO通路)连接;SPDIF通过光纤/同轴传输,保障高清音频质量;7.1声道输出需占用4I2S数据线(I2S0_SDO0~SDO3),主要用于HDMI输出。

3.硬件电路确认:需确保Codec供电正常、GPIO(如耳机检测引脚)连接正确、I2S时钟MCLK/BCLK/LRCLK信号稳定,避免因硬件链路问题导致后续驱动调试受阻。

(二)驱动层配置:DTS资源定义

设备树(DTS)是RK平台硬件资源的核心描述文件,添加声卡需先在DTS中完成Codec与总线的关联配置,以常用Codec芯片ES8323为例:

1.Codec节点声明:在DTS中定义Codec设备,指定兼容属性、DAI接口参数(格式、控制器):

rockchip-es8323{  compatible ="rockchip-es8323";// 与驱动中compatible匹配  dais{    dai0{      audio-codec = <&es8323>;      i2s-controller = <&i2s>;// 绑定I2S控制器      format ="i2s";// 音频格式,支持i2s/pcm/ac97     // 可选配置:continuous-clock、bitclock-master等    };  };};

1.I2C总线配置Codec通常为I2C设备,需在对应I2C控制器节点下添加Codec地址与兼容属性:

&i2c3 {  status ="okay";  es8388: es8388@10{    status ="okay";   #sound-dai-cells =<0>;    compatible ="everest,es8388","everest,es8323";    reg = <0x10>;    clocks = <&mclkout_sai1>;    clock-names ="mclk";    assigned-clocks = <&mclkout_sai1>;    assigned-clock-rates = <12288000>;    pinctrl-names ="default";    pinctrl-0= <&sai1m0_mclk>;  };};

1.关键参数说明:需确保compatible属性与驱动代码完全一致,DAI格式与Codec支持的模式匹配(主从模式、时钟极性等),否则会导致设备无法识别。

(三)驱动开发:MachineCodec驱动实现

RK平台音频驱动遵循ALSA SoC架构,分为MachinePlatformCodec三层,其中Platform驱动(如I2S控制器驱动)由RK原厂提供,开发重点为MachineCodec驱动:

1.Machine驱动:耦合PlatformCodec

核心功能:负责绑定CodecPlatform驱动,配置采样率、时钟等全局参数,注册声卡设备。

关键代码框架:

// 匹配DTS节点staticconststructof_device_id rockchip_es8323_of_match[] = {  { .compatible ="rockchip-es8323", },  {},};MODULE_DEVICE_TABLE(of, rockchip_es8323_of_match);// DAI链路配置(关联Codec与I2S控制器)staticstructsnd_soc_dai_link rk29_dai = {  .name ="ES8323",  .stream_name ="ES8323 PCM",  .codec_dai_name ="ES8323 HiFi",// 与Codec DAI名称匹配  .ops = &rk29_ops,// 包含hw_params等回调};// 声卡注册staticstructsnd_soc_card rockchip_es8323_snd_card = {  .name ="RK_ES8323",// 声卡名称,HAL层通过该名称匹配配置  .dai_link = &rk29_dai,  .num_links =1,};// 探针函数:初始化并注册声卡staticintrockchip_es8323_audio_probe(structplatform_device *pdev){ structsnd_soc_card *card = &rockchip_es8323_snd_card;  card->dev = &pdev->dev; returnsnd_soc_register_card(card);// 核心注册接口}

1.Codec驱动:实现硬件控制逻辑

核心功能:通过I2C读写Codec寄存器,实现音频通路切换、音量控制、DAI接口适配等。

关键代码框架:

// I2C驱动注册(Codec为I2C设备)staticstructi2c_driver es8323_i2c_driver = {  .driver = {    .name ="ES8323",// 与Machine驱动中codec_dai_name匹配    .owner = THIS_MODULE,  },  .probe = es8323_i2c_probe,// 初始化Codec  .id_table = es8323_i2c_id,};// DAI驱动配置(定义音频流参数)staticstructsnd_soc_dai_driver es8323_dai = {  .name ="ES8323 HiFi",// 与Machine DAI链路名称一致  .playback = {    .channels_min =1,    .channels_max =2,    .rates = es8323_RATES,// 支持的采样率    .formats = es8323_FORMATS,// 支持的音频格式  },  .capture = {/* 录音参数配置,与播放类似 */},  .ops = &es8323_ops,// 包含startup、shutdown等回调};// 注册Codec与DAIstaticintes8323_i2c_probe(structi2c_client *i2c,conststructi2c_device_id *id){ returnsnd_soc_register_codec(&i2c->dev, &soc_codec_dev_es8323, &es8323_dai,1);}

(四)HAL层配置:音频通路映射

Android系统上层通过HAL层(tinyalsa_hal)与ALSA驱动交互,需确保HAL层能识别新声卡并映射正确的音频通路:

1.声卡名称匹配HAL层通过sound_card_name匹配对应的路由表(route table),需在alsa_sound_card_config中添加新声卡配置:

structalsa_sound_card_config sound_card_config_list[] = {  {    .sound_card_name ="RK_ES8323",// 与Machine驱动中声卡名称一致    .route_table = &es8323_config_table,// 自定义路由表或使用默认  }, /* 其他声卡配置 */};

1.路由表配置:路由表定义了音频设备(喇叭、耳机、蓝牙)与Codec寄存器的映射关系,若无需自定义,可直接使用default_config.h,复杂场景需编写专属xxx_config.h,实现通路切换逻辑。

二、新声卡驱动调试方法

驱动开发完成后,需通过分层调试定位问题,核心围绕设备注册-通路连通-硬件验证三个核心环节展开:

(一)第一步:验证声卡注册状态

声卡注册是驱动正常工作的前提,需通过内核日志确认注册结果:

1.查看内核日志:通过dmesg或内核日志文件筛选ALSA相关信息,若出现以下日志,说明声卡注册成功:

<6>[ 2.729318] ALSA device list:<6>[ 2.729320]#0: RK_ES8323

1.注册失败排查

若日志中无声卡信息,检查DTScompatible属性与驱动是否一致;

确认I2C总线状态(status = "okay")与Codec从地址是否正确;

检查Machine驱动与Codec驱动的DAI名称是否匹配(大小写敏感)。

(二)第二步:确认音频通路(Route)正常

音频通路负责将上层音频请求映射到Codec硬件通路,需验证通路切换的正确性:

1.查看Route日志:使用logcat -s alsa_route命令打印通路切换日志,示例如下:

D/alsa_route(90): route_set_controls() set route0// SPEAKER_NORMAL_ROUTED/alsa_route(90): route_set_controls() set route24// PLAYBACK_OFF_ROUTE

日志中route值对应alsa_audio.h定义的通路枚举(如0代表喇叭正常播放,24代表播放关闭),需确认操作音频设备时(如插耳机、播放音乐)Route能正确切换。

1.常见Route错误排查

耳机/喇叭切换异常:通过cat sys/class/switch/h2w/state查看耳机检测状态(0 =无耳机,1 =MIC耳机,2 =MIC耳机),若状态异常,检查耳机检测GPIO电平变化或ADC配置(3.10内核后需在DTS中配置rockchip_headset节点);

多声卡切换问题(HDMI/USB音频):HDMI默认对应card1route=28),USB音频对应card24.4 SDK)或card35.1+ SDK),若切换失败,可修改WiredAccessoryManager.java屏蔽HDMI音频自动切换;

通路无声音但Route正常:需验证Codec寄存器配置,通过以下命令打印寄存器值,与正常设备对比:

# 示例(根据实际声卡名称调整路径)catsys/kernel/debug/asoc/RK_ES8323/es8323.4-0010/codec_reg

若寄存器值不一致,通过echo 'reg value' >上述路径手动修改,验证是否为配置问题。

(三)第三步:硬件与驱动细节调试

1.Codec寄存器调试

寄存器是Codec功能的核心配置载体,若音频功能异常(如无声音、杂音),优先对比正常设备与故障设备的寄存器值,重点关注通路使能、音量、采样率相关寄存器;

若需修改寄存器默认配置,可在Codec驱动的startup回调中添加初始化代码,或通过HAL层路由表配置。

1.特殊问题处理

POP音问题:喇叭上电时的POP音可通过添加Mute电路或延时开启功放解决,在驱动中配置SPK_AMP_DELAY(喇叭功放延时)、HP_MOS_DELAY(耳机MOS管延时);

音量不足:若Codec支持ALC(自动增益控制)功能,可联系Codec厂商FAE开启,或获取ALC功能补丁;

降噪算法:默认开启Speex开源降噪算法,若需关闭(如固定频率信号录制),修改HAL层宏定义:

// 4.4 SDK:hardware/rk29/audio/AudioHardware.h#define SPEEX_DENOISE_ENABLE 0// 5.1+ SDK:hardware/rockchip/audio/tinyalsa_hal/audio_hw.c/*#define SPEEX_DENOISE_ENABLE */

1.Codec驱动快速适配

Codec功能简单(无复杂通路切换),可直接复用RK平台HDMI I2S驱动(SND_RK_SOC_HDMI_I2S),仅需配置DTS与基础寄存器;

复杂Codec(如ALC3224)需编写专属路由表(xxx_config.h),并联系Codec厂商提供寄存器配置文档。

(四)第四步:上层应用验证

驱动调试完成后,需通过上层工具验证音频功能:

1.使用tinyalsa工具测试RK平台提供tinycap(录音)、tinyplay(放音)工具,直接操作ALSA驱动,验证基础功能:

# 播放WAV文件(需匹配采样率、格式)tinyplaytest.wav -D0-d0# 录音(保存为record.wav)tinycaprecord.wav -D0-d0-r48000-b16-c2

1.Android应用测试:通过音乐播放器、通话功能验证喇叭、耳机、麦克风的正常工作,确保上层应用与HAL层、驱动的通路映射无误。

三、核心总结

RK平台添加声卡与调试新Sound Card驱动,需遵循硬件适配-驱动配置-分层调试的思路:

1.硬件层面需明确CodecCPU的通信接口,确保电路连接正常;

2.驱动层面核心是DTS资源配置、MachineCodec驱动的匹配,尤其是名称一致性(compatibleDAI名称、声卡名称);

3.调试层面优先验证设备注册与通路切换,再通过寄存器对比、硬件信号检测定位深层问题;

4.充分利用RK平台提供的工具(tinyalsasysfs接口)与文档,复杂问题可结合厂商支持(Codec FAERK技术文档)高效解决。

通过以上步骤,可实现新声卡的快速集成与稳定运行,满足嵌入式系统的音频功能需求。

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

    关注

    41

    文章

    3841

    浏览量

    134052
  • 调试
    +关注

    关注

    7

    文章

    654

    浏览量

    36056
  • 瑞芯微
    +关注

    关注

    27

    文章

    901

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    BSP调试#08:Audio(RK3588)

    本合集的是我当初调试 RK3588 平台时的 原始笔记 ——只保留了那些踩过坑的问题接口,没出过问题的内容全删掉了。文章框架如下: 其中, “调试过程” 章节可能有点意思(记录了我踩过
    的头像 发表于 05-09 10:44 7294次阅读
    BSP<b class='flag-5'>调试</b>#08:Audio(<b class='flag-5'>RK</b>3588)

    如何在RK3399平台上增加一款自己的声卡设备

    ES7210是什么?ES8156又是什么?分别有何功能?如何在RK3399平台上增加一款自己的声卡设备?
    发表于 02-17 06:27

    RK3188 5.1平台上如何对PCM2708 USB的声卡进行调试

    RK3188 5.1平台上如何对PCM2708 USB的声卡进行调试呢?有哪些调试步骤?
    发表于 02-18 06:02

    如何对基于RK3288平台的Simple card声卡进行调试

    基于RK3288平台的Simple card声卡该怎样去添加呢?如何对基于RK3288平台的Si
    发表于 03-03 08:17

    如何调试rk3308平台上wifi驱动

    如何调试rk3308平台上wifi驱动
    发表于 03-09 07:45

    rk3399声卡调试及其配置步骤有哪些呢

    rk3399声卡调试可以通过查看 cat /proc/asound/cards 找到已经在dts中配置好的声卡一、声卡配置项正常情况下,如果
    发表于 05-17 11:45

    RK系列开发板音频驱动适配指南(四)

    RK系列开发板音频驱动适配指南(一)RK系列开发板音频驱动适配指南(二)
    发表于 10-13 09:20

    Banana Pi BPI-W3 RK3588平台驱动调试篇 [ PCIE篇二 ] - PCIE的开发指南

    Banana Pi BPI-W3 RK3588平台驱动调试篇 [ PCIE篇 ] - PCIE的开发指南(二)
    的头像 发表于 11-02 09:24 2259次阅读
    Banana Pi BPI-W3 <b class='flag-5'>RK</b>3588<b class='flag-5'>平台</b><b class='flag-5'>驱动</b><b class='flag-5'>调试</b>篇 [ PCIE篇二 ] - PCIE的开发<b class='flag-5'>指南</b>

    声卡驱动怎么装在电脑上 声卡驱动掉了怎么解决

    声卡驱动在电脑上起着至关重要的作用,它负责处理音频信号,使我们能够听到各种声音和音乐。然而,有时候声卡驱动可能会出现问题,例如掉失或损坏,这将导致我们无法正常听声音。本文将详细介绍如何
    的头像 发表于 01-23 16:43 5746次阅读

    RK3568驱动指南驱动基础进阶篇-进阶7 向系统中添加一个系统调用

    RK3568驱动指南驱动基础进阶篇-进阶7 向系统中添加一个系统调用
    的头像 发表于 05-21 14:15 874次阅读
    <b class='flag-5'>RK</b>3568<b class='flag-5'>驱动</b><b class='flag-5'>指南</b>|<b class='flag-5'>驱动</b>基础进阶篇-进阶7 向系统中<b class='flag-5'>添加</b>一个系统调用

    RK3568驱动指南|第十二篇 GPIO子系统-第130章 GPIO的调试方法

    RK3568驱动指南|第十二篇 GPIO子系统-第130章 GPIO的调试方法
    的头像 发表于 06-03 11:32 1562次阅读
    <b class='flag-5'>RK</b>3568<b class='flag-5'>驱动</b><b class='flag-5'>指南</b>|第十二篇 GPIO子系统-第130章 GPIO的<b class='flag-5'>调试</b>方法

    迅为RK3568 重制版RK3568驱动指南全面升级

    迅为RK3568 重制版RK3568驱动指南全面升级
    的头像 发表于 07-28 15:25 3933次阅读
    迅为<b class='flag-5'>RK</b>3568 重制版<b class='flag-5'>RK</b>3568<b class='flag-5'>驱动</b><b class='flag-5'>指南</b>全面升级

    RK平台声卡基础知识总结(基于ALSA框架)

    RK 平台声卡基于ALSA(Advanced Linux Sound Architecture)框架构建,核心目标是实现音频数据的“采集 - 传输 - 处理 - 输出” 全链路管理。其本质是通过
    的头像 发表于 02-06 16:58 3700次阅读
    <b class='flag-5'>RK</b><b class='flag-5'>平台</b><b class='flag-5'>声卡</b>基础知识总结(基于ALSA框架)

    RK Android平台音频调试指南:从基础到实战,解决多设备输出、声卡异常等核心问题

    在 Android 开发中,音频模块的调试往往是 “老大难”—— 多声卡无法区分、多设备同时输出没声音、HDMI 录音崩溃… 这些问题不仅影响用户体验,还会消耗大量开发时间。
    的头像 发表于 02-06 16:48 3371次阅读
    <b class='flag-5'>RK</b> Android<b class='flag-5'>平台</b>音频<b class='flag-5'>调试</b><b class='flag-5'>指南</b>:从基础到实战,解决多设备输出、<b class='flag-5'>声卡</b>异常等核心问题

    深入解析RK平台GPIO驱动:从原理到调试,开发者必看指南

    平台上,GPIO 驱动的实现直接影响着硬件交互的稳定性与效率。本文将带你深入剖析 RK 平台 GPIO 驱动的核心逻辑、使用方法,以及对
    的头像 发表于 02-03 15:53 1398次阅读
    深入解析<b class='flag-5'>RK</b><b class='flag-5'>平台</b>GPIO<b class='flag-5'>驱动</b>:从原理到<b class='flag-5'>调试</b>,开发者必看<b class='flag-5'>指南</b>