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

Linux的ASoC音频驱动中,Machine驱动作为平台、Codec驱动的粘合剂,负责建立音频回路。本文分析了Machine数据结构`struct snd_soc_dai_link`,以及声卡数据结构`struct snd_soc_card`,并详细阐述了注册声卡过程,特别是`soc_probe()`函数的角色。
摘要由CSDN通过智能技术生成

1. 基本介绍

Linux 音频驱动(二) ASoC音频驱动之Platform驱动Linux 音频驱动(三) ASoC音频驱动之Codec驱动分别介绍了platform驱动、codec驱动,但仅有platform驱动、codec驱动是不能工作的,需要一个角色把codec、codec_dai、cpu_dai、platform给链结起来才能构成一个完整的音频回路,这个角色就由machine承担了。
Machine 可以理解为对开发板的抽象,开发板可能包括多个声卡,对应machine部分包含多个link。

注:上面论述中出现了两种platform,其实它们本质是不一样的。
还记得在platform驱动中,PCM DMA是用struct snd_soc_platform_driver描述的吗?所以红色字体的platform其实指代PCM DMA。

对于Machine 驱动程序Linux官方解释如下: Machine class driver: The machine driver class acts as the glue that describes and binds the other component drivers together to form an ALSA “sound card device”. It handles any machine specific controls and machine level audio events (e.g. turning on an amp at start of playback).
Machine 驱动程序充当描述和绑定其他组件驱动程序以形成ALSA “声卡设备” 粘合剂。它可以处理任何机器特定的控制和机器级音频事件(例如,在播放开始时打开放大器)。

从这论述中我们可以得出:
Machine 驱动是粘合剂,它将其他组件驱动 “粘在一起” 形成了 “声卡设备”。

2. 源码分析

Kernel 版本:3.10
Machine 驱动控制管理platform和codec之间的连接匹配,其抽象的结构体为struct snd_soc_dai_link。

2.1. Machine数据结构 struct snd_soc_dai_link
struct snd_soc_dai_link {
   
	/* config - must be set by machine driver */
	const char *name;			/* Codec name */
	const char *stream_name;		/* Stream name */
	/*
	 * You MAY specify the link's CPU-side device, either by device name,
	 * or by DT/OF node, but not both. If this information is omitted,
	 * the CPU-side DAI is matched using .cpu_dai_name only, which hence
	 * must be globally unique. These fields are currently typically used
	 * only for codec to codec links, or systems using device tree.
	 */
	const char *cpu_name;
	const struct device_node *cpu_of_node;
	/*
	 * You MAY specify the DAI name of the CPU DAI. If this information is
	 * omitted, the CPU-side DAI is matched using .cpu_name/.cpu_of_node
	 * only, which only works well when that device exposes a single DAI.
	 */
	const char *cpu_dai_name;
	/*
	 * You MUST specify the link's codec, either by device name, or by
	 * DT/OF node, but not both.
	 */
	const char *codec_name;
	const struct device_node *codec_of_node;
	/* You MUST specify the DAI name within the codec */
	const char *codec_dai_name;
	/*
	 * You MAY specify the link's platform/PCM/DMA driver, either by
	 * device name, or by DT/OF node, but not both. Some forms of link
	 * do not need a platform.
	 */
	const char *platform_name;
	const struct device_node *platform_of_node;
	int be_id;	/* optional ID for machine driver BE identification */

	const struct snd_soc_pcm_stream *params;
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值