第2篇 ASOC驱动框架

参考:韦东山Linux教程
参考:https://blog.csdn.net/yangjizhen1533/article/details/113865973?spm=1001.2014.3001.5502

  1. 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。

image

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

posted @   charlie12345  阅读(156)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示