背景:
前两篇文章曾经具体解说了DAI驱动适配、DMA驱动适配,本次次要介绍音频驱动适配中的Codec模块适配。
RK系列开发板 ES8388 Codec模块适配:
Codec其次要作用是对PCM(Pulse Code Modulation)或Mic、Linein等输出的信号进行D/A或A/D转换,并对音频信号做出相应的解决,如音量控制等;且对音频通路进行管制。Soc与Codec别离通过I2S实现音频数据传输,通过I2C与实现管制信号传输(非SoC内置的Codec时),其中I2C驱动由HDF框架提供。ADM定义的Codec接口包含:Codec设施初始化、读写寄存器、Codec DAI初始化、Codec DAI启动和Codec DAI下发硬件参数共6个接口。
在适配器模块中实例化ADM定义的DAI两个构造体:CodecData(Codec数据集)、DaiData(Codec端DAI数据集)和AudioDaiOps(Codec端DAI操作集);在操作集模块中实现Codec的业务接口函数,若非SoC内置Codec时,则还须要实现通过I2C读写Codec寄存器的性能函数;配置Codec设施节点私有参数,若有须要,则可配置Codec相干寄存器信息等公有参数。
文件门路与构造:
- 文件门路:device/rockchip/RK系列开发板/audio/codec
- 文件构造
├── codec
├── include
│ └── es8388_codec_ops.h
└── src
├──es8388_codec_adapter.c
└──es8388_codec_ops.c
RK系列开发板 Codec模块关系:
1.1.es8388 codecadapter
•实例化Codec数据集:g_es8388Data,核心成员字段值定义如下:
Init = Es8388DeviceInit;
Read = Es8388DeviceRegRead;
Write = Es8388DeviceRegWrite。
•实例化Codec端DAI操作集:g_es8388DaiDeviceOps,核心成员字段值定义如下:
Startup = Es8388DaiStartup;
HwParams = Es8388DaiHwParams。
•实例化Codec端DAI数据集:g_es8388DaiData,核心成员字段值定义如下:
DaiInit = Es8388DaiDeviceInit;
drvDaiName = "codec_dai",Codec端DAI驱动名称
ops = &g_es8388DaiDeviceOps,Codec端DAI操作集地址。
•实例化HdfDriverEntry类型的Codec驱动实体:g_es8388DriverEntry,核心成员字段值定义如下:
moduleVersion = 1,模块版本号;
moduleName = "CODEC_ES8388",模块名;
Bind = CodecDriverBind;
Init = CodecDriverInit;
Release = CodecDriverRelease。
Codec驱动注册到鸿蒙零碎:HDFINIT(ges8388DriverEntry)。
•实现以下函数:
CodecDriverInit,Codec驱动初始化函数;
CodecDriverBind,Codec驱动绑定函数;
CodecDriverRelease,Codec驱动开释函数。
1.2.es8388codecops
•实现以下函数:
Es8388DeviceInit,初始化Codec设施函数;
Es8388DeviceRegRead,读Codec设施寄存器函数;
Es8388DeviceRegWrite,写Codec设施寄存器函数;
Es8388DaiDeviceInit,初始化Codec端DAI设施函数;
Es8388DaiStartup,启动Codec端DAI设施函数;
Es8388DaiHwParams,下发Codec端DAI硬件参数函数。
总结:
本文具体介绍Codec 模块适配步骤以及外围代码,联合前两篇的音频驱动适配文章置信读者会对音频适配根本曾经把握了外围点,之后的文章中,会逐渐更新音频驱动的Audio HCS配置等。