T527-----音频调试

ops/2024/12/24 22:09:24/

一、audiocodec

        audiocodec是具有数模转换功能的内置模块,可将音频数字信号转换成模拟信号发送出去,通常接耳机、扬声器等

1、音频流通路

播放流:

Playback ──> DACL ──> LINEOUTL ──> SPKPlayback ──> DACR ──> LINEOUTR ──> SPK

录音流:

MIC1 ──> ADC1 ──> CaptureMIC2 ──> ADC2 ──> CaptureMIC3 ──> ADC3 ──> Capture

AudioCodec 模块由 3 个设备树节点构建

(1)ASoC 层 codec: codec

(2)ASoC 层 platform: codec_plat

(3)ASoC 层 machine: codec_mach

2、设备树

/* audio dirver module -> audio codec */
&codec {tx-hub-en;rx-sync-en;dac-vol		= <63>;		/* default value:63 range:0->63 */dacl-vol	= <160>;	/* default value:160 range:0->255 */dacr-vol	= <160>;	/* default value:160 range:0->255 */adc1-vol	= <160>;	/* default value:160 range:0->255 */adc2-vol	= <160>;	/* default value:160 range:0->255 */adc3-vol	= <160>;	/* default value:160 range:0->255 */lineout-gain	= <31>;		/* default value:31 range:0->31 */hpout-gain	= <7>;		/* default value:7 range:0->7 */adc1-gain	= <31>;		/* default value:31 range:0->31 */adc2-gain	= <31>;		/* default value:31 range:0->31 */adc3-gain	= <31>;		/* default value:31 range:0->31 *//* to do: avcc-1.8 vdd33-3.3 cpvin-1.8 */avcc-external;avcc-supply	= <&reg_aldo4>;avcc-vol	= <1800000>;vdd-external;vdd-supply	= <&reg_cldo3>;vdd-vol		= <3300000>;cpvin-external;cpvin-supply	= <&reg_bldo3>;cpvin-vol	= <1800000>;pa-pin-max	= <1>;pa-pin-0	= <&r_pio PL 7 GPIO_ACTIVE_HIGH>;pa-pin-level-0	= <1>;pa-pin-msleep-0	= <0>;jack-det-level		= <0>;jack-det-threshold	= <8>;jack-det-debouce-time	= <250>;/* extcon                  = <&usb_power_supply>;* jack-swpin-mic-sel      = <&pio PH 8 GPIO_ACTIVE_HIGH>;* jack-swpin-hp-en        = <&pio PH 15 GPIO_ACTIVE_HIGH>;* jack-swpin-hp-sel       = <&pio PH 11 GPIO_ACTIVE_HIGH>;* jack-swmode-hp-off      = <0x00>;* jack-swmode-hp-usb      = <0x11>;* jack-swmode-hp-audio    = <0x10>;* jack-det-level          = <1>;* jack-det-threshold      = <8>;* jack-det-debouce-time   = <250>;*/status = "okay";
};&codec_plat {status = "okay";
};&codec_mach {soundcard-mach,jack-support = <1>;status = "okay";soundcard-mach,cpu {sound-dai = <&codec_plat>;};soundcard-mach,codec {sound-dai = <&codec>;};
};

3、驱动

bsp/drivers/sound/platform/snd_sunxi_aaudio.c:21:

#define DRV_NAME "sunxi-snd-plat-aaudio"

bsp/drivers/sound/platform/snd_sunxi_mach.c:78:static int asoc_simple_hw_params

mach 的时钟设置

static int asoc_simple_hw_params(struct snd_pcm_substream *substream,struct snd_pcm_hw_params *params)
{switch (params_rate(params)) {case 8000:case 12000:case 16000:case 24000:case 32000:case 48000:case 64000:case 96000:case 192000:freq_point = 24576000;

bsp/drivers/sound/platform/snd_sun55iw3_codec.c:695: SOC_ENUM_EXT("ADC HPF0 Mode", sunxi_adchpf0_sta_enum, sunxi_codec_get_dap_status,

时钟设置 sunxi_codec_dai_set_pll

static int snd_sunxi_clk_rate(struct sunxi_codec_clk *clk, int stream,unsigned int freq_in, unsigned int freq_out)
{SND_LOG_DEBUG("\n");if (stream  == SNDRV_PCM_STREAM_PLAYBACK) {if (freq_in % 24576000 == 0) {/* If you want to use clk_pll_audio0_4x, must set it 1083801600Hz */if (clk_set_parent(clk->clk_audio_dac, clk->clk_pll_audio0_4x)) {SND_LOG_ERR("set dac parent clk failed\n");return -EINVAL;}if (clk_set_rate(clk->clk_pll_audio0_4x, 1083801600)) {SND_LOG_ERR("set clk_pll_audio0_4x rate failed\n");return -EINVAL;}} else {if (clk_set_parent(clk->clk_audio_dac, clk->clk_pll_audio1_div5)) {SND_LOG_ERR("set dac parent clk failed\n");return -EINVAL;}}if (clk_set_rate(clk->clk_audio_dac, freq_out)) {SND_LOG_ERR("set clk_audio_dac rate failed, rate: %u\n", freq_out);return -EINVAL;}}}static int sunxi_codec_dai_hw_params(struct snd_pcm_substream *substream,struct snd_pcm_hw_params *params,struct snd_soc_dai *dai)
{/* Set rate */for (i = 0; i < ARRAY_SIZE(sunxi_sample_rate_conv); i++) {if (sunxi_sample_rate_conv[i].samplerate == params_rate(params)) {if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {regmap_update_bits(regmap, SUNXI_DAC_FIFO_CTL, 0x7 << DAC_FS,sunxi_sample_rate_conv[i].rate_bit << DAC_FS);} else {if (sunxi_sample_rate_conv[i].samplerate > 48000)return -EINVAL;regmap_update_bits(regmap, SUNXI_ADC_FIFO_CTL, 0x7 << ADC_FS,sunxi_sample_rate_conv[i].rate_bit << ADC_FS);}}}}static const struct snd_soc_dai_ops sunxi_codec_dai_ops = {.startup	= sunxi_codec_dai_startup,.hw_params	= sunxi_codec_dai_hw_params,.set_pll	= sunxi_codec_dai_set_pll,.prepare	= sunxi_codec_dai_prepare,.trigger	= sunxi_codec_dai_trigger,.shutdown	= sunxi_codec_dai_shutdown,
};

二、AUDIO 音频测试

音频流通路:

播放流:

Playback ──> DACL ──> LINEOUTL ──> SPKPlayback ──> DACR ──> LINEOUTR ──> SPK

录音流:

MIC1 ──> ADC1 ──> CaptureMIC2 ──> ADC2 ──> CaptureMIC3 ──> ADC3 ──> Capture

音频设备:

tinymix查看信息

如何使用 tinymix 更改设置

要更改某个控制项的值,可以使用以下命令格式:

tinymix [control id] [value to set]

例如,如果你想把 MIC1 Switch 打开,可以执行:

tinymix 23 1

同理,如果你想调整音量或增益,可以使用类似的方法:

tinymix 12 100 # 设置 DAC Volume 为 100tinymix 18 40 # 设置 LINEOUT Gain 为 40

1.播放音乐

1.1 aplay 播放wav格式音乐

#打开SPK switch

tinymix 29 1

#默认声卡播放

aplay /usr/share/alsa/syfs-chenhuilin.wav

1.2 ffplay 播放MP3格式音乐

ffplay -nodisp /usr/share/alsa/wuyeutian-xingkong.mp3

1.3 music 音量控制

#amixer 控制music音量,范围0~255, 255声音最大

amixer set 'PCM music volume' 90

1.4 FM 音量控制

#x为音量值,范围 0~100

#ep: 设置音量为50

tinymix -D 4 'DSP2_FM_FaderLR02 Volume' 50

#查看当前音量值

tinymix -D 4 'DSP2_FM_FaderLR02 Volume'

2 、录音

#alsa指定声卡录音, dsnoop 录音,可多路同时录音, 录制为wav格式

2.1 打开 MIC 输入

tinymix -D 0 23 1tinymix -D 0 24 1tinymix -D 0 25 1

#ADC HPF0 Mode

tinymix -D 0 5 1

#ADC1 Volume

tinymix -D 0 15 150arecord -r 44100 -f S16_LE -c2 /mnt/UDISK/record.wavarecord -r 44100 -f S16_LE -c2 /mnt/UDISK/record.wav

2.2 播放录音

aplay /media/record.wav

注意录音时双声道, 播放时接左右声道的喇叭应该会同时出声!! 否则可能是mic或功放工作异常。

MIC录音无声音,录音时测量MBIAS电压为1.8V左右,正常

查看原理图,MIC经过了FM1388模块,要先调试FM1388。如果是直连到CPU,录音功能测试正常。FM1388模块调试内容后续更新。


http://www.ppmy.cn/ops/144679.html

相关文章

AI Agent 与 Agentic AI的区别

1. AI代理 (AI Agents) 定义&#xff1a; AI代理是设计用于在受控环境中执行特定任务或一组任务的目标驱动型AI系统。它们在预定义的参数内操作&#xff0c;根据设定的目标执行任务&#xff0c;并通常依赖明确的指令或规则指导行为。 主要特征&#xff1a; 以目标为导向&…

宠物用品电子商务系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

剑指Offer 两数之和 - 输入有序数组

题目链接 剑指Offer 两数之和 - 输入有序数组 思路 思路一 暴力 两层循环&#xff0c;外层循环固定一个值(value)&#xff0c;内层循环寻找是否存在target-value&#xff0c;若存在就返回 public int[] twoSum(int[] numbers,int target){int[] res new int[2];for(int i0;…

【CCNA网络】Multimode Fiber和Single Mode Fiber是什么?(MMF)(多模光纤)(SMF)(单模光纤)

考点浓缩&#xff1a; 多模光纤&#xff08;MMF&#xff09;和单模光纤&#xff08;SMF&#xff09;是两种常见的光纤类型。单模光纤具有较小的纤芯&#xff08;约8-10μm&#xff09;&#xff0c;适用于长距离、高带宽的传输&#xff08;如城际连接&#xff09;。多模光纤具有…

Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创

什么是 INSTALLED_APPS&#xff1f; INSTALLED_APPS 是 Django 项目中的一个设置&#xff0c;它用于列出项目中所使用的所有应用程序。每当你创建或安装一个新的应用程序时&#xff0c;你需要将其添加到 INSTALLED_APPS 中&#xff0c;以便 Django 项目可以识别并使用该应用程序…

自己搭建专属AI:Llama大模型私有化部署

前言 AI新时代&#xff0c;提高了生产力且能帮助用户快速解答问题&#xff0c;现在用的比较多的是Openai、Claude&#xff0c;为了保证个人隐私数据&#xff0c;所以尝试本地&#xff08;Mac M3&#xff09;搭建Llama模型进行沟通。 Gpt4all 安装比较简单&#xff0c;根据 G…

深圳龙岗戴尔dell r730xd服务器故障维修

深圳龙岗一台DELL POWEREDGE R730XD服务器系统故障问题处理&#xff1a; 1&#xff1a;客户工厂年底产线整改&#xff0c;时不时的会意外断电&#xff0c;导致服务器也频繁停机&#xff0c; 2&#xff1a;多次异常停机后导致服务器开机后windows server系统无法正常启动了&…

Facebook的去中心化探索:社交平台的新型发展趋势

随着数字化进程的加速&#xff0c;社交平台的架构正在经历一场深刻的变革。从最初的集中的社交网络到如今去中心化的构想&#xff0c;社交平台正在朝着更加透明、开放和用户主导的方向发展。作为全球最大的社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;也在…