在 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)

Linux音频驱动学习之:ASOC分析

Linux音频子系统 - ALSA ASoC

ALSA driver--Asoc

ALSA ASoC 简单声卡驱动程序中的 DAPM 路由是啥意思?

Linux ALSA驱动之五:Linux ALSA驱动之Platform源码分析(基于Linux 5.18)