作者:陳甲印
職位:鴻湖萬(wàn)聯(lián)產(chǎn)品推薦官軟通動(dòng)力高級(jí)技術(shù)專家
RK系列開發(fā)板音頻驅(qū)動(dòng)適配(一)
背景:
多媒體系統(tǒng)目前在Linux操作系統(tǒng),windows操作系統(tǒng)已經(jīng)非常成熟,并且應(yīng)用場(chǎng)景廣泛,但是,基于OpenAtom OpenHarmony(以下簡(jiǎn)稱“OpenHarmony”)操作系統(tǒng),目前如果使用到多媒體(音頻)是需要做一系列的適配動(dòng)作,才能應(yīng)用到各種場(chǎng)景。
方案:
基于OpenHarmony適配RK系列開發(fā)板音頻驅(qū)動(dòng)總體方案是:基于HDF框架和ADM模型,在內(nèi)核層中創(chuàng)建DAI、DMA和Codec三個(gè)模塊,并實(shí)現(xiàn)例化ADM定義的DAI、DMA和Codec回調(diào)業(yè)務(wù)接口,ADM通過(guò)這些接口實(shí)現(xiàn)音頻數(shù)據(jù)處理與功能控制;然后再通過(guò)HCS配置設(shè)備節(jié)點(diǎn)和服務(wù),通過(guò)HDF的服務(wù)管理機(jī)制,對(duì)內(nèi)核層和用戶層提供服務(wù)。
針對(duì)DAI、DMA和Codec,首先分別創(chuàng)建對(duì)應(yīng)的適配器模塊(RK系列開發(fā)板daiadapter、RK系列開發(fā)板dmaadapter、es8838codecadapter),在其中實(shí)現(xiàn)驅(qū)動(dòng)的注冊(cè)、綁定、初始化和釋放;然后分別創(chuàng)建三者對(duì)應(yīng)的操作集模塊(RK系列開發(fā)板daiops、RK系列開發(fā)板dmaops、es8838codecops),在其中實(shí)現(xiàn)所有ADM定義的對(duì)應(yīng)業(yè)務(wù)接口;最后在deviceinfo.hcs中配置三者公有的參數(shù),若需要配置私有參數(shù),則還需要分別創(chuàng)建三者對(duì)應(yīng)的HCS配置文件(daiconfig.hcs、dmaconfig.hcs、codecconfig.hcs)。
RK系列開發(fā)板 DAI模塊適配:
DAI主要作用是通過(guò)I2S將Soc與Codec連接,實(shí)現(xiàn)在Soc和Codec之間音頻數(shù)據(jù)的傳輸,其中I2S驅(qū)動(dòng)由HDF框架提供。ADM定義的DAI接口包括:DAI設(shè)備初始化、讀寫(Soc的)寄存器、音頻設(shè)備啟動(dòng)、下發(fā)硬件參數(shù)和事件監(jiān)聽(tīng)共6個(gè)接口。
在適配器模塊中實(shí)例化ADM定義的DAI兩個(gè)結(jié)構(gòu)體:DaiData(SoC端DAI數(shù)據(jù)集)和AudioDaiOps(SoC端DAI操作集);在操作集模塊中實(shí)現(xiàn)6個(gè)ADM定義的DAI的業(yè)務(wù)接口函數(shù);配置DAI設(shè)備節(jié)點(diǎn)公有參數(shù),若有需要,則可配置SoC端的I2S寄存器信息等私有參數(shù)。
RK系列開發(fā)板 DAI模塊關(guān)系
RK系列開發(fā)板daiadapter
實(shí)例化SoC端DAI操作集:g_daiDeviceOps,核心成員字段值定義如下:
Startup = RK系列開發(fā)板DaiStartup;
HwParams = RK系列開發(fā)板DaiHwParams;
Trigger = RK系列開發(fā)板DaiTrigger。
實(shí)例化SoC端DAI數(shù)據(jù)集:g_daiData,核心成員字段值定義如下:
DaiInit = RK系列開發(fā)板DaiDeviceInit;
Read = RK系列開發(fā)板DaiDeviceReadReg;
Write = RK系列開發(fā)板DaiDeviceWriteReg;
ops = &g_daiDeviceOps,SoC端DAI操作集地址。
實(shí)例化HdfDriverEntry類型的DAI驅(qū)動(dòng)實(shí)體:g_daiDriverEntry,核心成員字段值定義如下:
moduleVersion = 1,模塊版本號(hào);
moduleName = "DAI_RK系列開發(fā)板",模塊名;
Bind = DaiDriverBind;
Init = DaiDriverInit;
Release = DaiDriverRelease。
DAI驅(qū)動(dòng)注冊(cè)到鴻蒙系統(tǒng):HDFINIT(gdaiDriverEntry)
實(shí)現(xiàn)以下函數(shù):
DaiDriverInit,DAI驅(qū)動(dòng)初始化函數(shù);
DaiDriverBind,DAI驅(qū)動(dòng)綁定函數(shù);
DaiDriverRelease,DAI驅(qū)動(dòng)釋放函數(shù)。
RK系列開發(fā)板 daiops
實(shí)現(xiàn)以下函數(shù):
RK系列開發(fā)板DaiDeviceInit,初始化SoC端DAI設(shè)備函數(shù);
RK系列開發(fā)板DaiDeviceReadReg,讀SoC端DAI設(shè)備寄存器函數(shù);
RK系列開發(fā)板DaiDeviceWriteReg,寫SoC端DAI設(shè)備寄存器函數(shù);
RK系列開發(fā)板DaiStartup,啟動(dòng)SoC端DAI設(shè)備函數(shù);
RK系列開發(fā)板DaiHwParams,下發(fā)SoC端DAI硬件參數(shù)函數(shù);
RK系列開發(fā)板DaiTrigger,監(jiān)聽(tīng)并處理事件函數(shù)。
總結(jié):
在OpenHarmony操作系統(tǒng)中,適配音頻驅(qū)動(dòng)是非常重要的一個(gè)模塊,本文只是其中的一個(gè)步驟,DAI模塊適配,通過(guò)示意圖的分析,以及核心代碼的指導(dǎo),相信讀者會(huì)對(duì)音頻適配有一個(gè)基本的了解,之后的文章中,會(huì)逐步更新音頻驅(qū)動(dòng)的DMA模塊適配、Codec模塊適配、Audio HCS配置等。
RK系列開發(fā)板音頻驅(qū)動(dòng)適配(二)
背景:
上一篇文章RK系列開發(fā)板音頻驅(qū)動(dòng)適配指南-DAI模塊適配中已經(jīng)闡述音頻驅(qū)動(dòng)適配的DAI模塊適配步驟以及核心代碼的展示,本次主要介紹音頻驅(qū)動(dòng)適配中的DMA模塊適配。
RK系列開發(fā)板 DMA模塊適配:
DMA是一種無(wú)需要CPU的參與就可以讓外設(shè)與系統(tǒng)內(nèi)存之間進(jìn)行雙向數(shù)據(jù)傳輸?shù)挠布C(jī)制,其主要作用是實(shí)現(xiàn)音頻數(shù)據(jù)在SoC設(shè)備與內(nèi)存之間的傳輸,并對(duì)循環(huán)緩存中的數(shù)據(jù)進(jìn)行管理。ADM定義的DMA接口包括:DMA設(shè)備初始化、內(nèi)存的分配與釋放、DMA通道的申請(qǐng)與配置、DMA預(yù)處理、暫停與恢復(fù)、音頻數(shù)據(jù)的提交與懸掛和循環(huán)緩存管理共11個(gè)接口。
在適配器模塊中實(shí)例化ADM定義的DAI兩個(gè)結(jié)構(gòu)體:PlatformData(DMA數(shù)據(jù)集)和AudioDmaOps(DMA操作集);在操作集模塊中實(shí)現(xiàn)DMA的業(yè)務(wù)接口函數(shù);配置DMA設(shè)備節(jié)點(diǎn)公有參數(shù),若有需要,則可配置DMA相關(guān)寄存器信息等私有參數(shù)。
RK系列開發(fā)板 DMA模塊關(guān)系
RK系列開發(fā)板dmaadapter
實(shí)例化DMA操作集:g_dmaDeviceOps,核心成員字段值定義如下:
DmaBufAlloc = RK系列開發(fā)板DmaBufAlloc;
DmaBufFree = RK系列開發(fā)板DmaBufFree;
DmaRequestChannel = RK系列開發(fā)板DmaRequestChannel;
DmaConfigChannel = RK系列開發(fā)板DmaConfigChannel;
DmaPrep = RK系列開發(fā)板DmaPrep;
DmaSubmit = RK系列開發(fā)板DmaSubmit;
DmaPending = RK系列開發(fā)板DmaPending;
DmaPause = RK系列開發(fā)板DmaPause;
DmaResume = RK系列開發(fā)板DmaResume;
DmaPointer = RK系列開發(fā)板PcmPointer。
實(shí)例化DMA數(shù)據(jù)集:g_platformData,核心成員字段值定義如下:
PlatformInit= RK系列開發(fā)板DmaDeviceInit;
ops = &g_dmaDeviceOps,DMA操作集地址;
實(shí)例化HdfDriverEntry類型的DAI驅(qū)動(dòng)實(shí)體:
g_platformDriverEntry,核心成員字段值定義如下:
moduleVersion = 1,模塊版本號(hào);
moduleName = "DMA_RK系列開發(fā)板",模塊名;
Bind = DmaDriverBind;
Init = DmaDriverInit;
Release = DmaDriverRelease。
DMA驅(qū)動(dòng)注冊(cè)到鴻蒙系統(tǒng):HDFINIT(gplatformDriverEntry)
實(shí)現(xiàn)以下函數(shù):
DmaDriverInit,DMA驅(qū)動(dòng)初始化函數(shù);
DmaDriverBind,DMA驅(qū)動(dòng)綁定函數(shù);
DmaDriverRelease,DMA驅(qū)動(dòng)釋放函數(shù)。
RK系列開發(fā)板dmaops
實(shí)現(xiàn)以下函數(shù):
RK系列開發(fā)板DmaDeviceInit,初始化DMA設(shè)備函數(shù);
RK系列開發(fā)板DmaBufAlloc,分配數(shù)據(jù)內(nèi)存函數(shù);
RK系列開發(fā)板DmaBufFree,釋放數(shù)據(jù)內(nèi)存函數(shù);
RK系列開發(fā)板DmaRequestChannel,申請(qǐng)DMA通道函數(shù);
RK系列開發(fā)板DmaConfigChannel,配置DMA通道函數(shù);
RK系列開發(fā)板DmaPrep,DMA預(yù)處理函數(shù);
RK系列開發(fā)板DmaPause,暫停函數(shù);
RK系列開發(fā)板DmaResume,恢復(fù)函數(shù);
RK系列開發(fā)板DmaSubmit,提交數(shù)據(jù)函數(shù);
RK系列開發(fā)板DmaPending,懸掛數(shù)據(jù)函數(shù);
RK系列開發(fā)板PcmPointer,管理數(shù)據(jù)緩存函數(shù)。
總結(jié):
本文詳細(xì)介紹DMA的適配步驟以及核心代碼,相信讀者會(huì)對(duì)音頻適配會(huì)有一個(gè)更清楚深入的了解,之后的文章中,會(huì)逐步更新音頻驅(qū)動(dòng)的Codec模塊適配、Audio HCS配置等。
更多“RK系列開發(fā)板音頻驅(qū)動(dòng)適配指南”點(diǎn)擊下方的文章鏈接閱讀。
RK系列開發(fā)板音頻驅(qū)動(dòng)適配指南(三)
RK系列開發(fā)板音頻驅(qū)動(dòng)適配指南(四)
RK系列開發(fā)板音頻驅(qū)動(dòng)適配指南(五)
-
開發(fā)板
+關(guān)注
關(guān)注
25文章
5094瀏覽量
97805 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3731瀏覽量
16431
原文標(biāo)題:【開源項(xiàng)目】基于OpenHarmony的RK系列開發(fā)板音頻驅(qū)動(dòng)適配方案
文章出處:【微信號(hào):gh_9b9470648b3c,微信公眾號(hào):電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論