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结构体

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


ALSA声卡笔记2---ASoC驱动框架的更多相关文章

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

    1.声卡驱动程序sound.c (1)入口函数里通过register_chrdev()函数注册file_operations 结构体 (2)file_operations 结构体,里面只有open函数 ...

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

    1.ASoC中重要的数据结构之间的关联方式 (1)Kernel-2.6.35-ASoC中各个结构的静态关系 ASoC把声卡实现为一个Platform Device,然后利用Platform_devic ...

  3. ALSA声卡笔记4-----体验声卡

    1 .配置内核支持UDA1341 (1)内核 解压内核并打上补丁 配置内核 platform 需要设置哪些配置项,先看一下platform,需要把S3c24xx-i2s.c文件配置上去,dma.c也要 ...

  4. Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)

    转自http://blog.csdn.net/droidphone/article/details/7165482 1.  ASoC的由来 ASoC--ALSA System on Chip ,是建立 ...

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

    1.  Platform驱动在ASoC中的作用 前面几章内容已经说过,ASoC被分为Machine,Platform和Codec三大部件,Platform驱动的主要作用是完成音频数据的管理,最终通过C ...

  6. Linux ALSA声卡驱动之六:ASoC架构中的Machine

    前面一节的内容我们提到,ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上 ...

  7. ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)

    前面的六篇文章,我们已经讨论了dapm关于动态电源管理的有关知识,包括widget的创建和初始化,widget之间的连接以及widget的上下电顺序等等.本章我们准备讨论dapm框架中的另一个机制:事 ...

  8. ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系

    前面我们主要着重于codec.platform.machine驱动程序中如何使用和建立dapm所需要的widget,route,这些是音频驱动开发人员必须要了解的内容,经过前几章的介绍,我们应该知道如 ...

  9. ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route

    前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...

随机推荐

  1. c# Request.Files["xx"]取不到值解决办法

  2. 创建python3.6的虚拟开发环境virtualenv

    为了保证各个项目环境和插件的相对独立,使用virtualenv作为python的虚拟运行环境,这样在项目维护方面,减少在依赖包上所花费的时间. 1.安装 virtualenv虚拟环境插件 pip in ...

  3. (转)MapReduce Design Patterns(chapter 4 (part 2))(八)

    Binning Pattern Description 分箱模式,跟前面的类似,分类记录且不考虑记录的顺序. Intent 归档数据集中的每条记录到一个或多个类别. Motivation 分箱和分区很 ...

  4. Cannot mix incompatible Qt library (version 0x40805) with this library (version 0x40801)

    问题描述 今天运行我的 linux 上的 go 语言 IDE liteide 突然报错,错误如下: Cannot mix incompatible Qt library (version 0x4080 ...

  5. Okhttp之RealConnection建立链接简单分析

    在之前的博客中我们知道Okhttp在发起链接请求先从链接池中获取连接,如果链接池中没有链接则创建新的链接RealConnection对象,然后执行其connet方法打开SOCKET链接(详见< ...

  6. 64位系统下注册32位dll、ax文件

    64位系统下注册32位dll.ax文件. 换了64位系统遇到的新问题,目前常用的影音处理软件多数为32位. 注册这些32的滤镜会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以 ...

  7. redis常用配置参数解析

    本文主要总结一下redis常用的配置参数的用法: 以下参数决定redis运行方式,默认前台运行,修改为yes可以让redis以后台守护进程方式运行 daemonize no 以下参数指定redis的p ...

  8. Linux libusb 安装及简单使用

    Linux libusb 安装及简单使用 一.参考文档: . libusb1 fails do_configure task with “udev support requested but libu ...

  9. 【排序】冒泡排序,C++实现

    原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 基本思想(从小到大排序)       对于给定的n个元素,从第一个元素开始,依次对相邻的两个元素进行比较,当前面的记 ...

  10. 【机器学习】集成学习之sklearn中的xgboost基本用法

    原创博文,转载请注明出处!本文代码的github地址    博客索引地址 1.数据集 数据集使用sklearn自带的手写数字识别数据集mnist,通过函数datasets导入.mnist共1797个样 ...