RK系列开发板音频驱动适配指南(一)
RK系列开发板音频驱动适配指南(二)
RK系列开发板音频驱动适配指南(三)
RK系列开发板音频驱动适配指南(四)
背景:
前两篇文章已经详细讲解了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模块关系
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驱动释放函数。
es8388codecops
- 实现以下函数:
- Es8388DeviceInit,初始化Codec设备函数;
- Es8388DeviceRegRead,读Codec设备寄存器函数;
- Es8388DeviceRegWrite,写Codec设备寄存器函数;
- Es8388DaiDeviceInit,初始化Codec端DAI设备函数;
- Es8388DaiStartup,启动Codec端DAI设备函数;
- Es8388DaiHwParams,下发Codec端DAI硬件参数函数。
总结:
本文详细介绍Codec 模块适配步骤以及核心代码,结合前两篇的音频驱动适配文章相信读者会对音频适配基本已经掌握了核心点,之后的文章中,会逐步更新音频驱动的Audio HCS配置等。