文章目的:记录声卡驱动开发的学习过程,本文只是讲解了声卡驱动开发过程中的驱动的基本文件体系结构,暂没有对内核增加新的代码。通过简单的修改配置,让Tiny210具备Ac97的驱动,兼容Tiny6410的声卡芯片Wm9713。

上一篇文章《Linux驱动的开发与移值——分析Tiny210的声卡驱动模块》地址:http://blog.csdn.net/koy0755/article/details/7341704

提到了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并不兼容,因此还要对硬件进行修改。

1、要把TINY210核心原中,P2针座的的29-31针与6410的底板断来,因为TINY210的这些引脚是I2S0的功能。我是用另一个针座把这几个脚拔掉,然后接到核心板上,然后再放到底板上的。如下图所示:

2、TINY210把AC97的引脚放到了核心板正面的CON10排线座上了,我们要把这几个引脚焊接到底板上对应的AC97引脚,如下图所示。

=======================================================================================

至此,可以把内核烧到开发板,启动后就可以通过WM9713播放声音了

Linux驱动的开发与移值——为Tiny210加入AC97驱动Wm9713相关推荐

  1. linux声卡模块编译,Linux驱动的开发与移值——分析Tiny210的声卡驱动模块

    目的: 接着上一篇文章<S3C6410 LCD驱动的分析过程--定位相关源代码>地址:http://www.linuxidc.com/Linux/2012-02/54665.htm ,再写 ...

  2. Tiny210加入AC97驱动Wm9713

    目的:记录声卡驱动开发的学习过程,本文只是讲解了声卡驱动开发过程中的驱动的基本文件体系结构,暂没有对内核增加新的代码.通过简单的修改配置,让Tiny210具备Ac97的驱动,兼容Tiny6410的声卡 ...

  3. 外设驱动库开发笔记2:AD8400系列数字电位器驱动

    一些时候我们需要在系统使用过程中改变某些电路电阻值以达到改变设定的目的,这时候我们就会使用电位器.在我们使用数字控制电路时多选择数字电位器.在这一篇我们就来设计AD8400系列数字电位器的驱动. 1. ...

  4. Android项目驱动式开发教程 第2版,《Android项目驱动式开发教程》第一章开发入门.ppt...

    <Android项目驱动式开发教程>第一章开发入门 1.4 项目框架分析 4 android:versionName="1.0" > 5 8 第9行代码andro ...

  5. 外设驱动库开发笔记3:AD527x系列数字电位器驱动

    在一些时候我们需要使用精度更高的数字电位器来实现我们的应用.我们经常使用AD527x系列数字电位器来实现这类应用.在通常情况下,AD527x系列数字电位器完全能够满足要求.为了减少重复工作,在这里我们 ...

  6. 外设驱动库开发笔记30:宇电AI-BUS通讯驱动

    嵌入式系统通常都会与外部设备进行通讯,这就涉及到通讯协议的问题.这些通讯协议有的是标准协议有的厂家自定义的协议,如宇电的AI-BUS.在本篇中,我们将讨论AI-BUS的驱动,以便于与宇电设备的通讯. ...

  7. 外设驱动库开发笔记24:FM24xxx系列FRAM存储器驱动

    虽然说使用EEPROM保存参数很有效,但操作及使用次数均有一下限制.当我们的一些参数需要不定时修改或存储时,使用FRAM就更为方便一点.这一节我们就来设计并实现FM24xxx系列FRAM的驱动. 1. ...

  8. 外设驱动库开发笔记48:MCP4725单通道DAC驱动

      在产品设计过程中,我们经常会遇到数模转换的应用需求.在本篇种我们就来讨论一下MCP4725单通道数模转换器的驱动设计与实现. 1.功能概述   MCP4725是一个低功耗,高精度,单通道,12位缓 ...

  9. 番外篇——直流电机桥源码分析LED驱动例程开发

    [番外篇]直流电机桥源码分析&LED驱动例程开发 直流电机桥测试代码分析 直流电机桥驱动代码分析 仿写HBLED驱动程序 利用芯片手册修改设备树 利用原理图寻找引脚 仿写代码 仿写HBLED测 ...

最新文章

  1. 2021-02-24 Python等比例压缩与质量处理图片
  2. (转)青春有限,走红有年
  3. openGauss凝聚创新力量,云和恩墨MogDB加速社区发展
  4. Nutanix推出自动化功能,助力企业保证业务连续性
  5. FXForms,自动生成iOS表单
  6. import maven project很慢_你确定 Maven 相关的东西全部了解吗?
  7. libcurl 发送邮件_结合MIME C++ library与CURL发送带附件的邮件
  8. 从NFC卡(校园卡或者门禁卡)分析看ACR122U读写原理 (转载)
  9. Linux中的Ext2、ext3、ext4文件系统如何对磁盘中的文件进行存储和管理
  10. Kettle构建Hadoop ETL实践(五):数据抽取
  11. 《统计会犯错——如何避免数据分析中的统计陷阱》导读
  12. spark实现 通过ratings.dat和movies.dat两个文件得到平均得分超过4.0的电影列表
  13. [OpenJudge] 2.5基本算法之搜索 红与黑
  14. 天梯赛 L1_001-L1_020 集合
  15. git gc error: failed to run repack message
  16. 刷手机流量,反正浪费就完事了
  17. 辞职的理由,似乎大家都说不是为了钱
  18. Python+opencv 人脸识别
  19. 今日推荐课程:机器学习极简入门
  20. Matlab机器人工具箱(3-3):五自由度机械臂(动力学)

热门文章

  1. Element 后台管理系统实用表格布局
  2. ADC0809 8通道轮流采样LCD1602显示
  3. 倒计时2天!TO B人的传统节日,2023年22客户节(22DAY)
  4. 如何提高功率因数,减少线路损耗,节省用电成本
  5. (gitee)gitee凭据配置
  6. 苏州新导化工厂与二道门人员定位解决方案-电子围栏系统-门禁一卡通系统
  7. 电梯上下运行一个周期中的拉力和加速度变化
  8. 什么样的代码才是好代码
  9. 互联网金融风控面试算法知识(四)
  10. C语言中static静态变量