第2篇 ASOC驱动框架
参考:韦东山Linux教程
参考:https://blog.csdn.net/yangjizhen1533/article/details/113865973?spm=1001.2014.3001.5502
- ALSA框架图
Native ALSA Application:tinyplay/tinycap/tinymix,这些用户程序直接调用 alsa 用户库接口来实现放音、录音、控制。
ALSA Library API:alsa 用户库接口,常见有 tinyalsa、alsa-lib。
ALSA CORE:alsa 核心层,向上提供逻辑设备(PCM/CTL/MIDI/TIMER/…)系统调用,向下驱动硬件设备(Machine/I2S/DMA/CODEC)。
ASoC CORE:asoc 是建立在标准 alsa core 基础上,为了更好支持嵌入式系统和应用于移动设备的音频 codec 的一套软件体系。
Hardware Driver:音频硬件设备驱动,由三大部分组成,分别是 Machine、Platform、Codec。
- ASOC架构层次和重要数据说明
框架:
user space:
app: tinyplay tinycap
------------------------------------------------------
lib: alsa-lib
================================================================
kernel space:
ALSA CORE: PCM, CONTROL, MIDI ......
声卡 : struct snd_soc_card
.struct snd_card *snd_card; //controls 链表
.struct snd_soc_dai_link *dai_link; //即对应 machine
.struct snd_kcontrol_new *controls; //CONTROL
注册声卡 snd_soc_register_card() //通过 platform bus 架构
生成 PCM 逻辑设备 cdev : /dev/pcmC0D0c(录音), /dev/pcmC0D0p(播放)
生成 controls 逻辑设备 cdev:/dev/controlC0(控制音量等)
------------------------------------------------------
ASOC CORE: 提供一些注册函数,承上启下
注册 CPU_DAI : snd_soc_register_dai()
注册 PCM_DAI : snd_soc_register_platform()
注册 Codec
注册 Codec_DAI : snd_soc_register_dais()
------------------------------------------------------
Hardware Driver:
Machine : struct snd_soc_dai_link
指定下面的 Platform 和 Codec :
codec_name, platform_name, cpu_dai_name, codec_dai_name, ops
Platform :
CPU_DAI : struct snd_soc_dai_driver
.name //machine 中的 dai_link 通过 cpu_dai_name 来匹配 cpu_dai
.palyback //回放数据流性能描述信息
.capture //录制数据流性能描述信息
.ops //操作函数集合,将数据从 I2S_Tx_buf --> Codec
PCM_DMA : struct snd_soc_platform_driver
.name
.struct snd_kcontrol_new *controls; //音频控件指针
.ops //操作函数集合,操作 DMA_buf --> I2S_Tx_buf
Codec:
Codec : struct snd_soc_code_driver
.struct snd_kcontrol_new *controls; //音频控件指针
.set_sysclk : 时钟配置函数
.read : 读取 Codec 寄存器接口, 如可通过 /dev/controlC0 读取 Codec 的音量
.write : 写入 Codec 寄存器接口, 如可通过 /dev/controlC0 设置 Codec 的音量
Codec_DAI: struct snd_soc_dai_driver
.name //machine 中的 dai_link 通过 codec_dai_name 来匹配 codec_dai
.palyback //回放数据流性能描述信息
.capture //录制数据流性能描述信息
.ops //操作函数集合,配置 DAI 时钟,格式 等
================================================================
硬件:
struct snd_kcontrol_new controls
.iface: 指定 control 类型
.name: 该 control 的名字
.info:
.get: 获取该控件当前的状态值
.put: 设置控件的状态值
.private_value: 长整型数据,可通过 info get put 函数来访问
比如对于普通控件, private_value 可用来定义该控件所对应的寄存器的地址以及对应的控制位 (最后通过 struct snd_soc_code_driver 的 .read/.write 实现)
.tlv:作用有点类似 private_value
//注册 controls : snd_soc_add_controls() //实际是注册到 snd_card 的 controls 链表中
|
|snd_soc_add_controls()
|
|snd_ctl_add()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)