概述

此处还需引入之前说过的话:  新事物的出现必然是为了解决旧事物中的不足。这句话在现实生活中和程序世界中道理一样。ASOC的出现就是为了解决ALSA无法解决的问题。ALSA到底存在什么问题? 以及ASOC会以怎样的方式去解决ALSA存在的问题?
详细参考内核文档:  kernel\documentation\sound\alsa\soc\Overview.txt
ALSA存在的问题:
1.  Codec驱动与SOC中断CPU耦合严重,这将导致代码重复,一个Codec驱动每个cpu上会出现不同的版本。
2.  当音频事件发生时(插拔耳机,音箱)没有标准的方法通知用户,尤其在移动端此事件非常常见。
3.  当播放/录制音频时,驱动会让整个codec处于上电状态,这样会在移动端非常浪费电量。同时也不支持改变采样频率/骗置电流来节约功耗。
针对以上问题,提出了ASOC(ALSA System on Chip)来力争解决上述问题。解决方法如下:
1.  Codec代码独立,不再耦合与CPU,这样可以增加Codec代码重复利用。
2.  在Codec和Soc之间通过简单的I2S/PCM音频接口通信,这样SOC和Codec只需要注册自己相关的接口到ASOC code即可。
3.  动态的电源管理(Dynamic Audio Power Management)DAPM。DAPM始终将Codec自动设置在最低功耗状态运行。
4.  消除pop音。控制各个widget上下电的顺序消除pop音。
5.  添加平台相关的控制,运行平台添加控制设备到声卡。

ASOC音频架构

为了实现上述的新feature,ASOC将嵌入式音频系统分为三大类可重复使用的驱动程序:  Platform,  Machine,  Codec。
Codec类:     Codec即编解码芯片的驱动,此Codec驱动是和平台无关,包含的功能有:  音频的控制接口,音频读写IO接口,以及DAPM的定义等。如果需要的话,此Codec类可以在BT,FM,MODEM模块中不做修改的使用。因此Codec就是一个可重复使用的模块,同一个Codec在不同的SOC中可以使用。
Platform类:  可以理解为某款SOC平台,平台驱动中包括音频DMA引擎驱动,数字接口驱动(I2S, AC97, PCM)以及该平台相关的任何音频DSP驱动。同样此Platform也可以重用,在不同的Machine中可以直接重复使用。
Machine类:  Machine可以理解为是一个桥梁,用于在Codec和Platform之间建立联系。此Machine指定了该机器使用那个Platform,那个Codec,最终会通过Machine建立两者之间的联系。
在软件上可以抽象如下图:

ASOC数据结构

在分析整个ASOC的过程中,出现了众多的数据结构,在此先理清重要的数据结构的关系。如下图:
可以看到Machine是连接Codec和Platform之间的桥梁,因此首先要分析Machine部分,在下节分析Machine部分。

Linux音频驱动-ASOC(ALSA System on Chip)相关推荐

  1. Linux 音频驱动(五) ALSA音频驱动之PCM逻辑设备

    目录 1. 前言 2. PCM逻辑设备 2.1. 创建 PCM逻辑设备: 2.2. PCM逻辑设备文件操作函数集:snd_pcm_f_ops[] 2.3. Open PCM逻辑设备 2.4. Writ ...

  2. linux音频驱动之ALSA框架

  3. Linux 音频驱动(一) ASoC音频框架简介

    目录 1. ALSA简介 2. ASoC音频驱动构成 3. PCM数据流 4. 数据结构简介 5. ASoC音频驱动注册流程 1. ALSA简介 Native ALSA Application:tin ...

  4. Linux音频子系统(2) - ALSA ASoC

    1. linux音频子系统介绍 Linux音频系统比较复杂,各层间有很多交叉,可能是最无序的子系统. 1.1 ALSA ALSA 是 Advanced Linux Sound Architecture ...

  5. Linux 音频驱动(四) ASoC音频驱动之Machine驱动

    目录 1. 基本介绍 2. 源码分析 2.1. Machine数据结构 struct snd_soc_dai_link 3. 声卡 3.1. 数据结构struct snd_soc_card 3.2. ...

  6. 转载:Linux音频驱动-OSS和ALSA声音系统简介及其比较

    Linux音频驱动-OSS和ALSA声音系统简介及其比较 概述 昨天想在Ubuntu上用一下HTK工具包来绘制语音信号的频谱图和提取MFCC的结果,但由于前段时间把Ubuntu升级到13.04,系统的 ...

  7. Linux 音频驱动(二) ASoC音频驱动之Platform驱动

    目录 1. 简介 2. 源码分析 2.1. CPU DAI 2.1.1. 数据结构struct snd_soc_dai_driver 2.1.2. 注册CPU DAI:snd_soc_register ...

  8. Linux 音频驱动

    Linux 音频驱动 硬件介绍 WM8960与IMX6ULL之间有两个通信接口:I2C和I2S 其中I2C用于配置WM8960 I2S用于音频数据传输 修改设备树文件 编写I2C子节点设备树 code ...

  9. STM32MP157驱动开发——Linux 音频驱动

    STM32MP157驱动开发--Linux 音频驱动 一.简介 1.CS42L51 简介 2.I2S总线 3.STM32MP1 SAI 总线接口 二.驱动开发 1.音频驱动 1)修改设备树 i2c 接 ...

  10. linux 音频架构绕过,linux音频驱动架构

    1.linux音频驱动架构分为3部分组成:硬件无关层(核心层ALSA).板级音频数字接口层驱动(McASP.McBSP等).外部codes驱动 sound/soc/davinci/ti81xx-etv ...

最新文章

  1. java 16进制与图片互转
  2. linux内核杂记(17)-内核链表结构(1)
  3. NOIP2007 字符串的展开
  4. 服务器开发中网络数据分析与故障排查经验
  5. [剑指offer]面试题第[41]题[Leetcode][第235题][JAVA][数据流中的中位数][优先队列][堆]
  6. leetcode13. 罗马数字转整数
  7. 如何反映两条曲线的拟合精度_用水平仪如何检测导轨的直线度?
  8. mysql 创建定时任务_mysql创建定时任务
  9. JS 获取指定URL的时间
  10. 消息队列(MQ):ZeroMQ基本原理
  11. 数据结构-约瑟夫问题课后作业
  12. 设计模式 (十六) 命令模式
  13. 泰拉瑞亚服务器存档位置,泰拉瑞亚国服存档怎么恢复 国服存档位置
  14. SCRUM敏捷开发教程
  15. IT 接口对接:足迹第十二步接口对接的定义(接口对接分三种:中间库方式的接口对接,Rest格式URL对接和HTTP格式URL对接;)
  16. SOT-223 封装尺寸图
  17. R包的安装以及安装失败的解决
  18. android qq 邮箱格式,QQ邮箱的正确格式有哪些?文件夹怎么发送呢
  19. Codevs 4246 奶牛的身高
  20. elementui select选中获取整个item对象以及回显

热门文章

  1. sqli-labs Less-11 and Less-12
  2. 互不侵犯king (状压dp)
  3. javascript string对象方法总结
  4. 我们是这样写升级日志的,处处可以体现人文情怀
  5. 如何往一个指定的地址写入一个值呢
  6. WaitForMultipleObjects、WaitForSingleObject、GetExitCodeThread
  7. xgboost算法_xgboost算法学习心得
  8. java循环语句_Java十四天零基础入门-Java for循环语句
  9. 【微服务直播】60分钟掌握微服务治理之道
  10. 78. Subsets 1