ASOC驱动框架

发布时间 2023-09-04 11:00:53作者: charlie12345
框架: 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()