第1篇 ASOC驱动框架

charlie12345 / 2023-09-04 / 原文

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()