在 ALSA ASoC 中配置 I2C 和 I2S
Posted
技术标签:
【中文标题】在 ALSA ASoC 中配置 I2C 和 I2S【英文标题】:Configuring I2C and I2S in ALSA ASoC 【发布时间】:2013-12-06 11:19:24 【问题描述】:我正在使用运行 Linux 3.0.63 的 BeagleBoard,我正在尝试让 I2C 和 I2S 接口工作,最终目标是在 beagleboard 上播放 .wav 文件并设置 I2C 和 I2S正确。
我目前坚持将 BeagleBoard 设置为 I2S 线路的主时钟。或者从时钟也可以工作。无论如何,我不知道内核代码中 I2S 的设置在哪里。我假设在arch/arm/mach-omap3/board-omap3beagle.c
,但我找不到它。
顺便说一句,是否有关于如何执行此操作的隐藏文档我不知道?
【问题讨论】:
【参考方案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找到。
【讨论】:
当您在 omap3beagle.c 中看到 SND_SOC_DAIFMT_CBM_CFM 时,如何定位该宏的定义位置? (我当前的方法是 grep 需要 9 分钟......哈哈)我正在使用 Eclipse,但 F3 不会像将我带到函数定义那样将我带到宏定义。 (编辑:您提供的内容很有帮助,但我想问的是,如果您没有告诉我在哪里可以找到 SND_SOC_DAIFMT_CBM_CFM。例如,SND_SOC_DAIFMT_I2S 在哪里? @SwimBikeRun 我使用 ctags/utags 并为所有必要的文件夹生成标签。然后对这个标签文件使用 vim 并逐步执行任何函数/宏等。例如 SND_SOC_DAIFMT_I2S 在我内核第 27 行的 soc-dai.h 中。 @SwimBikeRun 您也可以只使用lxr.free-electrons.com 或只使用google。以上是关于在 ALSA ASoC 中配置 I2C 和 I2S的主要内容,如果未能解决你的问题,请参考以下文章
Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)