作者:陳甲印
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系列開發板音頻驅動適配指南”點擊下方的文章鏈接閱讀。
-
開發板
+關注
關注
25文章
5081瀏覽量
97683 -
OpenHarmony
+關注
關注
25文章
3727瀏覽量
16391
原文標題:【開源項目】基于OpenHarmony的RK系列開發板音頻驅動適配方案
文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論