ALSA声卡笔记2---ASoC驱动框架

摘要:
1.简单了解嵌入式系统中ASOC的声卡驱动程序是ASOC。它是一个封装在ALSA驱动程序上的层,它分为三个部分:机器、平台和编解码器。这三个部分之间的关系如下图所示:Machine指的是我们的开发板,Platform指的是Soc,Codec指的是编解码器机器:这是开发板使用的主要芯片和编解码器芯片。
1、简单了解一下ASOC

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

ALSA声卡笔记2---ASoC驱动框架第1张

ALSA声卡笔记2---ASoC驱动框架第2张

(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函数就会被调用

ALSA声卡笔记2---ASoC驱动框架第3张

(2)入口函数

通过宏module_plateform_driver定义

ALSA声卡笔记2---ASoC驱动框架第4张

在Platform_device.h定义

ALSA声卡笔记2---ASoC驱动框架第5张

module_driver()的宏定义,关键字_init表示入口函数,关键字_exit表示出口函数

ALSA声卡笔记2---ASoC驱动框架第6张

(3)归纳:注册platform_driver,也就是平台驱动部分

module_platform_driver(xxx);
最终展开后就是如下形式:
static int __init xxx_init(void)
{
        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函数里面有对应的平台驱动

ALSA声卡笔记2---ASoC驱动框架第7张

ALSA声卡笔记2---ASoC驱动框架第8张

设置平台设备的私有数据,私有数据设置为snd_soc_card结构体

ALSA声卡笔记2---ASoC驱动框架第9张

ALSA声卡笔记2---ASoC驱动框架第10张

添加平台设备

ALSA声卡笔记2---ASoC驱动框架第11张

ALSA声卡笔记2---ASoC驱动框架第12张

(5)snd_soc_card结构体

4、Mach-mini440.c分析同名的platform_device结构体(在内核搜索名字))

(1)同名的platform_device结构体

ALSA声卡笔记2---ASoC驱动框架第13张

5、Soc-core.c分析

(1)platform_driver结构体,名字对应probe函数的platform_driver结构体。当存在同名的平台设备和平台驱动时,又一probe函数被调用

ALSA声卡笔记2---ASoC驱动框架第14张

(2)入口函数

注册平台驱动结构体soc_driver

ALSA声卡笔记2---ASoC驱动框架第15张

(3)probe函数

从平台设备里面得到一个snd_soc_card结构体

然后注册snd_soc_card结构体

ALSA声卡笔记2---ASoC驱动框架第16张

6、snd_soc_card结构体

(1)snd_soc_card结构体

ALSA声卡笔记2---ASoC驱动框架第10张

(2)dai_link(根据名字找到对应的驱动程序)

根据codec_name知道用哪一个编解码芯片

codec_dai_name表示codec芯片里的哪一个接口,有些编解码芯片有多个接口

cpu_dai_name表示2440那一侧的dai接口(IIs接口),

platform_name表示DMA 

ALSA声卡笔记2---ASoC驱动框架第18张

(3)operation结构体

ALSA声卡笔记2---ASoC驱动框架第19张

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函数被调用

ALSA声卡笔记2---ASoC驱动框架第20张

(2)probe函数

注册cpu_dai(Digital Audio Interface)

ALSA声卡笔记2---ASoC驱动框架第21张

里面的s3c24xx_i2s_dai结构体

下面的playback用于播放,capture用于录音,最大/最少所支持的通道channels_max和channels_min,采样频率rates,支持的格式formats

ALSA声卡笔记2---ASoC驱动框架第22张

还有operation结构体(里面有相关函数)

hw_params是设置硬件参数函数

set_fmt是设置格式函数

set_clkdiv是设置分频系数

ALSA声卡笔记2---ASoC驱动框架第23张

9、Devs.c分析

(1)平台设备结构体

要使平台设备结构体起作用,要有相应的平台驱动

ALSA声卡笔记2---ASoC驱动框架第24张

DMA相关

10、Dma.c分析

(1)平台驱动结构体

probe函数只有在有同名的probe_device才会被调用

ALSA声卡笔记2---ASoC驱动框架第25张

(2)probe函数

注册一个snd_soc_platform_driver结构体

ALSA声卡笔记2---ASoC驱动框架第26张

snd_soc_platform_driver结构体,用于数据传输

ALSA声卡笔记2---ASoC驱动框架第27张

snd_pcm_ops结构体,包含相关的操作函数

ALSA声卡笔记2---ASoC驱动框架第28张

11、Devs.c分析

(1)平台设备结构体

ALSA声卡笔记2---ASoC驱动框架第29张

codec相关

12、codec

根据code_name找到编解码芯片,在udall34x.c,

控制接口:构造snd_soc_codec_driver结构体

DAI:snd_soc_dai_driver结构体

13、udal34x.c分析

(1)平台驱动结构体

里面的probe函数只有在内核有同名的平台设备的时候才被调用

ALSA声卡笔记2---ASoC驱动框架第30张

(2)probe函数

注册

ALSA声卡笔记2---ASoC驱动框架第31张

根据下面可知上面参数的类型

ALSA声卡笔记2---ASoC驱动框架第32张

snd_soc_codec_driver结构体

对应L3接口,读写里面的寄存器

ALSA声卡笔记2---ASoC驱动框架第33张

snd_soc_dai_driver结构体

这个名字对应的是snd_soc_card结构体里面的dai_link里的名字成员,具有录音和播放功能,还有一个operation结构体

ALSA声卡笔记2---ASoC驱动框架第34张

codec芯片I2S 接口操作函数

digital_mute是静音函数,set_sysclk是设置时钟函数

ALSA声卡笔记2---ASoC驱动框架第35张

14、Mach-mini2440.c分析

(1)platform_device结构体

ALSA声卡笔记2---ASoC驱动框架第36张


转自:http://blog.csdn.net/qingkongyeyue/article/details/52349120


免责声明:文章转载自《ALSA声卡笔记2---ASoC驱动框架》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何禁止datagridview列顺序自动改变位置Eclipse的Debug调试技巧下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

嵌入式驱动开发之---Linux ALSA音频驱动(一)

本文的部分内容参考来自DroidPhone的博客(http://blog.csdn.net/droidphone/article/details/6271122),关于ALSA写得很不错的文章,只是少了实例。本文就是结合实例来分析ALSA音频驱动。 开发环境:ubuntu10.04 目标板:linux-2.6.37 (通过命令uname -r 查看lin...

C语言精要总结-内存地址对齐与struct大小判断篇

在笔试时,经常会遇到结构体大小的问题,实际就是在考内存地址对齐。在实际开发中,如果一个结构体会在内存中高频地分配创建,那么掌握内存地址对齐规则,通过简单地自定义对齐方式,或者调整结构体成员的顺序,可以有效地减少内存使用。另外,一些不用边界对齐、可以在任何地址(包括奇数地址)引用任何数据类型的的机器,不在本文讨论范围之内。 什么是地址对齐 计算机读取或者写入...

1、结构体

1、为什么需要结构体   为了表示一些复杂的事物,而普通的基本类型无法满足实际要。 2、求什么叫结构体  把一些基本类型数据组合在一起形成的一个新的复合数据类型,这个叫做结构体。 3、如何定义结构体 /*---------------------------------------------- 结构体的定义方式 ---------------------...

标准C程序设计七---32

Linux应用 编程深入 语言编程标准C程序设计七---经典C11程序设计以下内容为阅读:《标准C程序设计》(第7版) 作者:E. Balagurusamy(印), 李周芳译 清华大学出版社 2017.7《21天学通C语言》(第7版) 作者:Bradley Jones Peter Aitken Dean Miller(美), 姜佑译 人民邮电出版社 201...

基于功能树分析(FTA)功能级FIT硬件测试方法

共创力研发咨询/杨学明 1 基于功能树分析(FTA)的功能级FIT测试方法原理介绍 功能FIT分析方法的提出,是基于对FMEA分析方法的如下疑问: a) 利用FMEA分析做FIT测试时,智能控制整个芯片失效,或者控制芯片部分功能的随机失效,但是无法模拟器件单个功能或者是特定组合功能的失效。而对于产品系统而言,对于整体失效有检测和保护,不能等同于部分失效也有...

Go第六篇之结构体剖析

Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型。Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。 Go 语言中的类型可以被实例化,使用new或&构造的类型实例的类型是类型的指针。 结构体成员是由一系列的成员变量构成,这些成员变量也被称为“字段”。字段有以下特性: 字段拥有自己的类型和值。...