我正在使用运行Linux 3.0.63的BeagleBoard,我正在努力让I2C和I2S接口工作,最终目标是在beagleboard上播放.wav文件并设置I2C和I2S正确。
我目前仍然坚持将BeagleBoard设置为I2S系列的主时钟。或者从时钟也可以工作。无论如何,我不知道在内核代码中设置了I2S的东西。我假设在arch/arm/mach-omap3/board-omap3beagle.c
,但我找不到它。
顺便问一下,有关于如何做这个我不知道的隐藏文档吗?
答案 0 :(得分:1)
查看文件sound/soc/omap/omap3beagle.c和include/sound/soc-dai.h:
第一个有一个功能:
static int omap3beagle_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
/* couple of lines */
switch (params_channels(params)) {
case 2: /* Stereo I2S mode */
fmt = SND_SOC_DAIFMT_I2S |
SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBM_CFM;
break;
case 4: /* Four channel TDM mode */
fmt = SND_SOC_DAIFMT_DSP_A |
SND_SOC_DAIFMT_IB_NF |
SND_SOC_DAIFMT_CBM_CFM;
break;
default:
return -EINVAL;
}
/* some stuff */
}
第二个有宏观定义:
/*
* DAI hardware clock masters.
*
* This is wrt the codec, the inverse is true for the interface
* i.e. if the codec is clk and FRM master then the interface is
* clk and frame slave.
*/
#define SND_SOC_DAIFMT_CBM_CFM (1 << 12) /* codec clk & FRM master */
#define SND_SOC_DAIFMT_CBS_CFM (2 << 12) /* codec clk slave & FRM master */
#define SND_SOC_DAIFMT_CBM_CFS (3 << 12) /* codec clk master & frame slave */
#define SND_SOC_DAIFMT_CBS_CFS (4 << 12) /* codec clk & FRM slave */
因此,使用它们可以根据需要调整“立体声I2S模式”的I2S时钟。 还有很多其他选择,但我想这些都是你需要的。
可以在Documentation/sound/alsa/soc找到一些文档。