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

原创 2016年08月29日 17:36:54
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,也就是平台驱动部分

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函数里面有对应的平台驱动



设置平台设备的私有数据,私有数据设置为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结构体






基于S3C2440的Linux-3.6.6移植——声卡驱动

Linux的ALSA声卡驱动较为复杂,它需要注册多个平台设备。在mach-zhaocj2440.c文件中的平台设备数组内一共有四个与ALSA相关的平台设备: &s3c_device_iis, &u...
  • zhaocj
  • zhaocj
  • 2014年03月05日 11:12
  • 5095

AM335x(TQ335x)学习笔记——WM8960声卡驱动移植

经过一段时间的调试,终于调好了TQ335x的声卡驱动。TQ335x采用的Codec是WM8960,本文来总结下WM8960驱动在AM335x平台上的移植方法。Linux声卡驱动架构有OSS和ALSA两...
  • girlkoo
  • girlkoo
  • 2014年12月20日 16:25
  • 17927

ALSA声卡驱动中的DAPM详解之二:widget-具备路径和电源管理信息的kcontrol

上一篇文章中,我们介绍了音频驱动中对基本控制单元的封装:kcontrol。利用kcontrol,我们可以完成对音频系统中的mixer,mux,音量控制,音效控制,以及各种开关量的控制,通过对各种kco...
  • DroidPhone
  • DroidPhone
  • 2013年10月23日 20:31
  • 18441

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

1、简单了解一下ASOC 在嵌入式系统里面的声卡驱动为ASOC(ALSA System on Chip) ,它是在ALSA 驱动程序上封装的一层   分为3大部分,Machine,Platfor...
  • qq_26093511
  • qq_26093511
  • 2017年12月26日 16:47
  • 56

ALSA声卡笔记3--ASoC驱动重要结构体关系图

1、ASoC中重要的数据结构之间的关联方式 (1)Kernel-2.6.35-ASoC中各个结构的静态关系        ASoC把声卡实现为一个Platform Device,然后利...
  • qq_26093511
  • qq_26093511
  • 2017年12月26日 16:49
  • 47

ALSA声卡笔记3--ASoC驱动重要结构体关系图

ALSA与ASOC如何关联 1、(如何写alsa声卡驱动) (1)构造snd_card结构体,snd_card_create()构造snd_card结构体并自动创建控制接口。调用函数snd_ctrl...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年08月29日 20:17
  • 555

ALSA声卡笔记1---ALSA驱动框架

1、声卡驱动程序sound.c (1)入口函数里通过register_chrdev()函数注册file_operations 结构体 (2)file_operations 结构体,里面只有open函...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年08月26日 17:39
  • 1064

ALSA声卡笔记1---ALSA驱动框架

1、声卡驱动程序sound.c (1)入口函数里通过register_chrdev()函数注册file_operations 结构体 (2)file_operations 结构体,...
  • qq_26093511
  • qq_26093511
  • 2017年12月26日 16:46
  • 77

ALSA声卡08_从零编写之框架_学习笔记

1、整体框架 (1)图示((DAI(全称Digital Audio Interface)接口))  在嵌入式系统里面,声卡驱动是ASOC,是在ALSA驱动上封装的一层,包括以下三大块 (2)程序框...
  • qingkongyeyue
  • qingkongyeyue
  • 2017年01月20日 14:02
  • 341

Linux ALSA声卡驱动之八:ASoC架构中的Platform

1.  Platform驱动在ASoC中的作用 前面几章内容已经说过,ASoC被分为Machine,Platform和Codec三大部件,Platform驱动的主要作用是完成音频数据的管理,最终...
  • qq_21792169
  • qq_21792169
  • 2016年04月04日 14:05
  • 1168
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ALSA声卡笔记2---ASoC驱动框架
举报原因:
原因补充:

(最多只允许输入30个字)