Linux驱动的开发与移值——分析Tiny210的声卡驱动模块


目的:
接着上一篇文章《S3C6410 LCD驱动的分析过程——定位相关源代码》地址: ,再写一篇关于分析内核驱动的过程的文章以便加深自己对这方面的印象。
背景:
手头有友善之臂的tiny210和tiny6410。我留意到tiny210的核心板比6410多了一个排针座,但是另外两个针座的位置都是一样的。于是我在想友善之臂的工程师,会不会把把tiny210设计成与tiny6410兼容,把功能相同的引脚设计在相同的位置。然后把tiny210特有的功能放到新增的排针座里呢?抱着这一想法,我粗略地对比了一下两个开发板的底板原理图,我惊奇地发现两个底板相同位置的针脚果然是相同的。这让我太激动了,因为我们原来的项目开发的底板就可以不用修改,直接升级到s5pv210进行使用了。于是我试了一下,把210的核心板装到原来6410的底板上。
发现存在一些问题:
1、启动方式不同的,210和6410选择用SD卡进行启动的开关是相反的。
2、声音没有了。仔细看原理图和底板,发现6410使用的是采用Ac97方式通讯的Wm9713芯片,而210使用的是采用I2S方式通讯的wm8960芯片。
其它的功能基我们的产品没有使用。于是我准备好为tiny210增加wm9713芯片的驱动,让s5pv210的核心板可用于6410的底板上。


第一阶段最终成果:
这阶段只是分析了友善提供的2.6.35.7的内核中与声卡相关信息,这也是本文主要讲述的内容。


经过学习和分析发现友善提供的2.6.35.7的内核中,并没有包含声卡驱动的源代码(wm8960),只是提供编译好的二进制内核模块文件,并且也不是放在内核中,而是放在了Android的文件系统中。
相关的内核模块文件在
/system/lib/modules/2.6.35.7-FriendlyArm/kernel/sound/soc/s5pv2xx/snd-soc-mini210-wm8960.ko
这个驱动核驱动还要搭配文件系统中的
/system/vendor/fa_codec_ctrl
一起使用才可以正常使用wm8960 声音设备。


学习过程:
我为什么能了解到上面提到的这些信息呢?以下是我的分析过程:
1、同样查看内核中的Kconfig文件,以了解一下声卡驱动涉及什么宏:
结果在/linux-xxx/sound/soc/s5pv2xx/kconfig文件中找到相应的内容:


config SND_S5PV2XX_SOC_WM8960
tristate "SoC I2S Audio support for WM8960 on MINI210"
depends on SND_S5PV2XX_SOC
select SND_SOC_WM8960_MINI210
select SND_S5PC1XX_SOC_I2S
help
Say Y if you want to add support for SoC audio on the MINI210.



上面的内容说明跟声卡有关的宏是SND_S5PV2XX_SOC_WM8960、SND_SOC_WM8960_MINI210、SND_S5PC1XX_SOC_I2S


2、下一步查找一下相同目录下的makefile文件,看一下上面这些宏涉及什么文件,结果找到了以下内容:
ifneq ($(wildcard sound/soc/s5pv2xx/wm8960.c),)
ifeq ($(FA),1)
obj-$(CONFIG_SND_SOC_WM8960_MINI210) += snd-soc-wm8960.o
else
obj-m += snd-soc-wm8960.o
endif #FA
endif


# S5PV2XX Machine Support
snd-soc-mini210-wm8960-objs := mini210_wm8960.o


ifneq ($(wildcard sound/soc/s5pv2xx/mini210_wm8960.c),)
ifeq ($(FA),1)
obj-$(CONFIG_SND_S5PV2XX_SOC_WM8960) += snd-soc-mini210-wm8960.o
else
obj-m += snd-soc-mini210-wm8960.o
endif #FA
endif



这个内容的意思是:如果目录下有wm8960.cmini210_wm8960.c这些文件,就把它们编译出来,如果没有就不做事情。了解到这一点后,我们在该目录下查找一下这些跟声卡有关的源代码。结果发现友善并没有提供这两个文件的源代码。


3、没有提供这些原代码,那么必然是以驱动模块的方式来进行加载的,所以这一时我再查了一下友善提供的开发板的“文件系统”。查询里面的所有*.ko文件。结果在/system/lib/modules/2.6.35.7-FriendlyArm/kernel/sound/soc/s5pv2xx/中找到了相关“可疑”的驱动:snd-soc-mini210-wm8960.ko


4、查看启动时的脚本,分析一下在什么时候加载了这些驱动,认真查看每一个启动相关的文件:
4.1在init.mini210.rc中发现以下内容:
service mini210-setup /system/etc/init.mini210.sh
oneshot

4.2查看/system/etc/init.mini210.sh
发现在该脚本中加载了声卡驱动,并执行了fa_codec_ctrl这个程序才可以正常使用声音设备。

至此基把内核中声音设备的相关内容的位置分析完毕。下一步的任务就是补充这两个文件了(实际上就是开发wm8960的过程了)。这些内容将在下一篇文章里说明。 见

相关内容