干貨分享丨如何在iMX8MQ 核心板上實現(xiàn)低功耗音頻播放

原創(chuàng) 2020-12-07 10:15:00 iMX8MQ imx8 i.mx8

飛凌嵌入式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

 

ARM

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核心板的更多信息。

 


 www.powerye.cn

點個在看,坐等更多干貨~

 

相關(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)用。 了解詳情
    OKMX8MQ-C開發(fā)板
  • 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)品長期供貨計劃。
    了解詳情
    FETMX8MQ-C核心板
  • 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ā)板。

    了解詳情
    OKMX8MP-C開發(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原理圖,引腳定義等。
    了解詳情
    FETMX8MP-C核心板

推薦閱讀 換一批 換一批