作者:陈甲印
职位:鸿湖万联产品推荐官 软通动力高级技术专家
RK系列开发板音频驱动适配(一)
背景:
多媒体系统目前在Linux操作系统,windows操作系统已经非常成熟,并且应用场景广泛,但是,基于OpenAtom OpenHarmony(以下简称“OpenHarmony”)操作系统,目前如果使用到多媒体(音频)是需要做一系列的适配动作,才能应用到各种场景。
方案:
基于OpenHarmony适配RK系列开发板音频驱动总体方案是:基于HDF框架和ADM模型,在内核层中创建DAI、DMA和Codec三个模块,并实现例化ADM定义的DAI、DMA和Codec回调业务接口,ADM通过这些接口实现音频数据处理与功能控制;然后再通过HCS配置设备节点和服务,通过HDF的服务管理机制,对内核层和用户层提供服务。
针对DAI、DMA和Codec,首先分别创建对应的适配器模块(RK系列开发板daiadapter、RK系列开发板dmaadapter、es8838codecadapter),在其中实现驱动的注册、绑定、初始化和释放;然后分别创建三者对应的操作集模块(RK系列开发板daiops、RK系列开发板dmaops、es8838codecops),在其中实现所有ADM定义的对应业务接口;最后在deviceinfo.hcs中配置三者公有的参数,若需要配置私有参数,则还需要分别创建三者对应的HCS配置文件(daiconfig.hcs、dmaconfig.hcs、codecconfig.hcs)。
RK系列开发板 DAI模块适配:
DAI主要作用是通过I2S将Soc与Codec连接,实现在Soc和Codec之间音频数据的传输,其中I2S驱动由HDF框架提供。ADM定义的DAI接口包括:DAI设备初始化、读写(Soc的)寄存器、音频设备启动、下发硬件参数和事件监听共6个接口。
在适配器模块中实例化ADM定义的DAI两个结构体:DaiData(SoC端DAI数据集)和AudioDaiOps(SoC端DAI操作集);在操作集模块中实现6个ADM定义的DAI的业务接口函数;配置DAI设备节点公有参数,若有需要,则可配置SoC端的I2S寄存器信息等私有参数。
RK系列开发板 DAI模块关系
RK系列开发板daiadapter
实例化SoC端DAI操作集:g_daiDeviceOps,核心成员字段值定义如下:
Startup = RK系列开发板DaiStartup;
HwParams = RK系列开发板DaiHwParams;
Trigger = RK系列开发板DaiTrigger。
实例化SoC端DAI数据集:g_daiData,核心成员字段值定义如下:
DaiInit = RK系列开发板DaiDeviceInit;
Read = RK系列开发板DaiDeviceReadReg;
Write = RK系列开发板DaiDeviceWriteReg;
ops = &g_daiDeviceOps,SoC端DAI操作集地址。
实例化HdfDriverEntry类型的DAI驱动实体:g_daiDriverEntry,核心成员字段值定义如下:
moduleVersion = 1,模块版本号;
moduleName = "DAI_RK系列开发板",模块名;
Bind = DaiDriverBind;
Init = DaiDriverInit;
Release = DaiDriverRelease。
DAI驱动注册到鸿蒙系统:HDFINIT(gdaiDriverEntry)
实现以下函数:
DaiDriverInit,DAI驱动初始化函数;
DaiDriverBind,DAI驱动绑定函数;
DaiDriverRelease,DAI驱动释放函数。
RK系列开发板 daiops
实现以下函数:
RK系列开发板DaiDeviceInit,初始化SoC端DAI设备函数;
RK系列开发板DaiDeviceReadReg,读SoC端DAI设备寄存器函数;
RK系列开发板DaiDeviceWriteReg,写SoC端DAI设备寄存器函数;
RK系列开发板DaiStartup,启动SoC端DAI设备函数;
RK系列开发板DaiHwParams,下发SoC端DAI硬件参数函数;
RK系列开发板DaiTrigger,监听并处理事件函数。
总结:
在OpenHarmony操作系统中,适配音频驱动是非常重要的一个模块,本文只是其中的一个步骤,DAI模块适配,通过示意图的分析,以及核心代码的指导,相信读者会对音频适配有一个基本的了解,之后的文章中,会逐步更新音频驱动的DMA模块适配、Codec模块适配、Audio HCS配置等。
RK系列开发板音频驱动适配(二)
背景:
上一篇文章RK系列开发板音频驱动适配指南-DAI模块适配中已经阐述音频驱动适配的DAI模块适配步骤以及核心代码的展示,本次主要介绍音频驱动适配中的DMA模块适配。
RK系列开发板 DMA模块适配:
DMA是一种无需要CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制,其主要作用是实现音频数据在SoC设备与内存之间的传输,并对循环缓存中的数据进行管理。ADM定义的DMA接口包括:DMA设备初始化、内存的分配与释放、DMA通道的申请与配置、DMA预处理、暂停与恢复、音频数据的提交与悬挂和循环缓存管理共11个接口。
在适配器模块中实例化ADM定义的DAI两个结构体:PlatformData(DMA数据集)和AudioDmaOps(DMA操作集);在操作集模块中实现DMA的业务接口函数;配置DMA设备节点公有参数,若有需要,则可配置DMA相关寄存器信息等私有参数。
RK系列开发板 DMA模块关系
RK系列开发板dmaadapter
实例化DMA操作集:g_dmaDeviceOps,核心成员字段值定义如下:
DmaBufAlloc = RK系列开发板DmaBufAlloc;
DmaBufFree = RK系列开发板DmaBufFree;
DmaRequestChannel = RK系列开发板DmaRequestChannel;
DmaConfigChannel = RK系列开发板DmaConfigChannel;
DmaPrep = RK系列开发板DmaPrep;
DmaSubmit = RK系列开发板DmaSubmit;
DmaPending = RK系列开发板DmaPending;
DmaPause = RK系列开发板DmaPause;
DmaResume = RK系列开发板DmaResume;
DmaPointer = RK系列开发板PcmPointer。
实例化DMA数据集:g_platformData,核心成员字段值定义如下:
PlatformInit= RK系列开发板DmaDeviceInit;
ops = &g_dmaDeviceOps,DMA操作集地址;
实例化HdfDriverEntry类型的DAI驱动实体:
g_platformDriverEntry,核心成员字段值定义如下:
moduleVersion = 1,模块版本号;
moduleName = "DMA_RK系列开发板",模块名;
Bind = DmaDriverBind;
Init = DmaDriverInit;
Release = DmaDriverRelease。
DMA驱动注册到鸿蒙系统:HDFINIT(gplatformDriverEntry)
实现以下函数:
DmaDriverInit,DMA驱动初始化函数;
DmaDriverBind,DMA驱动绑定函数;
DmaDriverRelease,DMA驱动释放函数。
RK系列开发板dmaops
实现以下函数:
RK系列开发板DmaDeviceInit,初始化DMA设备函数;
RK系列开发板DmaBufAlloc,分配数据内存函数;
RK系列开发板DmaBufFree,释放数据内存函数;
RK系列开发板DmaRequestChannel,申请DMA通道函数;
RK系列开发板DmaConfigChannel,配置DMA通道函数;
RK系列开发板DmaPrep,DMA预处理函数;
RK系列开发板DmaPause,暂停函数;
RK系列开发板DmaResume,恢复函数;
RK系列开发板DmaSubmit,提交数据函数;
RK系列开发板DmaPending,悬挂数据函数;
RK系列开发板PcmPointer,管理数据缓存函数。
总结:
本文详细介绍DMA的适配步骤以及核心代码,相信读者会对音频适配会有一个更清楚深入的了解,之后的文章中,会逐步更新音频驱动的Codec模块适配、Audio HCS配置等。
更多 “RK系列开发板音频驱动适配指南” 点击下方的文章链接阅读。
原文标题:【开源项目】基于OpenHarmony的RK系列开发板音频驱动适配方案
文章出处:【微信公众号:电子发烧友论坛】欢迎添加关注!文章转载请注明出处。
全部0条评论
快来发表一下你的评论吧 !