1.mclk异常分析
(以调试tlv320aic为例)当录音失败时,需要测量下i2s的信号,包括sclk,lrck,sdi以及mclk;常遇到mclk异常,也就是示波器测量到其频率的波形不稳定,频率大小对不上,电压和幅值也不对,例如下图所示:
设备树上看到的频率为12288000,但实际测量为2.8M;那么在dts中配置上assigned-clock-rates = <12288000>;然后检查下TLV320aic驱动里面,在开启录音的时候,是否有调用到clk_prepare_enable(mclk); 有些codec驱动没有这个clk_prepare_enable,那就自己添加上去验证;驱动修改如下在aic31xx_codec_probe添加:dts和驱动修改后,编译升级固件,此时mclk的波形幅值都是正确的,并且能测量到是12.28MHz,波形也是稳定的
2.mclk没有信号输出
录音时,mclk没有信号输出;首先要确保mclk的引脚是复用正确的,可以通过该指令去查看cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins;下图可见是正常的,那么mclk这个引脚当作普通的gpio是否可以正常的拉高拉低,如果不行的话,那就是硬件上的问题了。
当mclk的复用,电压之类的都正常,那么录音的时候还是没有波形信号输出,只能再去检查下dts的clock配置;
clocks = <&cru I2S3_MCLKOUT>;
clock-names = "mclk";
assigned-clocks = <&cru I2S3_MCLKOUT>, <&cru I2S3_MCLK_IOE>;
assigned-clock-rates = <12288000>;
assigned-clock-parents = <&cru I2S3_MCLKOUT_TX>, <&cru I2S3_MCLKOUT>;
#####该问题,mclk没有出来,主要是assigned-clock-parents当时配置为<&cru I2S3_MCLKOUT_TX>,
少了一个 <&cru I2S3_MCLKOUT>;
在驱动代码中可以看到,i2s3有两个clock-parent,如下,代码中找到关键词“CLK_SET_RATE_PARENT”,其对应的有两个 即I2S3_MCLKOUT_TX,I2S3_MCLKOUT; 而assigned-clocks就查找关键字“MUXGRF",其对应了I2S3_MCLKOUT和I2S3_MCLK_IOE;
3.通道引脚的映射
例如一个i2s下面挂载着2个tlv320aic芯片,使用SDO1和SDO2输出,那么此时需要进行通道映射,在i2s的节点下面添加配置rockchip,i2s-tx-route = <2 1 0 3>; 其实是<SDO0 SDO1 SDO2 SDO3>这样的顺序排列, 也就是说把SDO0这个寄存器写入2,也就是使能了path2(56通道),SDO1写入了1,使能了path1(34通道),SDO2写入了0,使能了path0(12通道),SDO3写入了3,使能了path3(78通道);由于一个SDO是2通道,所以需要4通道的音源去播放才行。