2013-11-21 40 views
1

我正在使用運行Linux 3.0.63的BeagleBoard,我試圖讓I2C和I2S接口工作,最終目標是在beagleboard上播放.wav文件,使I2C和I2S正確設置。在ALSA中配置I2C和I2S ASoC

我目前堅持將BeagleBoard設置爲I2S系列的主時鐘。或者從時鐘也可以工作。無論如何,我不知道I2S的東西在內核代碼中的位置。我假設在arch/arm/mach-omap3/board-omap3beagle.c,但我找不到它。

順便說一句,有隱藏的文件說明如何做到這一點,我不知道?

回答

1

看一看文件sound/soc/omap/omap3beagle.cinclude/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找到。

+0

當你在omap3beagle.c中並且看到SND_SOC_DAIFMT_CBM_CFM時,你如何找到這個宏定義的位置? (我當前的方法是一個需要9分鐘的grep ...哈哈)我使用Eclipse,但F3並沒有帶我到宏定義,就像它會帶我到一個函數定義。 (編輯:你提供的是有用的,但我問如果你沒有告訴我在哪裏可以找到SND_SOC_DAIFMT_CBM_CFM。例如,哪裏是SND_SOC_DAIFMT_I2S? – SwimBikeRun

+0

@SwimBikeRun我使用ctags/utags併爲所有必需的文件夾生成標籤。然後使用vim作爲這個標籤文件,並且只是通過任何funcion /宏等步驟。例如SND_SOC_DAIFMT_I2S在我的內核的第27行的soc-dai.h中。 – Michael

+0

@SwimBikeRun你也可以使用http:// lxr。 free-electrons.com/或者只是谷歌。 – Michael