soc驱动,学习分析

内核驱动,无外乎。

设备--总线--驱动。三者之间的关联。

简介

由于最近在做声卡驱动方面的东西。所以本文分析的是,soc下的wm9713的声卡流程。以及soc的部分。

(1) 从哪里来?

//sound/soc/soc-core.c
static int __devinit snd_soc_init(void)
{
    printk(KERN_INFO "ASoC version %s\n", SND_SOC_VERSION);
    return platform_driver_register(&soc_driver);
}


/* ASoC platform driver */
static struct platform_driver soc_driver = {
    .driver     = {
        .name       = "soc-audio",
    },
    .probe      = soc_probe,
    .remove     = soc_remove,
    .suspend    = soc_suspend,
    .resume     = soc_resume,
};

/* probes a new socdev */
static int soc_probe(struct platform_device *pdev)
{
    int ret = 0, i;
    struct snd_soc_device *socdev = platform_get_drvdata(pdev);

    struct snd_soc_machine *machine = socdev->machine;
    struct snd_soc_platform *platform = socdev->platform;

    struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
    
   //这里下面掉用了好几个probe。分别指出他们位于哪个位置
   //下面这个一般位于soc下的s3c目录下。比如我用的就是在smdk2450_wm9713.c文件内

   if (machine->probe) {
        ret = machine->probe(pdev);
        if(ret < 0)
            return ret;
    }
    for (i = 0; i < machine->num_links; i++)
    {
        struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
        if (cpu_dai->probe) {
            ret = cpu_dai->probe(pdev);
            if(ret < 0)
                goto cpu_dai_err;
        }
    }
    if (codec_dev->probe) {
        ret = codec_dev->probe(pdev);
        if(ret < 0)
            goto cpu_dai_err;
    }
    if (platform->probe) {
        ret = platform->probe(pdev);
        if(ret < 0)
            goto platform_err;
    }
    //......
    return ret;
}


            
阅读更多
文章标签: struct codec c
个人分类: kernel-driver
想对作者说点什么? 我来说一句

soc驱动,适合于soc的Driver

2009年02月16日 1KB 下载

SEC SOC Test Board x64 driver

2013年04月03日 12KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭