当前位置: 首页 > news >正文

rk3576 sai tdm调试

RK3576 SAI TDM 调试

  • 驱动
  • HAL 层
    • SO 修改
    • SO 编译
    • audio_policy_configuration.xml修改
    • 调试&验证
      • 调试信息
      • 抓取送往驱动前的原始数据
      • dumpsys

配置 SAI1 输出 16 声道数据

驱动

采用外挂 DSP 的方案,只管输出数据就行

---a/common/kernel-6.1/arch/arm64/boot/dts/rockchip/xxx.dtsi+++b/common/kernel-6.1/arch/arm64/boot/dts/rockchip/xxx.dtsi @@-91,8+91,37@@ regulator-min-microvolt=<12000000>;regulator-max-microvolt=<12000000>;};+++dummy_codec:dummy-codec{+status="okay";+compatible="rockchip,dummy-codec";+#sound-dai-cells=<0>;+};++vehicle_adsp_sound:vehicle-adsp-sound{+status="okay";+compatible="simple-audio-card";+simple-audio-card,name="rockchip,tdm";+simple-audio-card,format="dsp_b";+simple-audio-card,mclk-fs=<512>;+simple-audio-card,cpu{+sound-dai=<&sai1>;+dai-tdm-slot-num=<16>;+dai-tdm-slot-width=<32>;+};+simple-audio-card,codec{+sound-dai=<&dummy_codec>;+};+};};+&es8388_sound{+status="disabled";+};

HAL 层

SO 修改

源码路径:hardware/rockchip/audio/tinyalsa_hal/audio_hw.c

---a/common/hardware/rockchip/audio/tinyalsa_hal/audio_hw.c+++b/common/hardware/rockchip/audio/tinyalsa_hal/audio_hw.c @@-92,6+92,16@@staticstructpcm_configpcm_config={.format=PCM_FORMAT_S16_LE,};++staticstructpcm_configpcm_config_16ch_out={+.channels=16,+.rate=48000,+.period_size=1024,+.period_count=4,+.format=PCM_FORMAT_S16_LE,+};++staticstructpcm_configpcm_config_in={#ifPCM_REFERENCE_CHANNELS.channels=PCM_CAPTURE_CHANNELS+PCM_REFERENCE_CHANNELS,@@-651,7+661,8@@structdev_proc_infoSPEAKER_OUT_NAME[]=/* add codes& dai name here*/{"rockchiprt5670c",NULL,},{"rockchiprt5672c",NULL,},{"rockchipaw882xx",NULL,},-{"rk3528acodec",NULL},+{"rk3528acodec",NULL,},+{"rockchiptdm",NULL,},{NULL,NULL},/* Note! Must end with NULL, else will cause crash */};@@-4200,8+4218,18@@staticintadev_open_output_stream(structaudio_hw_device*dev,type=OUTPUT_LOW_LATENCY;}-ALOGD("out->config.rate = %d, out->config.channels = %d out->config.format = %d",-out->config.rate,out->config.channels,out->config.format);++if(devices==AUDIO_DEVICE_OUT_SPEAKER){+ALOGE("speaker out 16 chn");+out->supported_channel_masks[0]=AUDIO_CHANNEL_OUT_5POINT1;+out->supported_channel_masks[1]=AUDIO_CHANNEL_INDEX_MASK_16;+out->config=pcm_config_16ch_out;+out->channel_mask=AUDIO_CHANNEL_INDEX_MASK_16;//AUDIO_CHANNEL_OUT_9POINT1POINT6;+}++ALOGE("out->config.rate = %d, out->config.channels = %d out->config.format = %d, config->channel_mask = 0x%x",+out->config.rate,out->config.channels,out->config.format,config->channel_mask);out->stream.common.get_sample_rate=out_get_sample_rate;out->stream.common.set_sample_rate=out_set_sample_rate;@@-5098,6+5126,7@@staticvoidadev_open_init(structaudio_device*adev)charvalue[PROPERTY_VALUE_MAX];if(property_get("vendor.audio.period_size",value,NULL)>0){pcm_config.period_size=atoi(value);+pcm_config_16ch_out.period_size=pcm_config.period_size;pcm_config_in.period_size=pcm_config.period_size;}if(property_get("vendor.audio.in_period_size",value,NULL)>0)

SO 编译

source build/envsetup.sh lunch rk3576s_u-userdebug mmm hardware/rockchip/audio/tinyalsa_hal/adb-d root adb-d remount adb-d push audio.primary.rk30board.so/vendor/lib/hw/adb-d reboot

audio_policy_configuration.xml修改

源码路径:device/rockchip/common/audio_policy_configuration_singlehal.xml

diff--git a/device/rockchip/common/audio_policy_configuration_singlehal.xml b/device/rockchip/common/audio_policy_configuration_singlehal.xml index eba2888f797..d43adf27793100644---a/device/rockchip/common/audio_policy_configuration_singlehal.xml+++b/device/rockchip/common/audio_policy_configuration_singlehal.xml @@-28,7+28,7@@<mixPorts><mixPort name="primary output"role="source"flags="AUDIO_OUTPUT_FLAG_PRIMARY"><profile name=""format="AUDIO_FORMAT_PCM_16_BIT"-samplingRates="44100 48000"channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>+samplingRates="44100 48000"channelMasks="AUDIO_CHANNEL_INDEX_MASK_16"/></mixPort><mixPort name="spdif_passthrough"role="source"flags="AUDIO_OUTPUT_FLAG_DIRECT">

调试&验证

调试信息

部分调试信息不显示,可以执行logcat -G 64M增大 log 缓冲区

logcat-s modules.primary.audio_hal

抓取送往驱动前的原始数据

vendor.audio.record指定抓取多少 MB

rm/data/misc/audioserver/debug.pcm mkdir-p/data/misc/audioserver/touch/data/misc/audioserver/debug.pcm setprop vendor.audio.record5chmod777-R/data/misc/audioserver setenforce0du-h/data/misc/audioserver/adb-d pull/data/misc/audioserver/debug.pcm adb-d root adb-d remount adb-d push audio_policy_configuration_singlehal.xml/vendor/etc/adb-d shell sync adb-d shell stop adb-d shell start

抓取原始数据后使用Audacity 进行播放(文件 -> 导入 -> 原始数据 -> 根据播放的音源设置

dumpsys

dumpsys media.audio_flinger可以查看送往hal层的数据格式

Output thread0xb400007f6c7958f0,name AudioOut_D,tid3147,type0(MIXER):I/O handle:13Standby:no Sample rate:48000Hz HAL frame count:960HAL format:0x1(AUDIO_FORMAT_PCM_16_BIT)HAL buffer size:30720bytes Channel count:16Channel mask:0x8000ffff(index mask,bits:0xffff)Processing format:0x1(AUDIO_FORMAT_PCM_16_BIT)Processing frame size:32bytes Pending config events:none Output devices:0x2(AUDIO_DEVICE_OUT_SPEAKER)Input device:0(AUDIO_DEVICE_NONE)Audio source:0(AUDIO_SOURCE_DEFAULT)Timestamp stats:n=2328disc=1cold=0nRdy=0err=3rate=1jitterMs(ave=6.18763e-06std=0.0178616min=-0.0625277max=0.0458923)localSR(48000,3.60454e-11)correctedJitterMs(ave=-1.70485e-07std=0.00835348min=-0.022509max=0.0245337)Timestamp corrected:no Last writeoccurred(msecs):32

dumpsys media.audio_policy可以查看当生效的配置文件

...Config source:/vendor/etc/audio_policy_configuration_singlehal.xml...

以及配置的输出格式

Hardwaremodules(4):1.Handle:10;"primary"-OutputMixPorts(3):1."primary output";0x0002(AUDIO_OUTPUT_FLAG_PRIMARY)-Profiles(1):1."";AUDIO_FORMAT_PCM_16_BIT(0x1)sampling rates:44100,48000channel masks:0x8000ffffAUDIO_ENCAPSULATION_TYPE_NONE
http://www.jsqmd.com/news/864448/

相关文章:

  • NotebookLM可信度评估:从论文级可信论证到生产环境SLA保障——一位首席AI架构师的11年踩坑笔记(含3份脱敏审计日志)
  • 2026 全网超详细网络安全学习路线,零基础一步步成长为实战专家,全套免费教程
  • 2026年全网最全降AI率保姆级教程:高效降低AI! - 降AI实验室
  • 咖啡一杯,Token 无限,Real-Time Cafe 深圳站来了!新增「硬件晒晒桌」与「AI 桌游试玩桌」
  • 使用嘉立创EDA画PCB板时,布线遇到“违反DRC规则,请注意白色边框”问题的解决办法
  • 如何高效破解Cursor Pro限制:5步激活AI编程助手的终极方案
  • 网盘直链解析神器:八大平台免登录高速下载终极解决方案
  • QMCDecode:3步解锁你的QQ音乐加密文件
  • 宣城有实力的网络公司推荐
  • RLVR 技术深挖:强化学习微调大模型的范式转变与代码实战
  • 2026 年 AI 工具聚合站:从模型入口到开发基础设施的进化之路
  • UART 通信学习笔记
  • SMUDebugTool:5步掌握AMD Ryzen处理器深度调试与性能优化
  • 答辩加分秘籍!长江学者特聘教授专属PPT定制
  • 抖音批量下载完整指南:3步实现无水印视频高效获取
  • 2026 降AI率网站实测盘点:真实体验分享,毕业党救急宝典
  • My-TODOs:跨平台桌面待办清单,解放您的生产力
  • 122、神经网络控制:RBF神经网络与自适应控制
  • 如何用Python实现不可见的数字版权保护:BlindWaterMark盲水印技术深度解析
  • 如何高效使用OBS源独立录制:5大创新策略指南
  • 如何5分钟创建专业清华学术PPT:终极免费模板指南
  • 网络安全渗透测试全攻略,吃透各类系统漏洞核心知识
  • 3分钟掌握微博图片批量下载:weiboPicDownloader终极指南
  • 如何在3分钟内轻松解决Windows苹果USB驱动安装难题
  • STM32F407 + RT-Thread 实战:从工程结构到多线程 LED 闪烁
  • easyPoi使用
  • 如何用abap2xlsx将SAP报表开发带入Excel自动化时代
  • NoFences:免费开源的Windows桌面整理终极方案,告别杂乱桌面
  • [Triton笔记4]低内存 Dropout
  • 百度网盘资源获取革命:3秒智能破解提取码的技术方案