ALSA声卡笔记2---ASoC驱动框架
1、简单了解一下ASOC
在嵌入式系统里面的声卡驱动为ASOC(ALSA System on Chip) ,它是在ALSA 驱动程序上封装的一层 分为3大部分,Machine,Platform和Codec ,三部分的关系如下图所示:其中Machine是指我们的开发板,Platform是指Soc,而Codec是指编解码器(如uda1341)

(1)machine:单板相关内容,开发板所用的主芯片(Platform是指Soc)、编解码芯片(codec)是哪一个。主芯片里的IIS接口(DAI(全称Digital
Audio Interface)接口)接到哪里去.CPU DAI是哪一个,codec DAI是哪一个,DMA是哪个
(2)platform:平台相关内容。IIS(DAI)(设置接口)和DMA(传输数据)
(3)codec:DAI和控制接口(控制音量)
内核带有uda1341的驱动程序,但是没有wm8976的驱动程序
2、以uda1341驱动分析
(1)machine :对应内核中的S3c24xx_uda134x.c程序 (构造snd_soc_card结构体)
主要关心snd_soc_card结构体里面的snd_soc_dai_link结构体,这个结构体指明了用哪一款platform,用哪一款codec,用里面的哪一个DAI、DMA等。
Machine相关
3、S3c24xx_uda134x.c分析
(1)定义了一个platform_driver结构体
当内核里有同名的平台驱动(platform_driver)结构体和平台设备(platform_device)结构体,probe函数就会被调用
(2)入口函数
通过宏module_plateform_driver定义
在Platform_device.h定义
module_driver()的宏定义,关键字_init表示入口函数,关键字_exit表示出口函数
(3)归纳:注册platform_driver,也就是平台驱动部分
{
return platform_driver_register(&xxx);
}
module_init(xxx_init);
static void __exit xxx_init(void)
{
return platform_driver_unregister(&xxx);
}
module_exit(xxx_exit);
由上述定义可知,module_platform_driver()宏的作用就是定义指定名称的平台设备驱动注册函数和平台设备驱动注销函数,并且在函数体内分别通过platform_driver_register()函数和platform_driver_unregister()函数注册和注销该平台设备驱动
有平台驱动(platform_driver)结构体,在内核里会有同名的平台设备(platform_device)结构体
(4)probe函数分析
初始化了一些引脚
分配一个名为soc-audio的平台设备,有平台设备,必定有平台驱动,以soc-audio搜索,在Soc-core.c函数里面有对应的平台驱动
设置平台设备的私有数据,私有数据设置为snd_soc_card结构体
添加平台设备
(5)snd_soc_card结构体
4、Mach-mini440.c分析(同名的platform_device结构体(在内核搜索名字))
(1)同名的platform_device结构体
5、Soc-core.c分析
(1)platform_driver结构体,名字对应probe函数的platform_driver结构体。当存在同名的平台设备和平台驱动时,又一probe函数被调用
(2)入口函数
注册平台驱动结构体soc_driver
(3)probe函数
从平台设备里面得到一个snd_soc_card结构体
然后注册snd_soc_card结构体
6、snd_soc_card结构体
(1)snd_soc_card结构体
(2)dai_link(根据名字找到对应的驱动程序)
根据codec_name知道用哪一个编解码芯片
codec_dai_name表示codec芯片里的哪一个接口,有些编解码芯片有多个接口
cpu_dai_name表示2440那一侧的dai接口(IIs接口),
platform_name表示DMA
(3)operation结构体
platform 相关
I2S相关
7、plarform 划分
(1)分为DMA和CPU DAI两部分,
根据cpu_dai_name找到对应的驱动程序S3c24xx-i2s.c(核心是and_soc_dai_driver结构体,设置CPU这一侧的I2S控制器)
根据platform_name用于指定用哪一个DMA,搜索platform_name(samsang-audio),找到对应的驱动程序Dma.c,(核心是snd_soc_platform_driver结构体)
8、S3c24xx-i2s.c分析
(1)定义平台驱动结构体,有平台驱动结构体,必有平台设备结构体,根据同名搜索在Devs.c里有,有同名时,probe函数被调用
(2)probe函数
注册cpu_dai(Digital Audio Interface)
里面的s3c24xx_i2s_dai结构体
下面的playback用于播放,capture用于录音,最大/最少所支持的通道channels_max和channels_min,采样频率rates,支持的格式formats
还有operation结构体(里面有相关函数)
hw_params是设置硬件参数函数
set_fmt是设置格式函数
set_clkdiv是设置分频系数
9、Devs.c分析
(1)平台设备结构体
要使平台设备结构体起作用,要有相应的平台驱动
DMA相关
10、Dma.c分析
(1)平台驱动结构体
probe函数只有在有同名的probe_device才会被调用
(2)probe函数
注册一个snd_soc_platform_driver结构体
snd_soc_platform_driver结构体,用于数据传输
snd_pcm_ops结构体,包含相关的操作函数
11、Devs.c分析
(1)平台设备结构体
codec相关
12、codec
根据code_name找到编解码芯片,在udall34x.c,
控制接口:构造snd_soc_codec_driver结构体
DAI:snd_soc_dai_driver结构体
13、udal34x.c分析
(1)平台驱动结构体
里面的probe函数只有在内核有同名的平台设备的时候才被调用
(2)probe函数
注册
根据下面可知上面参数的类型
snd_soc_codec_driver结构体
对应L3接口,读写里面的寄存器
snd_soc_dai_driver结构体
这个名字对应的是snd_soc_card结构体里面的dai_link里的名字成员,具有录音和播放功能,还有一个operation结构体
codec芯片I2S 接口操作函数
digital_mute是静音函数,set_sysclk是设置时钟函数
14、Mach-mini2440.c分析
(1)platform_device结构体
转自:http://blog.csdn.net/qingkongyeyue/article/details/52349120
ALSA声卡笔记2---ASoC驱动框架的更多相关文章
- ALSA声卡笔记1---ALSA驱动框架
1.声卡驱动程序sound.c (1)入口函数里通过register_chrdev()函数注册file_operations 结构体 (2)file_operations 结构体,里面只有open函数 ...
- ALSA声卡笔记3--ASoC驱动重要结构体关系图
1.ASoC中重要的数据结构之间的关联方式 (1)Kernel-2.6.35-ASoC中各个结构的静态关系 ASoC把声卡实现为一个Platform Device,然后利用Platform_devic ...
- ALSA声卡笔记4-----体验声卡
1 .配置内核支持UDA1341 (1)内核 解压内核并打上补丁 配置内核 platform 需要设置哪些配置项,先看一下platform,需要把S3c24xx-i2s.c文件配置上去,dma.c也要 ...
- Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)
转自http://blog.csdn.net/droidphone/article/details/7165482 1. ASoC的由来 ASoC--ALSA System on Chip ,是建立 ...
- Linux ALSA声卡驱动之八:ASoC架构中的Platform
1. Platform驱动在ASoC中的作用 前面几章内容已经说过,ASoC被分为Machine,Platform和Codec三大部件,Platform驱动的主要作用是完成音频数据的管理,最终通过C ...
- Linux ALSA声卡驱动之六:ASoC架构中的Machine
前面一节的内容我们提到,ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上 ...
- ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)
前面的六篇文章,我们已经讨论了dapm关于动态电源管理的有关知识,包括widget的创建和初始化,widget之间的连接以及widget的上下电顺序等等.本章我们准备讨论dapm框架中的另一个机制:事 ...
- ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系
前面我们主要着重于codec.platform.machine驱动程序中如何使用和建立dapm所需要的widget,route,这些是音频驱动开发人员必须要了解的内容,经过前几章的介绍,我们应该知道如 ...
- ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route
前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...
随机推荐
- sed用法详解
转载自: SED单行脚本快速参考(Unix 流编辑器) 如侵犯您的版权,请联系:Windeal12@qq.com ------------------------------------------- ...
- Tornado 异步非阻塞
1 装饰器 + Future 从而实现Tornado的异步非阻塞 class AsyncHandler(tornado.web.RequestHandler): @gen.coroutine def ...
- ubuntu16安装git
执行一条命令就可以: sudo apt-get install git
- UCB算法
前言: 来万物花开这家创业公司实习,也真是一波三折.先实习了三天,每天下午到公司工作到晚上.工作时间是每天下午到晚上9.30.结果每天上午没法用心干实验室的活了,下午在公司工作的时候,总是提心吊胆,手 ...
- iOS下简单实现滑动导航条
功能介绍 最近在做一款ios的app,其中有一个页面需要分成三个版块,版块之间可以通过左右滑动来进行切换,也可以通过点击上方的按钮来切换,好像在android中可以用过ViewPager + Frag ...
- SSH服务及其扩展(sshpass和expect)
SSH服务及其扩展(sshpass和expect) Linux SSH服务一共包含三个工具:ssh.scp.sftp [远程连接及执行命令] 语法:ssh -p端口 账号@IP 命令 参数说明:-o ...
- 【剑指offer】二叉树的子结构,C++实现(递归)
原创博文,转载请注明出处! <牛客链接> 1.题目 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:约定空树不是任意一个树的子结构) 图1.二叉树A和二叉树B 2.思路(递归) ...
- KT板
前言 好吧,我是学计算机的,现在的职位是网站美工,只是自己学了点PS.AI的,其实对材质什么的也不太了解.以下的一些信息,基本都是自己先网上查,最后找厂商确认的,不能保证完全精确,但求基本符合事实. ...
- Jmeter图形结果
样本数目:总共发送到服务器的请求数 最新样本:代表时间的数字,是服务器响应最后一个请求的时间 吞吐量:服务器每分钟处理的请求数.是指在没有帧丢失的情况下,设备能够接受的最大速率. 平均值:总运行时间除 ...
- HDFS原理分析之HA机制:avatarnode原理
一.问题描述 由于namenode 是HDFS的大脑,而这个大脑又是单点,如果大脑出现故障,则整个分布式存储系统就瘫痪了.HA(High Available)机制就是用来解决这样一个问题的.碰到这么个 ...