背景:
多媒體系統目前在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系列開發闆_dai-classes.puml
1.1.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驅動釋放函數。
1.2.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配置等。