干貨分享丨如何在iMX8MQ 核心板上實現(xiàn)低功耗音頻播放
飛凌嵌入式FETMX8MQ-C核心板基于NXP i.MX8MQ處理器設(shè)計,該處理器擁有4個Cortex-A53處理器(工業(yè)級主頻最高為1.3GHz、商業(yè)級主頻最高為1.5GHz)+1個Cortex-M4處理器。本文將系統(tǒng)講解——如何在FETMX8MQ-C核心板上實現(xiàn)低功耗音頻播放。
01、低功率音頻應(yīng)用概述
在這個應(yīng)用中,i.MX8處理器A53內(nèi)核會向M4內(nèi)核發(fā)送請求,然后休眠。M4核獨立播放或錄制音頻,操作完成后喚醒A53核。
五個軟件組件被創(chuàng)建來實現(xiàn)這個功能:
- Linux的Play和 record應(yīng)用
- Linux RPMSG 字符設(shè)備驅(qū)動
- Linux 遠(yuǎn)程核心共享內(nèi)存驅(qū)動程序
- FreeRTOS 音頻服務(wù)
·
低功率音頻程序
02、軟件設(shè)計
? RPMSG字符設(shè)備驅(qū)動程序
i.MX8上,核心間使用RPMSG機制來進(jìn)行消息通信。RPMSG是基于MU模塊實現(xiàn)的。
? 遠(yuǎn)程核心共享內(nèi)存驅(qū)動程序
在低功耗音頻應(yīng)用中,Linux需要創(chuàng)建一個非緩沖、非緩存和連續(xù)的內(nèi)存來存儲解碼的音頻數(shù)據(jù)。M4core只能處理這樣的內(nèi)存空間。
此外,Linux需要獲得內(nèi)存的物理地址并將其傳遞給M4核心。
通常,在Linux中,我們有兩種方法來創(chuàng)建這樣的內(nèi)存空間。
- 使用DMA內(nèi)存空間,這是使用CMA(連續(xù)內(nèi)存分配器)。
- 在DTS文件中預(yù)定義了一個保留的內(nèi)存空間。
這里我們建議使用DMA內(nèi)存空間。它更靈活。我們不需要分配一個保留的內(nèi)存空間,我們可以釋放分配的空間。同時,我們可以得到實際地址。
對于這種情況,函數(shù)dma_alloc_coherent()是一個理想的函數(shù)。
在此基礎(chǔ)上,我們創(chuàng)建了一個遠(yuǎn)程核心共享內(nèi)存驅(qū)動程序,它可以幫助用戶分配、讀寫DMA相干內(nèi)存空間。
? AMP優(yōu)化
默認(rèn)情況下,當(dāng)檢測到M4時,內(nèi)核啟用所有模塊的時鐘。所以SOC電流會很大。在i.mx8M上,電流大約是500毫安。
因此在內(nèi)核中,我們需要啟用m4程序所需的時鐘,并對所有其他模塊的時鐘進(jìn)行使能。
? Linux低功率音頻應(yīng)用程序設(shè)計
下圖表明低功耗播放音頻功能的模塊間的關(guān)系
1. 低功耗播放程序
低功耗播放程序?qū)⒔獯amp3文件,并在M4核心上播放該文件。
在本程序中,我們將:
- 解碼mp3音頻文件。
- 復(fù)制解碼數(shù)據(jù)到共享內(nèi)存空間。
- 將已分配緩沖區(qū)的物理地址發(fā)送到M4核心。
- Linux休眠,等待喚醒信號。
- 當(dāng)播放結(jié)束時,MU中斷信號喚醒Linux。
2.低功耗錄音程序
低功耗錄音程序?qū)⒔邮誐4核心上的聲音,并在“A53”核心上保存PCM原始數(shù)據(jù)。
程序?qū)?
- 分配足夠的共享內(nèi)存空間。
- 將已分配緩沖區(qū)的物理地址發(fā)送到M4核心。
- Linux休眠,等待喚醒信號。
- 當(dāng)錄音完成時,MU中斷信號喚醒Linux。
- 從共享內(nèi)存空間獲得音頻數(shù)據(jù)并保存到文件。
3.Decode mp3音頻文件
在這個程序中,我們使用gstreamer解碼mp3文件到PCM原始數(shù)據(jù)。
4.復(fù)制解碼數(shù)據(jù)到共享內(nèi)存空間
在這里,我們將使用遠(yuǎn)程核心共享內(nèi)存驅(qū)動程序?qū)CM原始數(shù)據(jù)復(fù)制到一個連續(xù)的內(nèi)存空間。
5.將已分配緩沖區(qū)的物理地址發(fā)送到M4核心
使用RPMSG字符設(shè)備發(fā)送物理地址的緩沖區(qū)到M4核心。
這里我們強調(diào),通常,在一個核心和M4核心之間應(yīng)該有一個協(xié)議。使用RPMSG字符設(shè)備,可以在用戶空間中實現(xiàn)協(xié)議。例如,在低功耗播放程序中,為了訪問遠(yuǎn)程M4核上的音頻設(shè)備,我們創(chuàng)建了一個音頻請求和響應(yīng)協(xié)議。
6. Linux 內(nèi)核休眠
在Linux中進(jìn)入掛起模式的命令是:
echomem > /sys/power/state
7. Linux 內(nèi)核喚醒
在ATF補丁中,我們添加了MU中斷作為喚醒源。當(dāng)Linux內(nèi)核從M4核得到MU中斷時,它將被喚醒。
? 在Cortex-M4核上的音頻服務(wù)
在Cortex-M4內(nèi)核上創(chuàng)建了一個音頻服務(wù)器示例。音頻服務(wù)在低功耗應(yīng)用程序中,A53和M4之間定義的協(xié)議中,實現(xiàn)的是播放或錄制的功能。
03、運行低功率音頻的程序示例
本章介紹了運行低功率音頻的程序示例
? ATF 低功耗補丁
ATF實現(xiàn)了功率狀態(tài)協(xié)調(diào)接口(PowerState Coordination Interface, PSCI),并具有低功耗的特性。
在默認(rèn)BSP發(fā)行版的Linux內(nèi)核中,它將會使Cortex-A53內(nèi)核和Cortex-M4內(nèi)核同時處于掛起模式。因此ATF需要一個補丁來配合低功耗應(yīng)用。
ATF補丁將阻止DDR進(jìn)入retention模式,并且不禁用PLLs
? 重新編譯內(nèi)核和驅(qū)動
在內(nèi)核中,加上RPMSG字符設(shè)備驅(qū)動程序和遠(yuǎn)程內(nèi)核共享內(nèi)存驅(qū)動程序的補丁。
? 編譯低功耗音頻應(yīng)用
編譯低功耗音頻應(yīng)用
? 編譯Cortex-M4核應(yīng)用
Cortex-M4應(yīng)用是由IAR開發(fā)的,IAR并打開音頻服務(wù)器示例并編譯。
? 準(zhǔn)備好測試環(huán)境
連接好A核和M4核調(diào)試串口
? 啟動uboot運行M4核音頻服務(wù)程序
在M4核調(diào)試串口可以看到
? 運行低功耗音頻應(yīng)用
當(dāng)音頻服務(wù)在M4內(nèi)核上運行時,在u-boot中引導(dǎo)內(nèi)核。
安裝RPMSG字符設(shè)備和遠(yuǎn)程核心共享內(nèi)存驅(qū)動程序。
運行./lp_play./ xxxxx .mp3啟動低功耗播放。
調(diào)試信息:
解碼
播放并睡眠
喚醒
運行./lp_record啟動低功耗錄音。錄音的數(shù)據(jù)將保存為audio_rect.tmp。
04、時間消耗
在低功率音頻解決方案中,數(shù)據(jù)在A53核解碼,然后M4核播放。在核之間的協(xié)議通信中有一些時間損失。我們試著計算一下這個解的時間損失。
在這個例子中,我們將以兩種方式播放48kbps,22050 Hz的steromp3文件,A53核直接播放和M4核通過RPMSG播放。將比較從使用gstreamer打開文件到播放的持續(xù)時間。僅對播放進(jìn)行測試,用戶可以根據(jù)回放情況對錄音進(jìn)行評估。
播放方法 |
步驟 |
延時 |
A53直接播放 |
GST Decode -> A53 Playback |
116.410ms |
M4播放使用RPMSG |
GST Decode to Shared Buffer -> Send Msg to M4 -> M4 Playback |
467.560ms |
由于低功耗音頻播放將做額外的操作,如解碼mp3到文件,分配CMA緩沖區(qū),將音頻數(shù)據(jù)從文件到緩沖區(qū),然后從緩沖區(qū)到CMA緩沖區(qū),需要一些額外的時間,大約350毫秒。
可以對低功耗播放的其他操作進(jìn)行一些優(yōu)化,比如在GST解碼中使用appsync,它將把mp3數(shù)據(jù)直接解碼到緩沖區(qū)中,通過這種方式,額外的時間可以減半。
05、功耗測試
本章對使用或不使用低功率音頻比較了功耗。僅對播放進(jìn)行測試,用戶可以根據(jù)播放情況對錄音進(jìn)行評估。
正常播放
i.MX8MQ GA EVK low power audio dtb, no display, eth down, SDCard boot, idle |
||||||
|
SOC |
GPU |
VPU |
DRAM |
NVC DRAM |
|
電壓(V) |
0.896 |
0.877 |
0 |
0 |
0.992 |
1.096 |
播放電流(mA) |
65 |
205 |
0 |
0 |
135-446.4 |
70 |
功耗 |
58.24 |
179.785 |
0 |
0 |
148.8 |
71 |
總功耗 |
458.065 |
低功耗音頻播放
i.MX8MQ GA EVK low power audio dtb, no display, eth down, SDCard boot, idle |
||||||
|
ARM |
SOC |
GPU |
VPU |
DRAM |
NVC DRAM |
電壓(V) |
0.896 |
0.877 |
0 |
0 |
0.992 |
1.096 |
播放電流(mA) |
5 |
230 |
0 |
0 |
150 |
70 |
功耗 |
4.48 |
201.74 |
0 |
0 |
148.8 |
71 |
總功耗 |
426.26 |
注:本文來自NXP提供的ApplicationsNote AN12195
點擊此處進(jìn)入飛凌嵌入式官網(wǎng)>>,了解關(guān)于FETMX8MQ-C核心板的更多信息。
點個在看,坐等更多干貨~
相關(guān)產(chǎn)品 >
-
OKMX8MQ-C開發(fā)板
飛凌嵌入式提供基于 NXP/Freescale iMX8、i.MX 8MQ處理器設(shè)計ARM核心板FETMX8MQ-C。i.MX8M處理器具有音頻、語音和視頻處理功能,飛凌iMX8核心板充分發(fā)揮NXP iMX8 系列 ARM 處理器性能,對功能做了優(yōu)化。提供10~15年產(chǎn)品長期供貨計劃。工作環(huán)境溫度為-40℃~85℃,滿足工業(yè)及泛工業(yè)場景應(yīng)用。 了解詳情 -
FETMX8MQ-C核心板
基于 NXP/Freescale iMX8、 iMX8X、i.MX 8MQ處理器的ARM核心板。 四核ARM Cortex-A53 ,主頻最高1.3GHz,板載2GB RAM,8GB ROM;工作環(huán)境溫度為-40℃~85℃,滿足工業(yè)及泛工業(yè)場景應(yīng)用。i.MX8M處理器具有音頻、語音和視頻處理功能,提供高水平的音頻保真度,適用于無風(fēng)扇運行,散熱系統(tǒng)成本低、電池壽命長。具有高速接口可提供靈活連接等優(yōu)勢,并且提供10~15年產(chǎn)品長期供貨計劃。
了解詳情 -
OKMX8MP-C開發(fā)板
內(nèi)置NPU、ISP,AI計算能力高達(dá)2.3TOPS|飛凌嵌入式i.MX8MP 系列-NXP iMX8M Plus 開發(fā)板 基于高性能低功耗工業(yè)級iMX8MP核心板設(shè)計,支持多種多種高速通信接口。iMX8MP開發(fā)板內(nèi)置NPU,AI計算能力2.3TOPS,支持4K,支持雙圖像信號處理器(ISP),是一款支持LinuxQT/android操作系統(tǒng)的iMX8MP開發(fā)板。
了解詳情 -
FETMX8MP-C核心板
iMX8MP核心板基于 NXP i.MX 8M Plus 處理器設(shè)計, 采用4核Cortex-A53 和 Cortex-M7架構(gòu)。支持雙千兆網(wǎng)口,iMX8MP性能強勁最高運行速率可達(dá)2.3TOPS,并且i.MX8MP功耗更低≤2W 。iMX 8M Plus系列專注于機器學(xué)習(xí)和視覺、高級多媒體以及具有高可靠性的工業(yè)自動化。它旨在滿足智慧家庭、樓宇、城市和工業(yè)4.0應(yīng)用的需求。飛凌iMX8MP核心板提供用戶手冊,iMX8MP原理圖,引腳定義等。
了解詳情