文章目的:记录声卡驱动开发的学习过程,本文只是讲解了声卡驱动开发过程中的驱动的基本文件体系结构,暂没有对内核增加新的代码。通过简单的修改配置,让Tiny210具备Ac97的驱动,兼容Tiny6410的声卡芯片Wm9713。
上一篇文章《Linux驱动的开发与移值——分析Tiny210的声卡驱动模块》地址:
提到了Tiny210开发板并没有提供WM8960的驱动源代码,我接下来有两个事情可以做
一、编写WM8960的源代码。
二、尝试给TINY210增加AC97芯片WM9713的代码,让TINY210可以与TINY6410的底析兼容(我把内核做好后才发现了这是不可能兼容的,文章最后会说明原因)。
因为第二点可以无需为内核增加代码,所以我在这里就先发布这个过程序了。
准备工作——了解内核的文件组织
Tiny210配套提供的内核中,其实已经包含了所有Ac97声音驱动的内容,这些内容在如下文件中:
1、/arch/arm/mach-s5pv210/dev-audio.c
2、/arch/arm/mach-s5pv210/mach-mini210.c
3、/sound/soc/s3c24xx/s3c-ac97.c
4、/sound/soc/codec/wm9713.c
5、/sound/soc/s5pv2xx/s3c-dma.c
6、/sound/soc/s3c24xx/smdk_wm9713.c
我给文件编了号以方便说明它们的作用和重点:
1号文件,定义着声卡所需的所有基本资源,例如:
1.1 static int s5pv210_ac97_cfg_gpio()这个函数用来配置AC97的引脚。
1.2 struct resource s5pv210_ac97_resource[]这个变量用来定义AC97要用到的内存、DMA等资源。
1.3 struct platform_device s5pv210_device_ac97这个变量定义了一个名为"s3c-ac97"的平台设备,用来加载引导ac97的平台驱动。
当然,这文件里面还有一些I2S声间设备的定义,这些跟I2S有关,我这里不讲它。
2号文件,定义了整个开发板最重要的平台设备。
2.1 static struct platform_device *mini210_devices[]这个变量把整个开发板用到的平台设都都定义在这个数组里了。
2.1.1我们留意一下大概1573行的位置有这样的内容:
#ifdef CONFIG_SND_S3C_SOC_AC97
&s5pv210_device_ac97,
#endif
也就是说在编译内核时,如果声明了SND_S3C_SOC_AC97宏,内核就会增加这个平台设备。
2.2static void __init mini210_machine_init()这个函数里调用了platform_add_devices把平台设备加载到内核里。
3号文件是ac97设备的驱动。
2.1第527行定义了一个平台驱动:struct platform_driver s3c_ac97_driver。它的名称是“s3c-ac97”。这跟我们的1号文件定义的平台设备的中称对应,因此内核会用这个驱动程序来驱动1号文件定义的平台设备。
4号文件是wm9713相关的文件,在/sound/soc/codec/这个目录中针对不同的芯片有很多专门的codec,这些文件可以直接使用,与平台无关。
5号文件是dam相关的操作,这里我们只关注声卡驱动可以先不管它。
6号文件就是把3、4号文个把组织成一个声卡设备,并把声卡作为一个名为"soc-audio"的平台设备添加到内核中。
6.1第56行,定义了平台使用的声音设备
6.2在70行,的int __init smdk_init()函数里把声音设备增加到系统。
具体操作步骤
基本的思路清晰了,下面我们就开始通过简单地修改几个文个件,内核中本来就包含了
/arch/arm/mach-s5pv210/dev-audio.c
/arch/arm/mach-s5pv210/mach-mini210.c
/sound/soc/s5pv2xx/s3c-dma.c
为了用最简单的方法加入其它文件,我们还要做以下工作:
1、修改/sound/soc/s5pv2xx/Kconfig文件,在最后面加入以下内容:
config SND_S5PV2XX_SOC_WM9713
tristate "SoC AC97 Audio support for WM9713 on MINI210"
depends on SND_S5PV2XX_SOC
select SND_S3C_SOC_AC97
select SND_SOC_WM9713
help
Say Y if you want to add support for SoC audio on the MINI210.
我们看一看上面提到的2号文件的说明,所以一定要增加“SND_S3C_SOC_AC97”这个宏定义,上面这个步骤能给内核增加
/sound/soc/codec/wm9713.c
2、修改/sound/soc/s5pv2xx/MakeFile,在最后面加入以下内容:
obj-$(CONFIG_SND_S3C_SOC_AC97)+= ../s3c24xx/s3c-ac97.o
obj-$(CONFIG_SND_S5PV2XX_SOC_WM9713)+=../s3c24xx/smdk_wm9713.o
上面这个步骤能给内核增加
/sound/soc/s3c24xx/s3c-ac97.c
/sound/soc/s3c24xx/smdk_wm9713.c
3、重新配置内核。
在内核配置界面里,进入Device Drivers --->Sound card support --->ALSA for SoC audio support --->
如下图所示:
把SoC I2S Audio ...WM8960...的选项去掉,然后改用SoCAC97 Audio support for WM9713就可以了.
4、编译内核,大功告成。
我们的内核需然做好了,但是我后来才发现tiny210的核心板的ac97功能与tiny6410并不兼容,因此还要对硬件进行修改。