linux ALSA 驱动架构

一、kernel Audio驱动架构主流有两大类,一类是SOC Machine架构,另一类是simple-card架构。

MTK、QCom主要采用machine架构,rockchip采用simple card架构。

二、Machine架构驱动介绍

machine 架构每家平台实现并不完全相同,machine driver和platform driver都有平台厂商提供,codec driver无特殊要求,符合ALSA SOC-codec driver标准即可

(1)驱动组成

machine driver:主要负责注册card,并且注册dai-link下的codec(包括cpu dai和codec dai)dai-link一般在C文件中配置 

platform driver:即cpu dai的驱动,包括DMA配置和I2S配置

codec driver:即外部codec的驱动,如ak4642、rt5644等

DTSI也分为三个部分:

sound:对应machine driver

i2s:对应platform driver

codec:对应外部codec ic driver

(2)platform driver和codec driver注册流程

两者原理一样,都是通过devm_snd_soc_register_component向SOC Core中注册两个component。

所有注册的component都保存在soc-core.c的component_list中。

(3)Machine driver流程

首先配置dai-link,然后通过devm_snd_soc_register_card 调用snd_soc_register_card注册card并且解析dai-link,

调用snd_soc_card_probe调用platform driver的dai_probe函数

调用soc_probe_link_components最终调用components的 codec probe函数

同时注册codec中的kconctrl和dpam 

三、simple架构

(1)驱动组成

simple-card Driver: kernel\sound\soc\generic\simple-card.c  ,标准Linux驱动,各平台通用

SOC-I2S Driver:

codec Driver:

DTSI:

大致和machine 架构类似,都分为三个部分,主要差异在simple-card架构DTSI可以配置dai-link和route

如:

	rt5640-sound {
		compatible = "simple-audio-card";
		simple-audio-card,name = "rockchip,rt5640-codec";
		simple-audio-card,format = "i2s";
		simple-audio-card,mclk-fs = <256>;
		simple-audio-card,widgets =
			"Microphone", "Mic Jack",
			"Headphone", "Headphone Jack";
		simple-audio-card,routing =
			"Mic Jack", "MICBIAS1",
			"IN1P", "Mic Jack",
			"Headphone Jack", "HPOL",
			"Headphone Jack", "HPOR";

		simple-audio-card,cpu {
			sound-dai = <&i2s1>;
		};

		simple-audio-card,codec {
			sound-dai = <&rt5640>;
		};
	};

各Driver Probe流程和machine相同,都是调用 devm_snd_soc_register_card和devm_snd_soc_register_component两个函数。

以上函数是基于kernel5的,低版本接口类似,只是codec结构体名字变了。

四:其他

DTSI类似simple-card(支持dai-link)的machine driver

kernel\sound\soc\samsung\snow.c

你可能感兴趣的:(Linux,android,Audio,ALSA)