Hi,
I'm working on getting a WM8731 (in SLAVE) working using I2S on omap3 McBSP2 (in MASTER).
Here is the hardware:
http://www.efn.org/~rick/pub/wm8731.jpg
Here are the PADCONF's and the pins they hook to on the WM8731:
/*Audio Interface for csb740 */\ MUX_VAL(CP(McBSP2_FSX), (OFF_OUT_PD | IDIS | PTU | EN | M0)) /* McBSP2_FSX -> I2S_FRM -> LRCLK -> DACLRC and ADCLRC*/\ MUX_VAL(CP(McBSP2_CLKX), (OFF_OUT_PD | IDIS | PTU | EN | M0)) /* McBSP2_CLKX -> I2S_CLK -> I2S_BCLK -> BCLK */\ MUX_VAL(CP(McBSP2_DR), (OFF_IN_PD | IEN | PTD | DIS | M0)) /* McBSP2_DR <- I2S_RXD <- ACDDAT */\ MUX_VAL(CP(McBSP2_DX), (OFF_OUT_PD | IDIS | PTU | EN | M0)) /* McBSP2_DX -> I2S_TXD -> DACDAT */\ MUX_VAL(CP(McBSP_CLKS), (OFF_IN_PD | IEN | PTD | DIS | M0)) /* McBSP_CLKS <- I2S_MCLK <- CLKOUT */\
My kernel is "2.6.29-rc3-omap1", here's what I see at bootup:
1 WM8731 Audio Codec 0.13<6>asoc: WM8731 <-> omap-mcbsp-dai-0 mapping ok 2 ALSA device list: 3 #0: omap3csb740 (WM8731) ... 4 beagle:~# aplay test48000.wav 5 Playing WAVE 'test48000.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo 6 aplay: pcm_write:1269: write error: Input/output error
I get no audio output, other than a "click" when the 8731 is initialized upon boot. When I look at the signals the McBSP2_DX line just goes low for the duration of the "aplay", it does not toggle. The other lines look fine. The file is at http://www.efn.org/~rick/pub/omap3csb740.c but roughly, here's what I'm doing:
static struct snd_soc_dai_link omap3csb740_dai = { ... .cpu_dai = &omap_mcbsp_dai[0], /* use 1st one */
static int __init omap3csb740_soc_init(void) ... *(unsigned int *)omap_mcbsp_dai[0].private_data = 1; /* McBSP2 */ *(unsigned int *)omap3csb740_dai.cpu_dai->private_data = 1; /* McBSP2 debug only? */
static int omap3csb740_hw_params(struct snd_pcm_substream *substream, ... ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS); ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS); ret = snd_soc_dai_set_sysclk(codec_dai, 0, 12288000, SND_SOC_CLOCK_IN); ret = snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_SYSCLK_CLKS_EXT, 0, SND_SOC_CLOCK_IN); ret = snd_soc_dai_set_clkdiv(cpu_dai, OMAP_MCBSP_CLKGDV, 256);
Any help is greatly appreciated.
Rick Bronson