第1篇 ASOC驱动框架
ASOC框架介绍
var code = "99bac6f6-6ecb-4dac-ae2a-de73e7ca75eb"
框架:
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()