从傅里叶看codec加载流程

从fs2105器件大体分析codec驱动加载流程
目录
1、Fs2105源码路径 2
2、Fs2105驱动加载codec端 3
一、Frsm_codec_init 4
二、snd_soc_register_component 5
三、snd_soc_add_component 5
① Snd_soc_component_initialize 6
② snd_soc_register_dais 6
3、Platform端 7
4、Machine端 8
一、Card结构体dai_link相关定义 8
二、Card创建的大体流程 9
三、snd_soc_bind_card 10
四、snd_soc_instantiate_card 10

工程使用的codec为foursemi(傅里叶) fs2105器件
此器件分别挂载在两路i2c上,i2c1和i2c2此两路。其中i2c1挂载了四个,i2c2挂载了1个,共五个器件,i2c1上的器件通过slave地址加以区分,fs2105驱动probe函数会重入5次。由下图的配置信息可知,此五个器件公用控电开关
1、Fs2105源码路径
源代码路径:src/kernel/linux/v5.4_mt8518/sound/soc/codecs/fs2105
Dts: src/kernel/linux/v5.4_mt8518/arch/arm/boot/dts/aud8518sp2-worldelite-ms117-user.dts

在这里插入图片描述

2、Fs2105驱动加载codec端
Codec端比较通过的加载流程
在这里插入图片描述

一、Frsm_codec_init
由于项目上挂了5个fs2105器件,所以驱动probe会重入5次。Codec _driver是同一个,但是Codec_dai的名字需要彼此区别,所以由frsm_codec_init这个函数代码实现字符串拼接.其中下标由dts配置
在这里插入图片描述

二、snd_soc_register_component
在这里插入图片描述

这个函数是codec注册调用的入口函数,这里主要是分配了一个结构体指针。后续主要就是填充这个结构体的成员变量

三、snd_soc_add_component
这个接口是核心接口,基本上codec和platform都会调用此函数完成component结构体的填充,并最终挂到全局链表上被后的 machine创建card进行操作。
在这里插入图片描述
① Snd_soc_component_initialize
在这里插入图片描述
这个函数可以看到component成员name是如何赋值的,后面的绑定操作中,匹配component需要用到。有两种匹配,其中的一个就是name全匹配。如何用这个匹配,就需要确认具体的名字,最好能打印出来以免无法匹配成功。大部分时候用的是节点匹配这个在dts中容易操作和确认

② snd_soc_register_dais
在这里插入图片描述
在这里插入图片描述
3、Platform端
Platform源文件
文件目录:src/kernel/linux/v5.4_mt8518/sound/soc/mediatek/mt8518/mt8518-afe-pcm.c
在这里插入图片描述
4、Machine端
Ms117项目machine源文件
文件目录:src/kernel/linux/v5.4_mt8518/sound/soc/mediatek/mt8518/mt8518-evb.c
相关dts配置如下图:
在这里插入图片描述
此源文件里面有个函数mt8518_evb_parse_of会解析dts,并根据里面的配置动态的修改源码里面的结构体数组成员dai_link codec和codec_dai的赋值。具体的看mt8518_evb_dais结构体数组和上面的那个函数,由于这两个函数代码太长这里就不贴图分析了。
一、Card结构体dai_link相关定义
在这里插入图片描述
这里定义的platform结构体成员为空,codec成员将会被dts的配置信息改写,cpu只赋值了cpu的dai_name成员
在这里插入图片描述
二、Card创建的大体流程
在这里插入图片描述

三、snd_soc_bind_card
这个函数基本上就是创建card的api初始入口函数,基本都会走这里。这段代码包含两部分,一部分是创建card的核心函数,另外一段就是完成之后对gpio的控电处理。是否需要进入睡眠模式
在这里插入图片描述
四、snd_soc_instantiate_card
用思维导图画的此函数大体嵌套流程,由于图太大这里不能一个屏幕显示出来
snd_soc_instantiate_card.emmx
这个函数按代码流程从上到下大体可以分为:
1、 进行初始的合法性check,完全没有component匹配直接返回错误
2、 初始化动态电源管理结构体
3、 创建pcm_runtime,分别通过cpu&cpu_dai codec&codec_dai获取满足条件的component用以填充结构体rtdcom_list,并挂到rtd成员链表上。后续就不用再次查找直接使用rtd的链表
4、 Aux音频辅助接口的bind
5、 将card上所有的dai_link都挂到card成员dai_link_list链表上
6、 创建snd_card结构体对象并初始化,包括创建必要的dev和在proc目录下创建相关card文件目录
7、 解析card dapm_widgets和of_dapm_widgets电源组件并统一添加到card 成员dapm链表上去
8、 card probe回调函数调用要,如果有
9、 codec和cpu驱动的probe函数调用,并将可能存在的电源部分加到统一的链表上
10、aux设备的操作与9同样的操作步骤
11、dai和codec_dai的probe函数调用。

card创建的大体流程图如下
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bruk_spp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值