1.概述
前面章节介绍了codec与platform驱动,但是仅仅只有这两个驱动,是无法构成一个完整的声卡来进行正常的工作的,需要Machine驱动来把他们串起来。个人理解machine驱动就是用来实例化一个声卡节点的,一般在Linux下 /proc/asound/cards。
2.代码研究
一般通用的machine驱动在的路径是kernel\sound\soc\generic\simple-card.c,此驱动可以适用于一般的场景。
不过上述这个驱动只适用单个codec对单个dai,rk为了支持多个dai对多个codec 做了kernel\sound\soc\rockchip\rockchip_multicodecs.c这个新machine驱动,接下来将以此驱动展开概述。
2.1关键的数据结构
2.1.1 snd_soc_dai_link
截取了部分 主要说几个关键字段。
cpu_dai_name:音频链路需要找到cpu_dai对应的名称,platform 驱动在probe的时候会去把这个字段添加到dai_list,machine驱动会去遍历找到同名的。
platform_name:machine驱动音频链路需要遍历platform_list名称,找到对应与之相符的。
codec_name:machine驱动音频链路需要遍历codec_list名称,找到对应与之相符的。
codec_dai_name:machine驱动音频链路需要遍历codec_dai_list名称,找到对应与之相符的。
ops:一些关键的回调函数。用于配置codec_dai cpu_dai 系统时钟。
2.2 dts配置:
一般关键的就这些字段,当然还有一些别的字段就不一一列举了,在machine驱动中会去一一解析这些字段再把platform驱动与codec驱动串起来。
2.3 rockchip_multicodecs.c
匹配还是会用到Linux platform设备总线框架,不过与大多数不通的是,这个文件没有写Init接口,而是用了另外个宏module_platform_driver
这个宏其实就是写了 init 与 exit接口来调用platform_driver_register,platform_driver_unregister来装载卸载驱动。
匹配成功后调用probe函数解析设备树对应信息,给dai_link结构体赋值,后续会调用到
devm_snd_soc_register_card->snd_soc_register_card来注册声卡。
主要调用流程如下图: