某方案采用MCU控制TEF6638芯片输出音频,SOC侧仅输出音频信号(I2S格式)。
根据硬件方案,SOC侧只需要提供提供I2S音频信号,同时只能通过SOC侧来提供时钟,所以在确认了I2S引脚配置之后,要先将音频时钟方向做修改
修改imx-tef6635.c中的imx_audmux_config函数
static int imx_audmux_config(int slave, int master)
{
unsigned int ptcr, pdcr;
slave = slave - 1;
master = master - 1;
/* SSI1 MASTERED BY PORT 3 ,mx6 sipply pcm clock。*/
ptcr = MXC_AUDMUX_V2_PTCR_SYN;
pdcr = MXC_AUDMUX_V2_PDCR_RXDSEL(master);
mxc_audmux_v2_configure_port(slave, ptcr, pdcr);
ptcr =MXC_AUDMUX_V2_PTCR_SYN |
MXC_AUDMUX_V2_PTCR_TFSDIR |
MXC_AUDMUX_V2_PTCR_TFSEL(slave) |
MXC_AUDMUX_V2_PTCR_TCLKDIR |
MXC_AUDMUX_V2_PTCR_TCSEL(slave);
pdcr = MXC_AUDMUX_V2_PDCR_RXDSEL(slave);
mxc_audmux_v2_configure_port(master, ptcr, pdcr);
return 0;
}
ALSA 音乐播放过快问题
在开发阶段发现I2S可以输出信号,但是由于速率过快无法正常播放,达到20M左右。所以逐步检查配置。
1、 对比自己设备和其他设备的时钟设置,发现初始化的时候没有对应的时钟配置过程
2、 在tef6638_data结构中添加mx6_sabresd_tef6638_init函数
3、 修改imx-tef6638中的imx_tef6638_hw_params,添加正确的snd_soc_dai_set_sysclk
//设置该SSI的时钟频率
snd_soc_dai_set_tdm_slot //设置TDM,如果不做设置,LRCK信号没有
switch (channels) {
case 2:
snd_soc_dai_set_tdm_slot(cpu_dai, 0xfffffffc, 0xfffffffc, 2, 32);
break;
case 1:
snd_soc_dai_set_tdm_slot(cpu_dai, 0xfffffffe, 0xfffffffe, 2, 32);
break;
default:
return -EINVAL;
}
//设置CPU侧I2S format
snd_soc_dai_set_fmt//设置DAI format
dai_format = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_IF |
SND_SOC_DAIFMT_CBS_CFS;
ret = snd_soc_dai_set_fmt(cpu_dai, dai_format);
//设置I2S时钟及分频系数
//snd_soc_dai_set_clkdiv
//函数参数为:dai: DAI div_id: DAI specific clock divider ID div: new clock divisor.
snd_soc_dai_set_clkdiv(cpu_dai, IMX_SSI_TX_DIV_PM, 4);
//设置I2S时钟基准
//snd_soc_dai_set_sysclk
//由soc输出时钟,clk为SSP系统时钟,频率为clk
sample_rate=params_rate(params);
clk = sample_rate*64*4;
ret=snd_soc_dai_set_sysclk(cpu_dai,IMX_SSP_SYS_CLK,clk,SND_SOC_CLOCK_OUT);
完成设置后可以正常输出播放音频所需要的时钟信号。