魏东山嵌入式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");
上一篇: C++ DXD11 透视辅助教程