欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

魏东山嵌入式Linux视频教程_3 项目实践之ALSA声卡_从零开始编写的框架(基于游龙FS2410开发板、UDA1341声卡)-三、实现cpu_dai驱动的框架(s3c2440_iis.c)

最编程 2024-05-22 16:58:49
...

(参考sound\soc\samsung\s3c24xx-i2s.c)

static const struct snd_soc_dai_ops s3c2440_i2s_dai_ops = {
//.trigger	= s3c24xx_i2s_trigger, //从内核移植过来后,先暂时屏蔽掉这些函数,等用到的时候再加
//	.hw_params	= s3c24xx_i2s_hw_params,
//	.set_fmt	= s3c24xx_i2s_set_fmt,
//	.set_clkdiv	= s3c24xx_i2s_set_clkdiv,
//	.set_sysclk	= s3c24xx_i2s_set_syscl 
};

#define S3C24XX_I2S_RATES \
	(SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
	SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
	SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)

static struct snd_soc_dai_driver s3c2440_i2s_dai = { //没有name,其实snd_soc_register_dai()里会把s3c2440_iis_dev的name复制给dai->name
//	.probe = s3c24xx_i2s_probe,  //从内核移植过来后,先暂时屏蔽掉这些函数,等用到时候再加
//	.suspend = s3c24xx_i2s_suspend,
//	.resume = s3c24xx_i2s_resum
	.playback = {
		.channels_min = 2,
		.channels_max = 2,
		.rates = S3C24XX_I2S_RATES,
		.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,},
	.capture = {
		.channels_min = 2,
		.channels_max = 2,
		.rates = S3C24XX_I2S_RATES,
		.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,},
	.ops = &s3c2440_i2s_dai_ops,
};

2. 注册它

static int s3c2440_iis_probe(struct platform_device *pdev)
{
    return snd_soc_register_dai(&pdev->dev, &s3c2440_i2s_dai);
}
static int s3c2440_iis_remove(struct platform_device *pdev)
{
    snd_soc_unregister_dai(&pdev->dev);
    return 0;
}
static void s3c2440_iis_release(struct device * dev)
{
}
static struct platform_device s3c2440_iis_dev = {
    .name         = "s3c2440-iis", //必须和machine驱动的s3c2440_uda1341_dai_link.cpu_dai_name一致
    .id       = -1,
    .dev = {
    	.release = s3c2440_iis_release,
	},
};
struct platform_driver s3c2440_iis_drv = {
	.probe		= s3c2440_iis_probe,
	.remove		= s3c2440_iis_remove,
	.driver		= {
	    .name	= "s3c2440-iis", //必须和s3c2440_iis_dev的name一致
	}
};
static int s3c2440_iis_init(void)
{
    platform_device_register(&s3c2440_iis_dev);
    platform_driver_register(&s3c2440_iis_drv);
    return 0;
}

static void s3c2440_iis_exit(void)
{
    struct clk *clk;
    platform_device_unregister(&s3c2440_iis_dev);
    platform_driver_unregister(&s3c2440_iis_drv);
}
static void s3c2440_iis_exit(void)
{
    platform_device_unregister(&s3c2440_iis_dev);
    platform_driver_unregister(&s3c2440_iis_drv);
}
module_init(s3c2440_iis_init);
module_exit(s3c2440_iis_exit);
MODULE_LICENSE("GPL");