[alsa-devel] ASoC: BeagleBoard driver development (PCM3168)
hello
I try to implement an PCM3168 audio codec from TI to the BeagleBoard but actually i am stuck and it would be rally nice if one could help me a little bit. My ALSA driver version is 1.0.24 and i use an 3.2.18 kernel. As a startingpoint i used the files
*/linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3008.c* */linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3008.h*
The files (see end of e-mail)
*/linux-mainline-3.2.18-r121b/git/sound/soc/omap/pcm3168_soundcard.c /linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.c /linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.h*
could be compiled successfully and also the insmod loads the modules
*$: insmod /lib/modules/3.2.18/kernel/sound/soc/omap/snd-soc-pcm3168_soundcard.ko*
*$: lsmod* Module Size Used by snd_soc_pcm3168 1886 0 snd_soc_pcm3168_soundcard 2094 0 twl4 030_madc_hwmon 2569 0 snd_soc_omap3beagle 2239 0 rtc_twl 4382 0 snd_soc_twl4030 37616 1 rtc_ds1307 6642 0 snd_soc_omap 3521 1 snd_soc_omap_mcbsp 8374 1 snd_soc_core 107346 6 snd_soc_pcm3168,snd_soc_pcm3168_soundcard,snd_soc_omap3beagle,snd_soc_twl4030,snd_soc_omap,snd_soc_omap_mcbsp regmap_spi 1263 1 snd_soc_core snd_pcm 78039 4 snd_soc_twl4030,snd_soc_omap,snd_soc_omap_mcbsp,snd_soc_core snd_timer 18848 1 snd_pcm snd 57930 3 snd_soc_core,snd_pcm,snd_timer soundcore 6954 1 snd iptable_nat 3819 0 snd_page_alloc 4979 1 snd_pcm nf_nat 16515 1 iptable_nat nf_conntrack_ipv4 12018 3 iptable_nat,nf_nat nf_conntrack 71219 3 iptable_nat,nf_nat,nf_conntrack_ipv4 nf_defrag_ipv4 1379 1 nf_conntrack_ipv4 ip_tables 10537 1 iptable_nat x_tables 16505 2 iptable_nat,ip_tables gpio_keys 7117 0 autofs4 20492 2
but the new ALSA device is not recognized
*$:aplay -l* **** List of PLAYBACK Hardware Devices **** card 0: omap3beagle [omap3beagle], device 0: TWL4030 twl4030-hifi-0 [] Subdevices : 1/1 Subdevice #0: subdevice #0
So i tried to get some information in
*$: cd /sys/kernel/debug/asoc*
*/sys/kernel/debug/asoc$: ls* codecs dais omap3beagle pcm3168 platforms
*/sys/kernel/debug/asoc$: cat codecs* pcm3168-codec.0 twl4030-codec
*/sys/kernel/debug/asoc$: cat dais* pcm3168-hifi twl4030-voice twl4030-hifi omap-mcbsp-dai.4 omap-mcbsp-dai.3 omap-mcbsp-dai.2 omap-mcbsp-dai.1 omap-mcbsp-dai.0
*/sys/kernel/debug/asoc$: cat platforms* omap-pcm-audio snd-soc-dummy
*/sys/kernel/debug/asoc$:cd omap3beagle*
*/sys/kernel/debug/asoc/omap3beagle$:ls* dapm dapm_pop_time twl4030-codec
*/sys/kernel/debug/asoc/omap3beagle$:cd /sys/kernel/debug/asoc/pcm3168*
*/sys/kernel/debug/asoc/pcm3168$: ls* dapm_pop_time
At this point i have no idea how to solve the problem or how to debug further and i would be very grateful for any hint.
Thanks a lot Wendelin
* *********************************************************************************************** * /linux-mainline-3.2.18-r121b/git/sound/soc/omap/pcm3168_soundcard.c * ** ***********************************************************************************************
*/* * PCM3168 ASoC driver for BeagleBoard. * * Author: Hugo Villeneuve * Copyright (C) 2008 Lyrtech inc * * adapted by Klimann Wendelin wklimann@hotmail.com * * * Based on ASoC driver for TI DAVINCI EVM platform, original copyright follow: * Copyright: (C) 2007 MontaVista Software, Inc., source@mvista.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */
#include <linux/clk.h> #include <linux/platform_device.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/timer.h> #include <linux/interrupt.h> #include <linux/platform_device.h> #include <linux/gpio.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/pcm_params.h> #include <sound/soc.h> #include <sound/soc-dapm.h>
#include <asm/mach-types.h> //#include <asm/dma.h> #include <mach/hardware.h> #include <mach/gpio.h> //#include <mach/edma.h> #include <plat/mcbsp.h>
#include "omap-mcbsp.h" #include "omap-pcm.h"
#include "../codecs/pcm3168.h"
/* * CLKX and CLKR are the inputs for the Sample Rate Generator. * FSX and FSR are outputs, driven by the sample Rate Generator. */ /* * SND_SOC_DAIFMT_CBS_CFS * for codec in slave mode */ #define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \ SND_SOC_DAIFMT_CBM_CFM | \ SND_SOC_DAIFMT_IB_NF)
static int pcm3168_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int fs; int ret = 0;
printk("in hw_params -> by kli");
/* Fsref can be 8000 to 96000. */ fs = params_rate(params);
/* set cpu DAI configuration */ ret = snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT); if (ret < 0) { printk(KERN_ERR "can't set cpu DAI configuration\n"); return ret; }
pr_debug("pcm3168_hw_params: rate = %d Hz\n", fs);
return 0; }
static struct snd_soc_ops pcm3168_ops = { .hw_params = pcm3168_hw_params, };
/* omap-pcm3168 digital audio interface glue - connects codec <--> CPU */ static struct snd_soc_dai_link pcm3168_dai = { .name = "PCM3168", /* Codec name */ .stream_name = "PCM3168", .cpu_dai_name = "omap-mcbsp-dai.2", .codec_dai_name = "pcm3168-hifi", .codec_name = "pcm3168-codec", .platform_name = "omap-pcm-audio", .ops = &pcm3168_ops, };
/* omap-pcm3168 audio machine driver */ static struct snd_soc_card snd_soc_pcm3168 = { .name = "pcm3168", // -> "OMAP pcm3168" .owner = THIS_MODULE, .dai_link = &pcm3168_dai, .num_links = 1, };
/* pcm3168 audio private data */ static struct pcm3168_setup_data pcm3168_pcm3168_setup = { // .dem0_pin = GPIO(45), // .dem1_pin = GPIO(46), // .pdad_pin = GPIO(47), // .pdda_pin = GPIO(38), };
struct platform_device pcm3168_codec = { .name = "pcm3168-codec", .id = 0, .dev = { .platform_data = &pcm3168_pcm3168_setup, }, };
static struct platform_device *pcm3168_snd_device;
static int __init pcm3168_init(void) { int ret;
printk(KERN_ALERT "in init soundcard \n");
if (!(machine_is_omap3_beagle())) return -ENODEV;
platform_device_register(&pcm3168_codec);
pcm3168_snd_device = platform_device_alloc("soc-audio", 0); if (!pcm3168_snd_device) { printk(KERN_ERR "platform device allocation failed\n"); return -ENOMEM; }
platform_set_drvdata(pcm3168_snd_device, &snd_soc_pcm3168); // platform_device_add_data(pcm3168_snd_device, &pcm3168_snd_data, // sizeof(pcm3168_snd_data));
/* ret = platform_device_add_resources(pcm3168_snd_device, pcm3168_snd_resources, ARRAY_SIZE(pcm3168_snd_resources)); if (ret) { printk(KERN_ERR "platform device add resources failed\n"); goto error; } */ ret = platform_device_add(pcm3168_snd_device); if (ret) goto error;
return ret;
error: platform_device_put(pcm3168_snd_device); return ret; }
static void __exit pcm3168_exit(void) { platform_device_unregister(pcm3168_snd_device); platform_device_unregister(&pcm3168_codec); }
module_init(pcm3168_init); module_exit(pcm3168_exit);
MODULE_AUTHOR("Klimann Wendelin wklimann@hotmail.com"); MODULE_DESCRIPTION("PCM3168 Beagle ASoC driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS("platform:pcm3168-soc-audio");
* *********************************************************************************************** * /linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.c * ** ***********************************************************************************************
*/* * ALSA Soc PCM3168 codec support * * Author: Hugo Villeneuve * Copyright (C) 2008 Lyrtech inc * * adapted by Klimann Wendelin * * * Based on AC97 Soc codec, original copyright follow: * Copyright 2005 Wolfson Microelectronics PLC. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * Generic PCM3168 support. */
#include <linux/init.h> #include <linux/kernel.h> #include <linux/device.h> #include <linux/gpio.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/clk.h> #include <linux/platform_device.h> #include <linux/module.h> #include <sound/core.h> #include <sound/initval.h> #include <sound/pcm.h> #include <sound/pcm_params.h> //#include <sound/soc-dapm.h> #include <sound/soc.h>
#include <asm/mach-types.h> #include <mach/hardware.h> #include <mach/gpio.h> #include <plat/mcbsp.h>
#include "../omap/omap-mcbsp.h" #include "../omap/omap-pcm.h"
#include "pcm3168.h"
#define PCM3168_VERSION "0.1"
#define PCM3168_RATES SNDRV_PCM_RATE_8000_96000 /*(SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_48000)*/
static struct snd_soc_dai_driver pcm3168_dai = {
.name = "pcm3168-hifi", .playback = { .stream_name = "PCM3168 Playback", .channels_min = 2, .channels_max = 8, .rates = PCM3168_RATES, .formats = SNDRV_PCM_FMTBIT_S16_LE, //SNDRV_PCM_FMTBIT_S32_LE }, .capture = { .stream_name = "PCM3168 Capture", .channels_min = 2, .channels_max = 6, .rates = PCM3168_RATES, .formats = SNDRV_PCM_FMTBIT_S16_LE, //SNDRV_PCM_FMTBIT_S32_LE }, };
static void pcm3168_gpio_free(struct pcm3168_setup_data *setup) { // gpio_free(setup->dem0_pin); // gpio_free(setup->dem1_pin); // gpio_free(setup->pdad_pin); // gpio_free(setup->pdda_pin); }
static int pcm3168_soc_probe(struct snd_soc_codec *codec) { struct pcm3168_setup_data *setup = codec->dev->platform_data; int ret = 0;
printk(KERN_ALERT "in SOC Probe -> kli \n");
printk(KERN_INFO "PCM3168 SoC Audio Codec %s\n", PCM3168_VERSION);
return ret;
gpio_err: // pcm3168_gpio_free(setup);
return ret; }
static int pcm3168_soc_remove(struct snd_soc_codec *codec) { struct pcm3168_setup_data *setup = codec->dev->platform_data;
// pcm3168_gpio_free(setup); return 0; }
#define pcm3168_soc_suspend NULL #define pcm3168_soc_resume NULL
static struct snd_soc_codec_driver soc_codec_dev_pcm3168 = { .probe = pcm3168_soc_probe, .remove = pcm3168_soc_remove, .suspend = pcm3168_soc_suspend, .resume = pcm3168_soc_resume, };
static int __devinit pcm3168_codec_probe(struct platform_device *pdev) { int ret; printk(KERN_ALERT "probe pcm3168 -> kli \n");
ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_pcm3168, &pcm3168_dai, 1);
printk(KERN_ALERT "probe_after pcm3168 -> kli = %d \n", ret);
return ret; }
static int __devexit pcm3168_codec_remove(struct platform_device *pdev) { printk(KERN_ALERT "remove pcm3168 -> kli \n");
snd_soc_unregister_codec(&pdev->dev); return 0; }
MODULE_ALIAS("platform:pcm3168-codec");
static struct platform_driver pcm3168_codec_driver = { .probe = pcm3168_codec_probe, .remove = __devexit_p(pcm3168_codec_remove), .driver = { .name = "pcm3168-codec", .owner = THIS_MODULE, }, };
static int __init pcm3168_modinit(void) { printk(KERN_ALERT "in init of 3168 -> kli \n"); return platform_driver_register(&pcm3168_codec_driver); } module_init(pcm3168_modinit);
static void __exit pcm3168_exit(void) { printk(KERN_ALERT "in exit of 3168 -> kli \n"); platform_driver_unregister(&pcm3168_codec_driver); } module_exit(pcm3168_exit);
MODULE_DESCRIPTION("Soc PCM3168 driver"); MODULE_AUTHOR("Klimann Wendelin wklimann@hotmail.com"); MODULE_LICENSE("GPL");
* *********************************************************************************************** * /linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.h * *********************************************************************************************** *
/* * PCM3168 ALSA SoC Layer * * Author: Hugo Villeneuve * Copyright (C) 2008 Lyrtech inc * * adapted by Klimann Wendelin wklimann@hotmail.com * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */
#ifndef __LINUX_SND_SOC_PCM3168_2_H #define __LINUX_SND_SOC_PCM3168_2_H
struct pcm3168_setup_data { // unsigned dem0_pin; // unsigned dem1_pin; // unsigned pdad_pin; // unsigned pdda_pin; };
#endif
Hi,
On 02/10/2013 10:50 PM, wendelin klimann wrote:
hello
I try to implement an PCM3168 audio codec from TI to the BeagleBoard but actually i am stuck and it would be rally nice if one could help me a little bit. My ALSA driver version is 1.0.24 and i use an 3.2.18 kernel. As a startingpoint i used the files
*/linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3008.c* */linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3008.h*
The files (see end of e-mail)
*/linux-mainline-3.2.18-r121b/git/sound/soc/omap/pcm3168_soundcard.c /linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.c /linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.h*
could be compiled successfully and also the insmod loads the modules
*$: insmod /lib/modules/3.2.18/kernel/sound/soc/omap/snd-soc-pcm3168_soundcard.ko*
*$: lsmod* Module Size Used by snd_soc_pcm3168 1886 0 snd_soc_pcm3168_soundcard 2094 0 twl4 030_madc_hwmon 2569 0 snd_soc_omap3beagle 2239 0 rtc_twl 4382 0 snd_soc_twl4030 37616 1 rtc_ds1307 6642 0 snd_soc_omap 3521 1 snd_soc_omap_mcbsp 8374 1 snd_soc_core 107346 6 snd_soc_pcm3168,snd_soc_pcm3168_soundcard,snd_soc_omap3beagle,snd_soc_twl4030,snd_soc_omap,snd_soc_omap_mcbsp regmap_spi 1263 1 snd_soc_core snd_pcm 78039 4 snd_soc_twl4030,snd_soc_omap,snd_soc_omap_mcbsp,snd_soc_core snd_timer 18848 1 snd_pcm snd 57930 3 snd_soc_core,snd_pcm,snd_timer soundcore 6954 1 snd iptable_nat 3819 0 snd_page_alloc 4979 1 snd_pcm nf_nat 16515 1 iptable_nat nf_conntrack_ipv4 12018 3 iptable_nat,nf_nat nf_conntrack 71219 3 iptable_nat,nf_nat,nf_conntrack_ipv4 nf_defrag_ipv4 1379 1 nf_conntrack_ipv4 ip_tables 10537 1 iptable_nat x_tables 16505 2 iptable_nat,ip_tables gpio_keys 7117 0 autofs4 20492 2
but the new ALSA device is not recognized
*$:aplay -l* **** List of PLAYBACK Hardware Devices **** card 0: omap3beagle [omap3beagle], device 0: TWL4030 twl4030-hifi-0 [] Subdevices : 1/1 Subdevice #0: subdevice #0
So i tried to get some information in
*$: cd /sys/kernel/debug/asoc*
*/sys/kernel/debug/asoc$: ls* codecs dais omap3beagle pcm3168 platforms
*/sys/kernel/debug/asoc$: cat codecs* pcm3168-codec.0 twl4030-codec
*/sys/kernel/debug/asoc$: cat dais* pcm3168-hifi twl4030-voice twl4030-hifi omap-mcbsp-dai.4 omap-mcbsp-dai.3 omap-mcbsp-dai.2 omap-mcbsp-dai.1 omap-mcbsp-dai.0
*/sys/kernel/debug/asoc$: cat platforms* omap-pcm-audio snd-soc-dummy
*/sys/kernel/debug/asoc$:cd omap3beagle*
*/sys/kernel/debug/asoc/omap3beagle$:ls* dapm dapm_pop_time twl4030-codec
*/sys/kernel/debug/asoc/omap3beagle$:cd /sys/kernel/debug/asoc/pcm3168*
*/sys/kernel/debug/asoc/pcm3168$: ls* dapm_pop_time
At this point i have no idea how to solve the problem or how to debug further and i would be very grateful for any hint.
Thanks a lot Wendelin
/linux-mainline-3.2.18-r121b/git/sound/soc/omap/pcm3168_soundcard.c
**
*/*
- PCM3168 ASoC driver for BeagleBoard.
- Author: Hugo Villeneuve
- Copyright (C) 2008 Lyrtech inc
- adapted by Klimann Wendelin wklimann@hotmail.com
- Based on ASoC driver for TI DAVINCI EVM platform, original copyright
follow:
- Copyright: (C) 2007 MontaVista Software, Inc., source@mvista.com
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2 as
- published by the Free Software Foundation.
*/
#include <linux/clk.h> #include <linux/platform_device.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/timer.h> #include <linux/interrupt.h> #include <linux/platform_device.h> #include <linux/gpio.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/pcm_params.h> #include <sound/soc.h> #include <sound/soc-dapm.h>
#include <asm/mach-types.h> //#include <asm/dma.h> #include <mach/hardware.h> #include <mach/gpio.h> //#include <mach/edma.h> #include <plat/mcbsp.h>
#include "omap-mcbsp.h" #include "omap-pcm.h"
#include "../codecs/pcm3168.h"
/*
- CLKX and CLKR are the inputs for the Sample Rate Generator.
- FSX and FSR are outputs, driven by the sample Rate Generator.
*/ /*
- SND_SOC_DAIFMT_CBS_CFS
- for codec in slave mode
*/ #define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \ SND_SOC_DAIFMT_CBM_CFM | \ SND_SOC_DAIFMT_IB_NF)
static int pcm3168_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int fs; int ret = 0;
printk("in hw_params -> by kli");
/* Fsref can be 8000 to 96000. */ fs = params_rate(params); /* set cpu DAI configuration */ ret = snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT); if (ret < 0) { printk(KERN_ERR "can't set cpu DAI configuration\n"); return ret; } pr_debug("pcm3168_hw_params: rate = %d Hz\n", fs); return 0;
}
static struct snd_soc_ops pcm3168_ops = { .hw_params = pcm3168_hw_params, };
/* omap-pcm3168 digital audio interface glue - connects codec <--> CPU */ static struct snd_soc_dai_link pcm3168_dai = { .name = "PCM3168", /* Codec name */ .stream_name = "PCM3168", .cpu_dai_name = "omap-mcbsp-dai.2",
Are you sure you connect the codec to McBSP2? If so I think it is better to disable the omap-twl4030 driver, but it should not cause problems if you have it, just make sure you are not running the two card at the same time.
.codec_dai_name = "pcm3168-hifi", .codec_name = "pcm3168-codec",
codec name should be: pcm3168-codec.0
.platform_name = "omap-pcm-audio", .ops = &pcm3168_ops,
};
/* omap-pcm3168 audio machine driver */ static struct snd_soc_card snd_soc_pcm3168 = { .name = "pcm3168", // -> "OMAP pcm3168" .owner = THIS_MODULE, .dai_link = &pcm3168_dai, .num_links = 1, };
/* pcm3168 audio private data */ static struct pcm3168_setup_data pcm3168_pcm3168_setup = { // .dem0_pin = GPIO(45), // .dem1_pin = GPIO(46), // .pdad_pin = GPIO(47), // .pdda_pin = GPIO(38), };
struct platform_device pcm3168_codec = { .name = "pcm3168-codec", .id = 0, .dev = { .platform_data = &pcm3168_pcm3168_setup, }, };
static struct platform_device *pcm3168_snd_device;
static int __init pcm3168_init(void) { int ret;
printk(KERN_ALERT "in init soundcard \n");
if (!(machine_is_omap3_beagle())) return -ENODEV; platform_device_register(&pcm3168_codec); pcm3168_snd_device = platform_device_alloc("soc-audio", 0); if (!pcm3168_snd_device) { printk(KERN_ERR "platform device allocation failed\n"); return -ENOMEM; } platform_set_drvdata(pcm3168_snd_device, &snd_soc_pcm3168);
// platform_device_add_data(pcm3168_snd_device, &pcm3168_snd_data, // sizeof(pcm3168_snd_data));
/* ret = platform_device_add_resources(pcm3168_snd_device, pcm3168_snd_resources, ARRAY_SIZE(pcm3168_snd_resources)); if (ret) { printk(KERN_ERR "platform device add resources failed\n"); goto error; } */ ret = platform_device_add(pcm3168_snd_device); if (ret) goto error;
return ret;
error: platform_device_put(pcm3168_snd_device); return ret; }
You should update you machine driver to use snd_soc_register_card() see other machine drivers as example (omap-twl4030.c is in the same directory for example and it is really simple).
static void __exit pcm3168_exit(void) { platform_device_unregister(pcm3168_snd_device); platform_device_unregister(&pcm3168_codec); }
module_init(pcm3168_init); module_exit(pcm3168_exit);
MODULE_AUTHOR("Klimann Wendelin wklimann@hotmail.com"); MODULE_DESCRIPTION("PCM3168 Beagle ASoC driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS("platform:pcm3168-soc-audio");
/linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.c
**
*/*
- ALSA Soc PCM3168 codec support
- Author: Hugo Villeneuve
- Copyright (C) 2008 Lyrtech inc
- adapted by Klimann Wendelin
- Based on AC97 Soc codec, original copyright follow:
- Copyright 2005 Wolfson Microelectronics PLC.
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
- Generic PCM3168 support.
*/
#include <linux/init.h> #include <linux/kernel.h> #include <linux/device.h> #include <linux/gpio.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/clk.h> #include <linux/platform_device.h> #include <linux/module.h> #include <sound/core.h> #include <sound/initval.h> #include <sound/pcm.h> #include <sound/pcm_params.h> //#include <sound/soc-dapm.h> #include <sound/soc.h>
#include <asm/mach-types.h> #include <mach/hardware.h> #include <mach/gpio.h> #include <plat/mcbsp.h>
#include "../omap/omap-mcbsp.h" #include "../omap/omap-pcm.h"
#include "pcm3168.h"
#define PCM3168_VERSION "0.1"
#define PCM3168_RATES SNDRV_PCM_RATE_8000_96000 /*(SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_48000)*/
static struct snd_soc_dai_driver pcm3168_dai = {
.name = "pcm3168-hifi", .playback = { .stream_name = "PCM3168 Playback", .channels_min = 2, .channels_max = 8, .rates = PCM3168_RATES, .formats = SNDRV_PCM_FMTBIT_S16_LE, //SNDRV_PCM_FMTBIT_S32_LE }, .capture = { .stream_name = "PCM3168 Capture", .channels_min = 2, .channels_max = 6, .rates = PCM3168_RATES, .formats = SNDRV_PCM_FMTBIT_S16_LE, //SNDRV_PCM_FMTBIT_S32_LE },
};
static void pcm3168_gpio_free(struct pcm3168_setup_data *setup) { // gpio_free(setup->dem0_pin); // gpio_free(setup->dem1_pin); // gpio_free(setup->pdad_pin); // gpio_free(setup->pdda_pin); }
static int pcm3168_soc_probe(struct snd_soc_codec *codec) { struct pcm3168_setup_data *setup = codec->dev->platform_data; int ret = 0;
printk(KERN_ALERT "in SOC Probe -> kli \n");
printk(KERN_INFO "PCM3168 SoC Audio Codec %s\n", PCM3168_VERSION); return ret;
gpio_err: // pcm3168_gpio_free(setup);
return ret;
}
static int pcm3168_soc_remove(struct snd_soc_codec *codec) { struct pcm3168_setup_data *setup = codec->dev->platform_data;
// pcm3168_gpio_free(setup); return 0; }
#define pcm3168_soc_suspend NULL #define pcm3168_soc_resume NULL
static struct snd_soc_codec_driver soc_codec_dev_pcm3168 = { .probe = pcm3168_soc_probe, .remove = pcm3168_soc_remove, .suspend = pcm3168_soc_suspend, .resume = pcm3168_soc_resume, };
static int __devinit pcm3168_codec_probe(struct platform_device *pdev) { int ret; printk(KERN_ALERT "probe pcm3168 -> kli \n");
ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_pcm3168, &pcm3168_dai, 1); printk(KERN_ALERT "probe_after pcm3168 -> kli = %d \n", ret); return ret;
}
static int __devexit pcm3168_codec_remove(struct platform_device *pdev) { printk(KERN_ALERT "remove pcm3168 -> kli \n");
snd_soc_unregister_codec(&pdev->dev); return 0;
}
MODULE_ALIAS("platform:pcm3168-codec");
static struct platform_driver pcm3168_codec_driver = { .probe = pcm3168_codec_probe, .remove = __devexit_p(pcm3168_codec_remove), .driver = { .name = "pcm3168-codec", .owner = THIS_MODULE, }, };
According to the datasheet the PCM3168 have I2C or SPI control interface. You should have the driver as i2c/spi device so you can actually control it.
static int __init pcm3168_modinit(void) { printk(KERN_ALERT "in init of 3168 -> kli \n"); return platform_driver_register(&pcm3168_codec_driver); } module_init(pcm3168_modinit);
static void __exit pcm3168_exit(void) { printk(KERN_ALERT "in exit of 3168 -> kli \n"); platform_driver_unregister(&pcm3168_codec_driver); } module_exit(pcm3168_exit);
MODULE_DESCRIPTION("Soc PCM3168 driver"); MODULE_AUTHOR("Klimann Wendelin wklimann@hotmail.com"); MODULE_LICENSE("GPL");
/linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.h *
/*
- PCM3168 ALSA SoC Layer
- Author: Hugo Villeneuve
- Copyright (C) 2008 Lyrtech inc
- adapted by Klimann Wendelin wklimann@hotmail.com
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2 as
- published by the Free Software Foundation.
*/
#ifndef __LINUX_SND_SOC_PCM3168_2_H #define __LINUX_SND_SOC_PCM3168_2_H
struct pcm3168_setup_data { // unsigned dem0_pin; // unsigned dem1_pin; // unsigned pdad_pin; // unsigned pdda_pin; };
#endif _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
Hello and thanks for the support!
2013/2/11 Peter Ujfalusi peter.ujfalusi@ti.com
Hi,
On 02/10/2013 10:50 PM, wendelin klimann wrote:
hello
I try to implement an PCM3168 audio codec from TI to the BeagleBoard but actually i am stuck and it would be rally nice if one could help me a little bit. My ALSA driver version is 1.0.24 and i use an 3.2.18 kernel. As a startingpoint i used the files
*/linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3008.c* */linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3008.h*
The files (see end of e-mail)
*/linux-mainline-3.2.18-r121b/git/sound/soc/omap/pcm3168_soundcard.c /linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.c /linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.h*
could be compiled successfully and also the insmod loads the modules
*$: insmod /lib/modules/3.2.18/kernel/sound/soc/omap/snd-soc-pcm3168_soundcard.ko*
*$: lsmod* Module Size Used by snd_soc_pcm3168 1886 0 snd_soc_pcm3168_soundcard 2094 0 twl4 030_madc_hwmon 2569 0 snd_soc_omap3beagle 2239 0 rtc_twl 4382 0 snd_soc_twl4030 37616 1 rtc_ds1307 6642 0 snd_soc_omap 3521 1 snd_soc_omap_mcbsp 8374 1 snd_soc_core 107346 6
snd_soc_pcm3168,snd_soc_pcm3168_soundcard,snd_soc_omap3beagle,snd_soc_twl4030,snd_soc_omap,snd_soc_omap_mcbsp
regmap_spi 1263 1 snd_soc_core snd_pcm 78039 4 snd_soc_twl4030,snd_soc_omap,snd_soc_omap_mcbsp,snd_soc_core snd_timer 18848 1 snd_pcm snd 57930 3 snd_soc_core,snd_pcm,snd_timer soundcore 6954 1 snd iptable_nat 3819 0 snd_page_alloc 4979 1 snd_pcm nf_nat 16515 1 iptable_nat nf_conntrack_ipv4 12018 3 iptable_nat,nf_nat nf_conntrack 71219 3 iptable_nat,nf_nat,nf_conntrack_ipv4 nf_defrag_ipv4 1379 1 nf_conntrack_ipv4 ip_tables 10537 1 iptable_nat x_tables 16505 2 iptable_nat,ip_tables gpio_keys 7117 0 autofs4 20492 2
but the new ALSA device is not recognized
*$:aplay -l* **** List of PLAYBACK Hardware Devices **** card 0: omap3beagle [omap3beagle], device 0: TWL4030 twl4030-hifi-0 [] Subdevices : 1/1 Subdevice #0: subdevice #0
So i tried to get some information in
*$: cd /sys/kernel/debug/asoc*
*/sys/kernel/debug/asoc$: ls* codecs dais omap3beagle pcm3168 platforms
*/sys/kernel/debug/asoc$: cat codecs* pcm3168-codec.0 twl4030-codec
*/sys/kernel/debug/asoc$: cat dais* pcm3168-hifi twl4030-voice twl4030-hifi omap-mcbsp-dai.4 omap-mcbsp-dai.3 omap-mcbsp-dai.2 omap-mcbsp-dai.1 omap-mcbsp-dai.0
*/sys/kernel/debug/asoc$: cat platforms* omap-pcm-audio snd-soc-dummy
*/sys/kernel/debug/asoc$:cd omap3beagle*
*/sys/kernel/debug/asoc/omap3beagle$:ls* dapm dapm_pop_time twl4030-codec
*/sys/kernel/debug/asoc/omap3beagle$:cd /sys/kernel/debug/asoc/pcm3168*
*/sys/kernel/debug/asoc/pcm3168$: ls* dapm_pop_time
At this point i have no idea how to solve the problem or how to debug further and i would be very grateful for any hint.
Thanks a lot Wendelin
/linux-mainline-3.2.18-r121b/git/sound/soc/omap/pcm3168_soundcard.c
**
*/*
- PCM3168 ASoC driver for BeagleBoard.
- Author: Hugo Villeneuve
- Copyright (C) 2008 Lyrtech inc
- adapted by Klimann Wendelin wklimann@hotmail.com
- Based on ASoC driver for TI DAVINCI EVM platform, original copyright
follow:
- Copyright: (C) 2007 MontaVista Software, Inc., source@mvista.com
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2 as
- published by the Free Software Foundation.
*/
#include <linux/clk.h> #include <linux/platform_device.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/timer.h> #include <linux/interrupt.h> #include <linux/platform_device.h> #include <linux/gpio.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/pcm_params.h> #include <sound/soc.h> #include <sound/soc-dapm.h>
#include <asm/mach-types.h> //#include <asm/dma.h> #include <mach/hardware.h> #include <mach/gpio.h> //#include <mach/edma.h> #include <plat/mcbsp.h>
#include "omap-mcbsp.h" #include "omap-pcm.h"
#include "../codecs/pcm3168.h"
/*
- CLKX and CLKR are the inputs for the Sample Rate Generator.
- FSX and FSR are outputs, driven by the sample Rate Generator.
*/ /*
- SND_SOC_DAIFMT_CBS_CFS
- for codec in slave mode
*/ #define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \ SND_SOC_DAIFMT_CBM_CFM | \ SND_SOC_DAIFMT_IB_NF)
static int pcm3168_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int fs; int ret = 0;
printk("in hw_params -> by kli");
/* Fsref can be 8000 to 96000. */ fs = params_rate(params); /* set cpu DAI configuration */ ret = snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT); if (ret < 0) { printk(KERN_ERR "can't set cpu DAI configuration\n"); return ret; } pr_debug("pcm3168_hw_params: rate = %d Hz\n", fs); return 0;
}
static struct snd_soc_ops pcm3168_ops = { .hw_params = pcm3168_hw_params, };
/* omap-pcm3168 digital audio interface glue - connects codec <--> CPU */ static struct snd_soc_dai_link pcm3168_dai = { .name = "PCM3168", /* Codec name */ .stream_name = "PCM3168", .cpu_dai_name = "omap-mcbsp-dai.2",
Are you sure you connect the codec to McBSP2? If so I think it is better to disable the omap-twl4030 driver, but it should not cause problems if you have it, just make sure you are not running the two card at the same time.
The Beagleboard uses the omap3beagle.c file to include the TWL4030 and it uses the "omap-mcbsp-dai.1" interface so i think there should be no proplem in using booth drivers at the same time
.codec_dai_name = "pcm3168-hifi", .codec_name = "pcm3168-codec",
codec name should be: pcm3168-codec.0
Thanks that helpt to get the (old machine-driver) driver to load correctly and now i can start with the mcbsp and hardware-testing.
.platform_name = "omap-pcm-audio", .ops = &pcm3168_ops,
};
/* omap-pcm3168 audio machine driver */ static struct snd_soc_card snd_soc_pcm3168 = { .name = "pcm3168", // -> "OMAP pcm3168" .owner = THIS_MODULE, .dai_link = &pcm3168_dai, .num_links = 1, };
/* pcm3168 audio private data */ static struct pcm3168_setup_data pcm3168_pcm3168_setup = { // .dem0_pin = GPIO(45), // .dem1_pin = GPIO(46), // .pdad_pin = GPIO(47), // .pdda_pin = GPIO(38), };
struct platform_device pcm3168_codec = { .name = "pcm3168-codec", .id = 0, .dev = { .platform_data = &pcm3168_pcm3168_setup, }, };
static struct platform_device *pcm3168_snd_device;
static int __init pcm3168_init(void) { int ret;
printk(KERN_ALERT "in init soundcard \n");
if (!(machine_is_omap3_beagle())) return -ENODEV; platform_device_register(&pcm3168_codec); pcm3168_snd_device = platform_device_alloc("soc-audio", 0); if (!pcm3168_snd_device) { printk(KERN_ERR "platform device allocation failed\n"); return -ENOMEM; } platform_set_drvdata(pcm3168_snd_device, &snd_soc_pcm3168);
// platform_device_add_data(pcm3168_snd_device, &pcm3168_snd_data, // sizeof(pcm3168_snd_data));
/* ret = platform_device_add_resources(pcm3168_snd_device, pcm3168_snd_resources, ARRAY_SIZE(pcm3168_snd_resources)); if (ret) { printk(KERN_ERR "platform device add resources failed\n"); goto error; } */ ret = platform_device_add(pcm3168_snd_device); if (ret) goto error;
return ret;
error: platform_device_put(pcm3168_snd_device); return ret; }
You should update you machine driver to use snd_soc_register_card() see other machine drivers as example (omap-twl4030.c is in the same directory for example and it is really simple).
I took the omap3beagle.c (and the omap-twl4030.c with same results) file as template and adapted it. The driver can be compiled correctly but when i load it it is not inseting the corresponding codec (snd_soc_pcm3168.ko). Even if i load the snd_soc_pcm3168.ko driver manually and after load the snd_soc_pcm3168_soundcard.ko driver i do not find the soundcard and the codec in:
$/sys/kernel/debug/asoc$: ls codecs dais omap3beagle platforms
$/sys/kernel/debug/asoc$: cat codecs twl4030-codec
****************************************************************************************************************************************** * new machine-driver: * * /linux-mainline-3.2.18-r121b/git/sound/soc/omap/pcm3168_soundcard.c * * * * START * ******************************************************************************************************************************************
/* * PCM3168 ASoC driver for BeagleBoard. * * based on: * > omap3beagle.c -- SoC audio for OMAP3 Beagle * > Author: Steve Sakoman steve@sakoman.com * * adapted by Klimann Wendelin wklimann@hotmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * */
#include <linux/clk.h> #include <linux/platform_device.h> #include <linux/module.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/soc.h>
#include <asm/mach-types.h> #include <mach/hardware.h> #include <mach/gpio.h> #include <plat/mcbsp.h>
#include "omap-mcbsp.h" #include "omap-pcm.h"
static int pcm3168_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *codec_dai = rtd->codec_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int fmt; int ret;
fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF;
/* Set codec DAI configuration */ ret = snd_soc_dai_set_fmt(codec_dai, fmt); if (ret < 0) { printk(KERN_ERR "can't set codec DAI configuration\n"); return ret; }
/* Set cpu DAI configuration */ ret = snd_soc_dai_set_fmt(cpu_dai, fmt); if (ret < 0) { printk(KERN_ERR "can't set cpu DAI configuration\n"); return ret; }
/* Set the codec system clock for DAC and ADC */ ret = snd_soc_dai_set_sysclk(codec_dai, 0, 26000000, SND_SOC_CLOCK_IN); if (ret < 0) { printk(KERN_ERR "can't set codec system clock\n"); return ret; }
return 0; }
static struct snd_soc_ops pcm3168_ops = { .hw_params = pcm3168_hw_params, };
/* Digital audio interface glue - connects codec <--> CPU */ static struct snd_soc_dai_link pcm3168_dai = { .name = "PCM3168", .stream_name = "PCM3168", .cpu_dai_name = "omap-mcbsp-dai.2", .platform_name = "omap-pcm-audio", .codec_dai_name = "pcm3168-hifi", .codec_name = "pcm3168-codec.0", .ops = &pcm3168_ops, };
/* Audio machine driver */ static struct snd_soc_card snd_soc_pcm3168 = { .name = "pcm3168", .owner = THIS_MODULE, .dai_link = &pcm3168_dai, .num_links = 1, };
static int __devinit pcm3168_soc_probe(struct platform_device *pdev) { struct snd_soc_card *card = &snd_soc_pcm3168; int ret;
pr_info("OMAP3 Beagle/Devkit8000 SoC init\n");
card->dev = &pdev->dev;
ret = snd_soc_register_card(card); if (ret) { dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret); return ret; }
return 0; }
static int __devexit pcm3168_soc_remove(struct platform_device *pdev) { struct snd_soc_card *card = platform_get_drvdata(pdev);
snd_soc_unregister_card(card);
return 0; }
static struct platform_driver pcm3168_driver = { .driver = { .name = "pcm3168-soc-audio", .owner = THIS_MODULE, },
.probe = pcm3168_soc_probe, .remove = __devexit_p(pcm3168_soc_remove), };
static int __init pcm3168_soc_init(void) { return platform_driver_register(&pcm3168_driver); } module_init(pcm3168_soc_init);
static void __exit pcm3168_soc_exit(void) { platform_driver_unregister(&pcm3168_driver); } module_exit(pcm3168_soc_exit);
MODULE_AUTHOR("Klimann Wendelin wklimann@hotmail.com"); MODULE_DESCRIPTION("ALSA SoC PCM3168 add on Soundcard"); MODULE_LICENSE("GPL"); MODULE_ALIAS("platform:pcm3168-soc-audio");
****************************************************************************************************************************************** * new machine-driver: * * /linux-mainline-3.2.18-r121b/git/sound/soc/omap/pcm3168_soundcard.c * * * * END
* ******************************************************************************************************************************************
static void __exit pcm3168_exit(void) { platform_device_unregister(pcm3168_snd_device); platform_device_unregister(&pcm3168_codec); }
module_init(pcm3168_init); module_exit(pcm3168_exit);
MODULE_AUTHOR("Klimann Wendelin wklimann@hotmail.com"); MODULE_DESCRIPTION("PCM3168 Beagle ASoC driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS("platform:pcm3168-soc-audio");
/linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.c
**
*/*
- ALSA Soc PCM3168 codec support
- Author: Hugo Villeneuve
- Copyright (C) 2008 Lyrtech inc
- adapted by Klimann Wendelin
- Based on AC97 Soc codec, original copyright follow:
- Copyright 2005 Wolfson Microelectronics PLC.
- This program is free software; you can redistribute it and/or
modify it
- under the terms of the GNU General Public License as published by
the
- Free Software Foundation; either version 2 of the License, or (at
your
- option) any later version.
- Generic PCM3168 support.
*/
#include <linux/init.h> #include <linux/kernel.h> #include <linux/device.h> #include <linux/gpio.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/clk.h> #include <linux/platform_device.h> #include <linux/module.h> #include <sound/core.h> #include <sound/initval.h> #include <sound/pcm.h> #include <sound/pcm_params.h> //#include <sound/soc-dapm.h> #include <sound/soc.h>
#include <asm/mach-types.h> #include <mach/hardware.h> #include <mach/gpio.h> #include <plat/mcbsp.h>
#include "../omap/omap-mcbsp.h" #include "../omap/omap-pcm.h"
#include "pcm3168.h"
#define PCM3168_VERSION "0.1"
#define PCM3168_RATES SNDRV_PCM_RATE_8000_96000
/*(SNDRV_PCM_RATE_32000 |
SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_48000)*/
static struct snd_soc_dai_driver pcm3168_dai = {
.name = "pcm3168-hifi", .playback = { .stream_name = "PCM3168 Playback", .channels_min = 2, .channels_max = 8, .rates = PCM3168_RATES, .formats = SNDRV_PCM_FMTBIT_S16_LE, //SNDRV_PCM_FMTBIT_S32_LE }, .capture = { .stream_name = "PCM3168 Capture", .channels_min = 2, .channels_max = 6, .rates = PCM3168_RATES, .formats = SNDRV_PCM_FMTBIT_S16_LE, //SNDRV_PCM_FMTBIT_S32_LE },
};
static void pcm3168_gpio_free(struct pcm3168_setup_data *setup) { // gpio_free(setup->dem0_pin); // gpio_free(setup->dem1_pin); // gpio_free(setup->pdad_pin); // gpio_free(setup->pdda_pin); }
static int pcm3168_soc_probe(struct snd_soc_codec *codec) { struct pcm3168_setup_data *setup = codec->dev->platform_data; int ret = 0;
printk(KERN_ALERT "in SOC Probe -> kli \n");
printk(KERN_INFO "PCM3168 SoC Audio Codec %s\n", PCM3168_VERSION); return ret;
gpio_err: // pcm3168_gpio_free(setup);
return ret;
}
static int pcm3168_soc_remove(struct snd_soc_codec *codec) { struct pcm3168_setup_data *setup = codec->dev->platform_data;
// pcm3168_gpio_free(setup); return 0; }
#define pcm3168_soc_suspend NULL #define pcm3168_soc_resume NULL
static struct snd_soc_codec_driver soc_codec_dev_pcm3168 = { .probe = pcm3168_soc_probe, .remove = pcm3168_soc_remove, .suspend = pcm3168_soc_suspend, .resume = pcm3168_soc_resume, };
static int __devinit pcm3168_codec_probe(struct platform_device *pdev) { int ret; printk(KERN_ALERT "probe pcm3168 -> kli \n");
ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_pcm3168, &pcm3168_dai, 1); printk(KERN_ALERT "probe_after pcm3168 -> kli = %d \n", ret); return ret;
}
static int __devexit pcm3168_codec_remove(struct platform_device *pdev) { printk(KERN_ALERT "remove pcm3168 -> kli \n");
snd_soc_unregister_codec(&pdev->dev); return 0;
}
MODULE_ALIAS("platform:pcm3168-codec");
static struct platform_driver pcm3168_codec_driver = { .probe = pcm3168_codec_probe, .remove = __devexit_p(pcm3168_codec_remove), .driver = { .name = "pcm3168-codec", .owner = THIS_MODULE, }, };
According to the datasheet the PCM3168 have I2C or SPI control interface. You should have the driver as i2c/spi device so you can actually control it.
As it is my first attempt to implement an audio codec i thought to start as simple as possible and do all the setup with the external pins and avoid to use the I2C or SPI at first. Of course i want to add it later on but i thought it would be wise to test the hardware first.
static int __init pcm3168_modinit(void) { printk(KERN_ALERT "in init of 3168 -> kli \n"); return platform_driver_register(&pcm3168_codec_driver); } module_init(pcm3168_modinit);
static void __exit pcm3168_exit(void) { printk(KERN_ALERT "in exit of 3168 -> kli \n"); platform_driver_unregister(&pcm3168_codec_driver); } module_exit(pcm3168_exit);
MODULE_DESCRIPTION("Soc PCM3168 driver"); MODULE_AUTHOR("Klimann Wendelin wklimann@hotmail.com"); MODULE_LICENSE("GPL");
/linux-mainline-3.2.18-r121b/git/sound/soc/codecs/pcm3168.h *
/*
- PCM3168 ALSA SoC Layer
- Author: Hugo Villeneuve
- Copyright (C) 2008 Lyrtech inc
- adapted by Klimann Wendelin wklimann@hotmail.com
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2 as
- published by the Free Software Foundation.
*/
#ifndef __LINUX_SND_SOC_PCM3168_2_H #define __LINUX_SND_SOC_PCM3168_2_H
struct pcm3168_setup_data { // unsigned dem0_pin; // unsigned dem1_pin; // unsigned pdad_pin; // unsigned pdda_pin; };
#endif _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
-- Péter
Thanks Wendelin
On 02/16/2013 01:05 PM, wendelin klimann wrote:
> I try to implement an PCM3168 audio codec from TI to the BeagleBoard but > actually i am stuck and it would be rally nice if one could help me a > little bit. > My ALSA driver version is 1.0.24 and i use an 3.2.18 kernel. > As a startingpoint i used the files
Is there any particular reason to use so ancient kernel and alsa-driver package?
> .codec_dai_name = "pcm3168-hifi", > .codec_name = "pcm3168-codec", codec name should be: pcm3168-codec.0
Thanks that helpt to get the (old machine-driver) driver to load correctly and now i can start with the mcbsp and hardware-testing.
...
You should update you machine driver to use snd_soc_register_card() see other machine drivers as example (omap-twl4030.c is in the same directory for example and it is really simple).
I took the omap3beagle.c (and the omap-twl4030.c with same results) file as template and adapted it. The driver can be compiled correctly but when i load it it is not inseting the corresponding codec (snd_soc_pcm3168.ko). Even if i load the snd_soc_pcm3168.ko driver manually and after load the snd_soc_pcm3168_soundcard.ko driver i do not find the soundcard and the codec in:
I'm confused now. Previously you said it is working and now you are telling that it is not...
$/sys/kernel/debug/asoc$: ls codecs dais omap3beagle platforms
$/sys/kernel/debug/asoc$: cat codecs twl4030-codec
You do not have the codec loaded so the card is not going to come up. What do you have in the kernel messages around this time? Have you registered the platform device for your testing codec driver?
According to the datasheet the PCM3168 have I2C or SPI control interface. You should have the driver as i2c/spi device so you can actually control it.
As it is my first attempt to implement an audio codec i thought to start as simple as possible and do all the setup with the external pins and avoid to use the I2C or SPI at first. Of course i want to add it later on but i thought it would be wise to test the hardware first.
The time to start the driver in a proper way will save you lots of time... You don't need to write two drivers (platform driver for testing followed by a new real driver).
participants (2)
-
Peter Ujfalusi
-
wendelin klimann