飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

bellekong發表於2020-12-10

飛凌嵌入式FETMX8MQ-C核心板基於NXP i.MX8MQ處理器設計,該處理器擁有4個Cortex-A53處理器(工業級主頻最高為1.3GHz、商業級主頻最高為1.5GHz)+1個Cortex-M4處理器。本文將系統講解——如何在FETMX8MQ-C核心板上實現低功耗音訊播放。

01、低功率音訊應用概述

在這個應用中,i.MX8處理器A53核心會向M4核心傳送請求,然後休眠。M4核獨立播放或錄製音訊,操作完成後喚醒A53核。

五個軟體元件被建立來實現這個功能:

  • Linux的Play和 record應用
  • Linux RPMSG 字元裝置驅動
  • Linux 遠端核心共享記憶體驅動程式
  • FreeRTOS 音訊服務

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

低功率音訊程式

02、軟體設計

❶ RPMSG字元裝置驅動程式

i.MX8上,核心間使用RPMSG機制來進行訊息通訊。RPMSG是基於MU模組實現的。

❷ 遠端核心共享記憶體驅動程式

在低功耗音訊應用中,Linux需要建立一個非緩衝、非快取和連續的記憶體來儲存解碼的音訊資料。M4core只能處理這樣的記憶體空間。

此外,Linux需要獲得記憶體的實體地址並將其傳遞給M4核心。

通常,在Linux中,我們有兩種方法來建立這樣的記憶體空間。

  • 使用DMA記憶體空間,這是使用CMA(連續記憶體分配器)。
  • 在DTS檔案中預定義了一個保留的記憶體空間。

這裡我們建議使用DMA記憶體空間。它更靈活。我們不需要分配一個保留的記憶體空間,我們可以釋放分配的空間。同時,我們可以得到實際地址。

對於這種情況,函式dma_alloc_coherent()是一個理想的函式。

在此基礎上,我們建立了一個遠端核心共享記憶體驅動程式,它可以幫助使用者分配、讀寫DMA相干記憶體空間。

❸ AMP最佳化

預設情況下,當檢測到M4時,核心啟用所有模組的時鐘。所以SOC電流會很大。在i.mx8M上,電流大約是500毫安。

因此在核心中,我們需要啟用m4程式所需的時鐘,並對所有其他模組的時鐘進行使能。

❹ Linux低功率音訊應用程式設計

下圖表明低功耗播放音訊功能的模組間的關係

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

1. 低功耗播放程式

低功耗播放程式將解碼mp3檔案,並在M4核心上播放該檔案。

在本程式中,我們將:

  • 解碼mp3音訊檔案。
  • 複製解碼資料到共享記憶體空間。
  • 將已分配緩衝區的實體地址傳送到M4核心。
  • Linux休眠,等待喚醒訊號。
  • 當播放結束時,MU中斷訊號喚醒Linux。

2.低功耗錄音程式

低功耗錄音程式將接收M4核心上的聲音,並在“A53”核心上儲存PCM原始資料。

程式將:

  • 分配足夠的共享記憶體空間。
  • 將已分配緩衝區的實體地址傳送到M4核心。
  • Linux休眠,等待喚醒訊號。
  • 當錄音完成時,MU中斷訊號喚醒Linux。
  • 從共享記憶體空間獲得音訊資料並儲存到檔案。

3.Decode mp3音訊檔案

在這個程式中,我們使用gstreamer解碼mp3檔案到PCM原始資料。

4.複製解碼資料到共享記憶體空間

在這裡,我們將使用遠端核心共享記憶體驅動程式將PCM原始資料複製到一個連續的記憶體空間。

5.將已分配緩衝區的實體地址傳送到M4核心

使用RPMSG字元裝置傳送實體地址的緩衝區到M4核心。

這裡我們強調,通常,在一個核心和M4核心之間應該有一個協議。使用RPMSG字元裝置,可以在使用者空間中實現協議。例如,在低功耗播放程式中,為了訪問遠端M4核上的音訊裝置,我們建立了一個音訊請求和響應協議。

6. Linux 核心休眠

在Linux中進入掛起模式的命令是:

echomem > /sys/power/state

7. Linux 核心喚醒

在ATF補丁中,我們新增了MU中斷作為喚醒源。當Linux核心從M4核得到MU中斷時,它將被喚醒。

03、執行低功率音訊的程式示例

本章介紹了執行低功率音訊的程式示例

❶ ATF 低功耗補丁

ATF實現了功率狀態協調介面(PowerState Coordination Interface, PSCI),並具有低功耗的特性。

在預設BSP發行版的Linux核心中,它將會使Cortex-A53核心和Cortex-M4核心同時處於掛起模式。因此ATF需要一個補丁來配合低功耗應用。

ATF補丁將阻止DDR進入retention模式,並且不禁用PLLs

❷ 重新編譯核心和驅動

在核心中,加上RPMSG字元裝置驅動程式和遠端核心共享記憶體驅動程式的補丁。

❸ 編譯低功耗音訊應用

編譯低功耗音訊應用

❹ 編譯Cortex-M4核應用

Cortex-M4應用是由IAR開發的,IAR並開啟音訊伺服器示例並編譯。

❺ 準備好測試環境

連線好A核和M4核除錯串列埠

❻ 啟動uboot執行M4核音訊服務程式

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

在M4核除錯串列埠可以看到

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

❼ 執行低功耗音訊應用

當音訊服務在M4核心上執行時,在u-boot中引導核心。

安裝RPMSG字元裝置和遠端核心共享記憶體驅動程式。

執行./lp_play./ xxxxx .mp3啟動低功耗播放。

執行./lp_play./ xxxxx .mp3啟動低功耗播放。除錯資訊:

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

除錯資訊:

解碼

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

播放並睡眠

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

喚醒

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

執行./lp_record啟動低功耗錄音。錄音的資料將儲存為audio_rect.tmp。

04、時間消耗

在低功率音訊解決方案中,資料在A53核解碼,然後M4核播放。在核之間的協議通訊中有一些時間損失。我們試著計算一下這個解的時間損失。

在這個例子中,我們將以兩種方式播放48kbps,22050 Hz的steromp3檔案,A53核直接播放和M4核透過RPMSG播放。將比較從使用gstreamer開啟檔案到播放的持續時間。僅對播放進行測試,使用者可以根據回放情況對錄音進行評估。

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

由於低功耗音訊播放將做額外的操作,如解碼mp3到檔案,分配CMA緩衝區,將音訊資料從檔案到緩衝區,然後從緩衝區到CMA緩衝區,需要一些額外的時間,大約350毫秒。

可以對低功耗播放的其他操作進行一些最佳化,比如在GST解碼中使用appsync,它將把mp3資料直接解碼到緩衝區中,透過這種方式,額外的時間可以減半。

05、功耗測試

本章對使用或不使用低功率音訊比較了功耗。僅對播放進行測試,使用者可以根據播放情況對錄音進行評估。

正常播放

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

低功耗音訊播放

飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放

注:本文來自NXP提供的ApplicationsNote AN1219


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989429/viewspace-2741187/,如需轉載,請註明出處,否則將追究法律責任。

相關文章