|
一.基础准备
说明:本文只是针对6410的声卡运行过程做讨论,我下一篇文章将对本文涉及到的一些框架、原理和规范的讨论
1. 引
我下载一个sleep.wav的声音文件,电脑上正常播放,我烧写到板子上,linux系统下,运行
cat sleep.wav > /dev/dsp
怎么没有声音呢,是不是声卡有问题,还是驱动问题?,我3月份买的板子,pda没有测试声音这个功能软件,没有方法测试声音,只能用这个指令测试了,但是没有声音,不知道出错在哪里,驱动问题还是硬件问题?还是我找的设备节点有问题,我现在懒,不知道其他的人用有没有问题,如果别人有声音可能是我硬件问题,如果都没有,我就要修改驱动了,现在比较懒,呵呵不愿意对原理图,呵呵,请原谅
哎,我上论坛问了有一段时间,没有人回答,估计是天嵌工程师放假,呵呵正好赶上我大三也放暑假,反正我也闲着,我就分析分析一下我这个款驱动,正好也温习一下驱动知识呵呵,懒终究是不行了。顺手记下来方便以后自己用。
先引入一些asoc框架的基本概念
2. 硬件架构
通常,就像软件领域里的抽象和重用一样,嵌入式设备的音频系统可以被划分为板载硬件(Machine)、Soc(Platform)、Codec三大部分,如下图所示:
音频系统结构
· Machine 是指某一款机器,可以是某款设备,某款开发板,又或者是某款智能手机,由此可以看出Machine几乎是不可重用的,每个Machine上的硬件实现可能都不一样,CPU不一样,Codec不一样,音频的输入、输出设备也不一样,Machine为CPU、Codec、输入输出设备提供了一个载体。
· Platform 一般是指某一个SoC平台,比如pxaxxx,s3cxxxx,omapxxx等等,与音频相关的通常包含该SoC中的时钟、DMA、I2S、PCM等等,只要指定了SoC,那么我们可以认为它会有一个对应的Platform,它只与SoC相关,与Machine无关,这样我们就可以把Platform抽象出来,使得同一款SoC不用做任何的改动,就可以用在不同的Machine中。实际上,把Platform认为是某个SoC更好理解。
· Codec 字面上的意思就是编解码器,Codec里面包含了I2S接口、D/A、A/D、Mixer、PA(功放),通常包含多种输入(Mic、Line-in、I2S、PCM)和多个输出(耳机、喇叭、听筒,Line-out),Codec和Platform一样,是可重用的部件,同一个Codec可以被不同的Machine使用。嵌入式Codec通常通过I2C对内部的寄存器进行控制。
3. 软件架构
在软件层面,ASoC也把嵌入式设备的音频系统同样分为3大部分,Machine,Platform和Codec。
· Codec驱动 ASoC中的一个重要设计原则就是要求Codec驱动是平台无关的,它包含了一些音频的控件(Controls),音频接口,DAMP(动态音频电源管理)的定义和某些Codec IO功能。为了保证硬件无关性,任何特定于平台和机器的代码都要移到Platform和Machine驱动中。所有的Codec驱动都要提供以下特性:
o Codec DAI 和 PCM的配置信息;
o Codec的IO控制方式(I2C,SPI等);
o Mixer和其他的音频控件;
o Codec的ALSA音频操作接口;
必要时,也可以提供以下功能:
o DAPM描述信息;
o DAPM事件处理程序;
o DAC数字静音控制
· Platform驱动 它包含了该SoC平台的音频DMA和音频接口的配置和控制(I2S,PCM,AC97等等);它也不能包含任何与板子或机器相关的代码。
· Machine驱动 Machine驱动负责处理机器特有的一些控件和音频事件(例如,当播放音频时,需要先行打开一个放大器);单独的Platform和Codec驱动是不能工作的,它必须由Machine驱动把它们结合在一起才能完成整个设备的音频处理工作。
4.3.0内核的Asoc数据结构图
为了更好的理解alsa,下图将列写出各个相关的结构关系和我们关心的函数,本alsa分析也将相继介绍它们的实现、注册过程。
5. 最后的准备
先从配置单入手,tq6410是linux3.0内核。
执行以下语句:
cp CONFIG_A70_v1.1 .config //用天嵌的7寸屏配置文件
make menuconfig
进入目录
│ -> Device Drivers │
│ -> Sound card support (SOUND [=y]) │
│ -> Advanced Linux Sound Architecture (SND [=y]) │
│ -> ALSA for SoC audio support (SND_SOC [=y])
在\sound\soc\samung\Kconfig里有这项
config SND_SOC_SAMSUNG_SMDK_WM9713
tristate "SoC AC97 Audio support for SMDK with WM9713"
depends on SND_SOC_SAMSUNG && (MACH_SMDK6410 || MACH_SMDKC100 || MACH_SMDKV210 || MACH_SMDKC110 || MACH_SMDKV310 || MACH_SMDKC210 || MACH_TQ6410)
select SND_SOC_WM9713
select SND_SAMSUNG_AC97
在source insght里搜索我上面黑体字的宏” SND_SOC_WM9713”” SND_SAMSUNG_AC97”
smdk-wm9713-objs := smdk_wm9713.o
obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM9713) += snd-soc-smdk-wm9713.o
注:这里的宏CONFIG_SND_SOC_SAMSUNG_SMDK_WM9713在上面Kconfig里这句“config SND_SOC_SAMSUNG_SMDK_WM9713”可知已配置
snd-soc-wm9713-objs := wm9713.o
obj-$(CONFIG_SND_SOC_WM9713) += snd-soc-wm9713.o
这个宏“CONFIG_SND_SOC_WM9713”在上面我粗字体,
综上,在make menuconfig 中配置这项 “SoC AC97 Audio support for SMDK with WM9713”就配置了“CONFIG_SND_SOC_SAMSUNG_SMDK_WM9713”,
“ CONFIG_SND_SOC_WM9713”。
下一章正式分析驱动代码中的Machine 部分。
Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )
GMT+8, 2024-5-4 14:14 , Processed in 1.046881 second(s), 15 queries .
Powered by Discuz! X3.4
Copyright © 2001-2020, Tencent Cloud.