0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony支持HDMI接口聲卡適配說明

OpenAtom OpenHarmony ? 來源:未知 ? 2023-05-23 07:05 ? 次閱讀

點擊藍字 ╳ 關注我們


開源項目 OpenHarmony
是每個人的 OpenHarmony

陳甲印

鴻湖萬聯(lián)資深技術專家

鴻湖萬聯(lián)產(chǎn)品推薦


高清多媒體接口(High Definition Multimedia Interface,HDMI )是一種全數(shù)字化視頻和聲音發(fā)送接口,可以發(fā)送未壓縮的音頻及視頻信號。HDMI可用于機頂盒、DVD播放機、個人計算機、電視、游戲主機、綜合擴大機、數(shù)字音響與電視機等設備。HDMI可以同時發(fā)送音頻和視頻信號,由于音頻和視頻信號采用同一條線材,大大簡化系統(tǒng)線路的安裝難度。這塊是百度百科對HDMI的簡單介紹,我們再看看HDMI不同版本對音頻的支持情況:


當前我們使用最多的是2.0版本,本文介紹了OpenHarmony系統(tǒng)支持HDMI聲卡的適配過程,帶有HDMI聲卡的設備包括電視、投影儀和一些帶有音響的顯示器。

1 功能描述

OpenHarmony系統(tǒng)中音頻系統(tǒng)使用ADM框架,下面是ADM框架的組成:


ADM框架是基于HDF系統(tǒng)框架開發(fā),Card Manager是用來管理多個聲卡鏈表,Controller是聲卡的控制模塊包含了音量、靜音、通路選擇等控制功能。
Audio Control Dispath是控制功能的中轉(zhuǎn)站負責接收HDI下發(fā)的控制命令和將控制命令轉(zhuǎn)發(fā)給各個聲卡組件。Audio Stream Dispatch是數(shù)據(jù)流的中轉(zhuǎn)站,播放過程中負責接收HDI的數(shù)據(jù)流,在錄音過程中負責上傳聲卡的錄音數(shù)據(jù)流。
Run Time Device中包括的這些模塊就是一個聲卡工作需要的驅(qū)動服務。其中codec編解碼模塊驅(qū)動服務、dai數(shù)字音頻接口驅(qū)動服務和platform片上系統(tǒng)也就是DMA模塊驅(qū)動服務是大多數(shù)聲卡所必須的。
HDMI聲卡和其他聲卡一樣由三個模塊組成codec編解碼模塊、dai數(shù)字音頻接口和platform片上系統(tǒng)也就是DMA模塊。HDMI的codec是集成在HDMI轉(zhuǎn)換芯片內(nèi)部的我們只需要將PCM音頻流給到HDMI轉(zhuǎn)換芯片就可以。DAI這塊使用的是I2S總線連接HDMI芯片和platform。要實現(xiàn)對HDMI聲卡的支持,就需要將這幾個模塊的驅(qū)動注冊到ADM框架中。
本文基于3月1日的OpenHarmony master分支進行介紹?;趛angfan平臺介紹,如適配其他平臺相關配置根據(jù)具體平臺進行修改。
OpenHarmony系統(tǒng)支持HDMI聲卡的插拔識別,支持HDMI聲卡的播放功能,包括啟動、停止、暫停、恢復功能。

2 準備工作

2.1 查詢物理連接

這是一個HDMI設備模塊的邏輯試圖,圖中可以看到音頻數(shù)據(jù)可以通過兩種接口I2S或者SPIDIF將音頻數(shù)據(jù)傳給HDMI設備,此處我們使用的是I2S總線。


首先需要查看芯片手冊HDMI模塊和SOC是如何連接的,找到音頻數(shù)據(jù)傳輸相應的I2S總線,這塊是更具rk3568芯片查到的數(shù)據(jù),I2S0連接的是HDMI。


2.2 查詢寄存器地址
因為我們使用I2S總線就要對其進行配置所以我們需要找到I2S總線的基地址和I2S總線的寄存器說明。查看芯片手冊找到I2S總線對應的寄存器基地址。


3 代碼介紹

HDMI的驅(qū)動codec的代碼ADM框架中已經(jīng)實現(xiàn)了,我們只需要根據(jù)不同的單板平臺修改平臺下面的配置文件。Dai和platform的驅(qū)動代碼需要根據(jù)各自平臺自行開發(fā)。yangfan開發(fā)板Dai和platform驅(qū)動代碼路徑在deviceoardisoftstoneyangfankernelhdfdriversaudio下面的dai和soc目錄下面。
涉及到的配置文件如下:
vendor/isoftstone/yangfan/hdf_config/khdf/audio$ tree
├── audio_config.hcs   // 此配置文件配置聲卡信息
├── codec_config.hcs // 此配置文件配置codec信息
├── dai_config.hcs // 此配置文件配置dai信息
└── dma_config.hcs // 此配置文件配置platform信息
vendor/isoftstone/yangfan/hdf_config/khdf/device_info/
device_info.hcs//此配置文件配置聲卡驅(qū)動服務信息
修改涉及的代碼倉:device_board_hihope、vendor_isoftstone和kernel_linux_config

4 構(gòu)建開關

OpenHarmony系統(tǒng)要支持HDMI聲卡首先要打開構(gòu)建開關:在文件kernel/linux/config/linux-5.10/arch/arm64/configs/rockchip_standard_defconfig
添加:CONFIG_DRIVERS_HDF_AUDIO_HDMI=y

5 功能配置

HCS(HDF Configuration Source)是HDF驅(qū)動框架的配置描述源碼,內(nèi)容以Key-Value為主要形式。它實現(xiàn)了配置代碼與驅(qū)動代碼解耦,便于開發(fā)者進行配置管理。

5.1 配置文件:device_info.hcs 添加hdmi聲卡節(jié)點信息。
文件路徑:
vendor/isoftstone/yangfan/hdf_config/khdf/device_info/
HDMI聲卡插入后系統(tǒng)會根據(jù)此處配置的聲卡節(jié)點加載HDMI聲卡驅(qū)動。
        audio :: host {
hostName = "audio_host";
priority = 110;
device_dai :: device {...
device_hdmi :: deviceNode {
policy = 1;
priority = 50;
preload = 0;
permission = 0666;
moduleName = "DAI_RK3568";
serviceName = "hdmi_dai_service";
deviceMatchAttr = "hdf_hdmi_dai_driver";
}
}
device_codec :: device {...
device_hdmi :: deviceNode {
policy = 1;
priority = 50;
preload = 0;
permission = 0666;
moduleName = "AUDIO_HDMI_CODEC";
serviceName = "codec_service_1";
deviceMatchAttr = "hdf_codec_driver_1";
}
...
}
...
device_dma :: device {...
device_hdmi :: deviceNode {
policy = 1;
priority = 50;
preload = 0;
permission = 0666;
moduleName = "DMA_RK3568";
serviceName = "hdmi_dma_service_0";
deviceMatchAttr = "hdf_hdmi_dma_driver";
}
...
}


device_audio :: device {...
device_hdmi :: deviceNode {
policy = 2;
priority = 60;
preload = 2;
permission = 0666;
moduleName = "HDF_AUDIO";
deviceMatchAttr = "hdf_audio_driver_1";
serviceName = "hdf_audio_codec_hdmi_dev0";
}
...
}
...
}
moduleName 配置組件名稱,和驅(qū)動代碼中的moduleName相對應,系統(tǒng)會根據(jù)此名稱加載驅(qū)動。
deviceMatchAttr私有配置的屬性名稱,根據(jù)此名稱可以找到相應的私有配置。
serviceName驅(qū)動服務名稱,根據(jù)此名稱可以使用對應的驅(qū)動。
preload 配置加載方式,2為動態(tài)加載,當HDMI聲卡插入時加載HDMI聲卡驅(qū)動。
此文件中首先配置了文件首先先配置了HDMI的dai、codec和dma驅(qū)動服務,最后配置了HDMI聲卡設備。

5.2 配置文件:audio_config.hcs 添加hdmi聲卡服務信息。
文件路徑:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此處配置一個HDMI聲卡驅(qū)動包括哪些驅(qū)動服務。
root {
platform {
...
controller_0x120c1001 :: card_controller {
match_attr = "hdf_audio_driver_1";
serviceName = "hdf_audio_codec_hdmi_dev0";
codecName = "codec_service_1";
platformName = "hdmi_dma_service_0";
cpuDaiName = "hdmi_dai_service";
codecDaiName = "hdmi_codec_dai";
}
...
}
}
card_controller配置項根據(jù)聲卡包含的驅(qū)動服務進行配置,不同聲卡包含的驅(qū)動服務可能不同,HDMI聲卡包含platform、dai和codec所以需要配置codecName codec驅(qū)動服務名稱,platformName platform驅(qū)動服務名稱、cpuDaiName platform側(cè)dai服務名稱、codecDaiName codec側(cè)驅(qū)動服務名稱。
match_attr配置項名稱和HDMI聲卡設備的私有配置名稱相匹配,聲卡設備可以根據(jù)這個私有配置找到聲卡對應的codec、dai、platform驅(qū)動服務。
serviceName HDMI聲卡服務名稱,聲卡加載成功后會生成/dev/hdf_audio_codec_hdmi_dev0結(jié)點。

5.3 配置文件:dma_config.hcs 添加HDMI聲卡硬件信息。
文件路徑:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此文件配置和HDMI聲卡連接的SOC側(cè)的DMA信息。具體信息可以通過查看cpu芯片手冊得到。
root {
platform {
template dma_controller {
match_attr = "";
serviceName = "";
}
...
controller_0x120c1011 :: dma_controller {
match_attr = "hdf_hdmi_dma_driver";
serviceName = "hdmi_dma_service_0";


idInfo {
chipName = "/i2s@fe400000"; // 根據(jù)hdmi驅(qū)動芯片連接的I2S總線地址進行配置
chipIdRegister = 0xfe400000; // 根據(jù)hdmi驅(qū)動芯片連接的I2S總線地址進行配置
chipIdSize = 0x1000;
}
regConfig {
daiStartupSeqConfig = [
0x00, 0x00, 0, 0, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0x0, //Transmit Operation Init
];
}
}
}
}
此文件配置了HDMI聲卡使用的dma信息。
match_attr配置項名稱和HDMI聲卡設備的dma服務私有配置名稱相匹配。serviceName HDMI聲卡dma驅(qū)動服務名稱需要和device_info配置文件中HDMI聲卡的dma驅(qū)動服務名稱相同。
HDMI模塊只需要配置idInfo配置項信息,其他配置項HDMI模塊未使用。

5.4 配置文件:dai_config.hcs 添加HDMI聲卡硬件信息。
文件路徑:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此文件配置和HDMI聲卡連接的SOC側(cè)的i2s信息。具體信息可以通過查看cpu芯片手冊得到。
root {
platform {
template dai_controller {
match_attr = "";
serviceName = "";
}
...
controller_0x120c1021 :: dai_controller {
match_attr = "hdf_hdmi_dai_driver";
serviceName = "hdmi_dai_service";


idInfo {
chipName = "/i2s@fe400000"; // 根據(jù)hdmi驅(qū)動芯片連接的I2S總線地址進行配置
chipIdRegister = 0xfe400000; // 根據(jù)hdmi驅(qū)動芯片連接的I2S總線地址進行配置
chipIdSize = 0x1000;
}
regConfig {
daiStartupSeqConfig = [
0x00, 0x00, 0, 0, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0x0, //Transmit Operation Init
];
}
}
}
}
此文件配置了HDMI聲卡使用的dai信息。match_attr配置項名稱和HDMI聲卡設備的dai服務私有配置名稱相匹配。serviceName HDMI聲卡dai驅(qū)動服務名稱需要和device_info配置文件中HDMI聲卡的dai驅(qū)動服務名稱相同。
chipIdRegister HDMI驅(qū)動芯片連接的I2S總線地址,此信息可以通過cpu的芯片手冊獲取。
chipIdSize物理地址映射的虛擬地址大小。

5.5 配置文件:codec_config.hcs 添加HDMI聲卡硬件信息。
文件路徑:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此文件配置HDMI聲卡信息。由于HDMI聲卡只支持播放,此處只配置了播放的參數(shù)信息。
root {
platform {
template codec_controller {
match_attr = "";
serviceName = "";
codecDaiName = "";
}
...
controller_0x120c1031 :: codec_controller {
match_attr = "hdf_codec_driver_1";
serviceName = "codec_service_1";
codecDaiName = "hdmi_codec_dai";


hwInfo = [
/*
Playback/Captrue, formats, rates, rate_min, rate_max, channels_min, channels_max,
buffer_bytes_max, period_bytes_min, period_bytes_max, periods_min, periods_max
*/
1, 0xF, 0xFF, 8000, 96000, 1, 2, 1, 2, 3, 4, 5
];
}
...
}
此文件配置了HDMI聲卡使用的codec信息。
match_attr配置項名稱和HDMI聲卡設備的codec服務私有配置名稱相匹配。serviceName HDMI聲卡codec驅(qū)動服務名稱需要和device_info配置文件中HDMI聲卡的codec驅(qū)動服務名稱相同。
codecDaiName HDMI聲卡使用的codec dai的設備名稱,此處名稱需要和audio_config配置文件中的codecDaiName名稱相同。
hwInfo配置聲卡的信息,包括聲卡播放和錄音支持的格式、采樣率范圍、通道范圍、緩存buffer最大值、每個周期的字節(jié)范圍、周期的范圍。第一個配置項Playback對應的值為1,Captrue對應的值為2。其他配置項沒有使用。
HDMI聲卡只支持播放,這里只配置了播放,有些參數(shù)沒有生效可以隨便配置。

6 應用樣例

audio_sample_render是用來測試錄音功能的工具,audio_sample_capture是用來測試播放功能的工具,audio_sample_event是用來檢測USB插拔事件上報的工具。這兩個工具可以通過編譯得到,編譯命令如下:
./build.sh --product-name yangfan -T audio_sample_render -T audio_sample_capture -T audio_sample_event
hdc shell
cd /data/
./audio_sample_renderYoungForYou.wav

7 功能驗證

使用hdc工具推送audio_sample_render和audio_sample_event和wav音頻文件到開發(fā)板data目錄下:
hdc file send E:audio_sample_render /data
hdc file send E:audio_sample_event /data
hdcfilesendE:xxx.wav/data
HDMI音頻類設備插拔檢測
進入shell端口進行一次HDMI設備插入、拔出流程。
hdc shell
#cd/data/#chmod+xaudio_sample_event#./audio_sample_event
插入打?。?/section>
===============================================================================
@@@@@ serviceName: audio_hdi_pnp_service
@@@@@ deviceClass: 32
@@@@@ status : 1
@@@@@ info : EVENT_TYPE=0x1;DEVICE_TYPE=0x400
===============================================================================
拔出打?。?/section>
===============================================================================
@@@@@ serviceName: audio_hdi_pnp_service
@@@@@ deviceClass: 32
@@@@@ status : 1
@@@@@ info : EVENT_TYPE=0x2;DEVICE_TYPE=0x400
===============================================================================
HDMI音頻類設備放音
進入shell端口進行一次完整的播放、停止、退出流程。
hdc shell
# cd /data/# chmod +x audio_sample_render## ./audio_sample_render YoungForYou.wav
==================== Loading Mode ===================
| 1. Passthrough Loading |
| 2. IPC Loading |
======================================================
Please enter your choice:
2
================= Select Audio Card ==================
1. primary
2. primary1
3. hdmi
4. usb
5. a2dp
======================================================
Please enter your choice:
3
================== Play Render Menu ==================
| 1. Render Start |
| 2. Render Stop |
| 3. Render Resume |
| 4. Render Pause |
| 5. Render SetVolume |
| 6. Render GetGain |
| 7. Render SetMute |
| 8. Render SetAttributes |
| 9. Render SelectScene |
| 10. Render getEXtParams |
| 11. Render getMmapPosition |
| 12.Exit |
======================================================
your choice is:
1
Music channels = 2
Music Rate = 44100 Hz
Music Bit = 16 bit
============= Play Render Mode ==========
| 1. Render non-mmap |
| 2. Render mmap |
========================================
Please enter your choice:
1
Start Successful,Music is playing
================== Play Render Menu ==================
| 1. Render Start |
| 2. Render Stop |
| 3. Render Resume |
| 4. Render Pause |
| 5. Render SetVolume |
| 6. Render GetGain |
| 7. Render SetMute |
| 8. Render SetAttributes |
| 9. Render SelectScene |
| 10. Render getEXtParams |
| 11. Render getMmapPosition |
| 12.Exit |
======================================================
your choice is:
2
Stop Successful
================== Play Render Menu ==================
| 1. Render Start |
| 2. Render Stop |
| 3. Render Resume |
| 4. Render Pause |
| 5. Render SetVolume |
| 6. Render GetGain |
| 7. Render SetMute |
| 8. Render SetAttributes |
| 9. Render SelectScene |
| 10. Render getEXtParams |
| 11. Render getMmapPosition |
| 12.Exit |
======================================================
your choice is:
12

8 總結(jié)

本文沒有介紹HDMI聲卡codec驅(qū)動的具體實現(xiàn),代碼路徑drivers/hdf_core/framework/model/audio/hdmi。平臺適配支持HDMI聲卡可以不用關注驅(qū)動的具體實現(xiàn)。
支持HDMI聲卡是OpenHarmony系統(tǒng)使用中不可或缺的一部分,是OpenHarmony系統(tǒng)用于投影儀、電視顯示和生活場景的重要功能,本文介紹了OpenHarmony系統(tǒng)支持HDMI聲卡的適配步驟希望對您有所幫助。



原文標題:OpenHarmony支持HDMI接口聲卡適配說明

文章出處:【微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 鴻蒙
    +關注

    關注

    57

    文章

    2302

    瀏覽量

    42689
  • OpenHarmony
    +關注

    關注

    25

    文章

    3635

    瀏覽量

    16061

原文標題:OpenHarmony支持HDMI接口聲卡適配說明

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    VGA轉(zhuǎn)HDMI適配器使用指南

    Multimedia Interface)接口的普及,越來越多的設備開始支持HDMI。 什么是VGA轉(zhuǎn)HDMI適配器 VGA轉(zhuǎn)
    的頭像 發(fā)表于 11-08 10:01 ?113次閱讀

    VGA接口HDMI接口的區(qū)別

    器和圖形適配器而設計的。VGA接口使用15針腳的D-sub連接器,支持模擬信號傳輸。 HDMI接口H
    的頭像 發(fā)表于 11-08 09:59 ?122次閱讀

    dp接口hdmi接口的區(qū)別

    在現(xiàn)代顯示技術中,DP(DisplayPort)和HDMI(High-Definition Multimedia Interface)接口是連接顯示器和視頻源的標準接口。它們都支持高分
    的頭像 發(fā)表于 10-30 13:37 ?205次閱讀

    主板聲卡HDMI屏蔽了怎么辦

    主板聲卡HDMI屏蔽了,通常是指在連接HDMI音頻輸出設備(如顯示器、電視等)時,系統(tǒng)自動將音頻輸出切換到HDMI設備,導致主板上的集成聲卡
    的頭像 發(fā)表于 08-20 15:15 ?1443次閱讀

    USB聲卡支持SPDIF格式嗎

    高質(zhì)量的音頻信號。那么,USB聲卡是否支持SPDIF格式呢? USB聲卡的基本概念 USB聲卡是一種通過USB接口傳輸音頻信號的設備,它具有
    的頭像 發(fā)表于 08-20 15:07 ?416次閱讀

    HDMI光纖線纜支持對接頭嗎

    HDMI光纖線纜支持對接頭,但具體支持的對接頭類型和規(guī)格可能會因線纜型號、品牌和接口版本的不同而有所差異。 HDMI線是一種高清晰多媒體
    的頭像 發(fā)表于 06-24 10:27 ?534次閱讀

    hdmi2.1的線能接2.0接口

    HDMI 2.1的線可以接在HDMI 2.0的接口上,但需要注意以下幾點: 兼容性:HDMI 2.1是向下兼容HDMI 2.0的,這意味著
    的頭像 發(fā)表于 06-21 10:12 ?9610次閱讀

    什么是USB聲卡?

    USB聲卡是一種外置的音頻接口設備,通過USB接口連接到計算機、筆記本、平板電腦等設備。它能夠提供高質(zhì)量的音頻輸入和輸出,通常用于音樂制作、錄音、直播和家庭娛樂等場景。與內(nèi)置聲卡相比,
    的頭像 發(fā)表于 06-20 15:53 ?1539次閱讀
    什么是USB<b class='flag-5'>聲卡</b>?

    HDMI接口和DVI接口有什么區(qū)別

    接口有單鏈路(18針)和雙鏈路(24針)兩種模式。 傳輸速率: HDMI接口的傳輸速率隨版本升級而提高。HDMI 1.3支持5Gbps,
    的頭像 發(fā)表于 06-17 10:28 ?2782次閱讀

    如何選擇HDMI接口和線纜

    HDMI(High Definition Multimedia Interface)作為當今音視頻設備中最常見的接口之一,其質(zhì)量和性能對于影音體驗有著至關重要的影響。然而,面對市場上琳瑯滿目
    的頭像 發(fā)表于 05-29 16:49 ?625次閱讀

    hdmi是什么接口連接顯示器

    HDMI接口,全稱“高清多媒體接口”,是一種全數(shù)字化視頻以及聲音發(fā)送接口,能夠發(fā)送未壓縮的音頻和視頻信號。HDMI
    的頭像 發(fā)表于 04-19 10:19 ?1212次閱讀

    如何判斷HDMI接口版本是1.4還是2.0呢?

    1.4和2.0。判斷HDMI接口版本主要通過以下幾種方法: 1. 查看產(chǎn)品說明書或標簽:在購買的電視、電腦顯示器、音視頻設備等產(chǎn)品上,通常會標注接口的版本信息。產(chǎn)品
    的頭像 發(fā)表于 02-02 17:26 ?2.5w次閱讀

    OpenHarmony開源GPU庫Mesa3D適配說明

    本文檔主要講解在OpenHarmony中,Mesa3D的適配方法及原理說明。 環(huán)境說明: OHOS版本: 適用3.2-Beta3及以上 內(nèi)核版本: linux-5.10 硬件環(huán)境
    發(fā)表于 12-25 11:38

    HDMI自動切換器是支持多路HDMI輸入一路HDMI輸出的嗎?

    自動偵測并切換不同的輸入源。因此,HDMI自動切換器可以支持多路HDMI輸入一路HDMI輸出。 HDMI(高清晰度多媒體
    的頭像 發(fā)表于 12-04 14:50 ?762次閱讀

    HDMI MHL是如何工作的?如何使用HDMI MHL適配器呢?

    HDMI MHL是如何工作的?如何使用HDMI MHL適配器呢? HDMI MHL (Mobile High-Definition Link) 是一種允許您將移動設備連接到高清電視或顯
    的頭像 發(fā)表于 11-27 16:19 ?2345次閱讀