一、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