Linux下wm8978调试指南

Linux自带wm8978的驱动https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/wm8978.c?h=v5.9-rc6,先编译下(配置CONFIG_SND_SOC_WM8978为y)

dts配置如下

	wlf:wm8978@1a{
        compatible = "wlf,wm8978";
		#sound-dai-cells = <0>;
        reg = <0x1a>;
    };

采用简易声卡模型,配置CONFIG_SND_SIMPLE_CARD_UTILS和CONFIG_SND_SIMPLE_CARD为y

参考Documentation/devicetree/bindings/sound/simple-card.txt配置声卡(不同平台有差异,请自行适配,这里是展讯平台的配置)

具体的含义可参考https://blog.csdn.net/mike8825/article/details/108417775

	sound {
		compatible = "simple-audio-card";
		simple-audio-card,name = "WLF Audio";
		simple-audio-card,dai-link@0 {
			plat {
				sound-dai = <&sprd_pcm_iis>;
			};
			cpu {
				sound-dai = <&i2s0>;
			};
			codec {
				system-clock-frequency = <26000000>;
				system-clock-direction-out;
				dai-format = "i2s";
				sound-dai = <&wlf 0>;
			};
		};
	};

下载内核进手机后,系统已经生成了对应的声卡。

 

从wm8978规格书中,看到的参考设计如下

MCLK应该给多少M呢 

 一种方案是是随着LRCLK的变化,自动调整MCLK/SYSCLK的值(256*fs),另一种方案是MCLK给固定的值,利用wm8978内部的pll模块来调整SYSCLK。刚好上面的表格里有26M的时钟,那可以采用26M的晶振,或者采用带时钟输出功能的引脚输出26M。那ic怎么知道输入是26M呢,dts里有配置26M(asoc_sprd_card_sub_parse_of会解析到)。

这里测试的是cpu做主(i2s主),wm8978作从(i2s从)的模式(snd_soc_of_parse_daifmt函数会解析配置)。

先播放一个音频看下,这里生成的声卡设备为/dev/snd/pcmC1D0p

tinyplay /data/不药而愈.wav -D 1 -d 0

接耳机或者喇叭都有声音输出,都不需要打开ic内部的开关。

再测试接3.5mm接口音频线到模块上,没有声音输出,因为默认的通路没有没有打开,通过如下命令打开下,喇叭也有声音。

tinymix -D 1 "Left Output Mixer Line Bypass Switch" "1"
tinymix -D 1 "Right Output Mixer Line Bypass Switch" "1"

看log并没有走到pll模块,这时的sysclk的值是接近值(非最优),这是由于asoc_simple_card_init_dai这里传递的值固定为0,导致wm8978->sysclk = WM8978_MCLK,默认wm8978->sysclk = WM8978_PLL

加入如下修改 

打印如下 

 

 

再来测试下录音

tinycap /data/1.wav -D 1  -d 0 -c 2 -r 16000 -b 16 -T 10   //-T 10指只录10s

把音频放到电脑上看波形(https://blog.csdn.net/mike8825/article/details/95017611),发现数据是空的。

测量mic的偏置引脚(32)没有电压。

再看下代码,发现wm8978_set_bias_level这个函数有调用,发现驱动里还有一个函数SND_SOC_DAPM_MICBIAS("Mic Bias", WM8978_POWER_MANAGEMENT_1, 4, 0),但tinymix没有看到有相应的开关,先配置下再看下,合入下面的补丁

这时候,也能录到音了。 

如果不采用简易声卡模型,展讯平台默认也有一个声卡(非展讯平台请忽略这两个修改),dts配置如下

&sound_sprd_ap_alliis {
	status = "okay";
	sprd-audio-card,dai-link@0 {
		plat {
			sound-dai = <&sprd_pcm_iis>;
		};
		cpu {
			sound-dai = <&i2s0>;
		};
		codec {
			sound-dai = <&wlf 0>;
		};
	};
};

通过如下方式设置主时钟 

这里调试基本完成了,再把相应的数据链路理通下,达到融会贯通的境界(这下面的代码都会用sound/soc/codecs)

先看这张图

 

是不是有很多开关和PGA(Pmgrammable Gain Amplifier),那驱动如何描述该部件呢 

看下驱动的这部分

controls:指能动态配置的部分,如音量和开关等,可以通过tinymix去配置
dapm_widgets:(DAPM--Dynamic Audio Power Management)音频ic里面有很多电源,用的时候才打开,能节省电源,这也是DAPM的概念,这里描述的是开启电源的寄存器
dapm_routes:中文描述为DAPM路由表,也就是什么时打开DAPM,如
{"Right Input Mixer", "MicN Switch", "RMICN"},会将"Right Input Mixer"和"MicN Switch"涉及的电源都打开 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值