1 简介
一般就是用于 A/D 与 D/A转换编解码等等。
2 codec 驱动代码解析
2.1 codec常见功能部件
2.2 codec驱动分析
2.2.1 注册
主控为rk的平台,以es8323.c为例(es8388也可以用此驱动)来进行分析,目前用的是es8388这个芯片
由于es8388 在我的板子上是挂在i2c0这个总线 下所以配置的dts也应该对应上。
对于i2c 子系统不太了解的 可以查阅我之前写的文章
linux i2c驱动(三)I2C主从设备驱动-CSDN博客
https://blog.csdn.net/Terrble_liar/article/details/137709501?spm=1001.2014.3001.5502
对应的设备树如下:
主要看es8388 这个节点
compatible 与 驱动中对应上 原本是没有es8388的 可以自行添加。
匹配成功后调用到es8323_i2c_probe 根据此函数展开分析。probe中会调用到snd_soc_register_codec 用来注册 codec的设备driver 与 dai driver,有些codec驱动可能用的是snd_soc_register_component,不过都是大同小异的 我们就snd_soc_register_codec来分析。
调用到snd_soc_register_codec主要会做以下三个事情
1.初始化component结构体的关键的成员,dai_drv component_drv等等。
2.获取dapm(Dynamic Audio Power Management的缩写,直译过来就是动态音频电源管理的意思)的资源。
3.注册codec这段的dai驱动。把dai 与 component联系起来
2.2.2 关键的结构体
路径 kernel\include\sound\soc.h
struct snd_soc_component:
codec这段的组件 里面会包含 snd_soc_dai_driver也就是codec端dai控制器的驱动,以及snd_soc_component_driver,可以理解为codec其他一些功能组件的驱动。
snd_soc_dai_driver:
关键点会包含snd_soc_dai_ops,里面包含了一些dai的功能,列如启动关闭等等相关的一些操作。
可以看到在es8388的驱动中都是有相关实现的。
snd_soc_codec_driver:
codec本身的driver相关的一些函数接口,列如probe remove,IO操作等等。