音頻開放固件 (Sound Open Firmware,SOF) 是一個開源音頻數字信號處理 (DSP) 固件基礎架構和 SDK。SOF 作為社區項目,提供基礎架構、實時控制件和音頻驅動程序。該項目由聲音開放固件技術指導委員會 (TSC) 管理,該委員會包括來自社區的杰出和活躍的開發者。SOF 是公開開發的,并托管在 github 平臺上。
該固件和 SDK 面向對現代 DSP 上的音頻或信號處理感興趣的開發者。SOF 提供了一個框架,音頻開發者可以在其中創建、測試和優化以下內容:
- 音頻處理流水線和拓撲。
- 音頻處理組件。
- DSP 基礎架構和驅動程序。
- 主機操作系統基礎架構和驅動程序。
Sound Open Firmware 具有模塊化和通用的代碼庫,可以移植到不同的 DSP 架構或主機平臺。請參閱當前支持的 DSP 架構和支持的平臺列表。
SDK 介紹與概述
Sound Open Firmware SDK 由許多成分組成,可以定制這些成分以用于固件/軟件開發生命周期。定制允許 “最適合” 的開發方法,其中 SDK 可以針對特定流程或環境進行優化。有些 SDK 成分是可選的,而其他成分可以有多次選擇,如下圖所示。
圖 2:SDK 示例配置顯示了運行 Linux 操作系統的 Intel Apollo Lake 平臺上的 SOF 開發流程。請注意編譯器工具鏈的選擇和可選的 DSP 仿真器的選擇。
SOF 源碼、工具和拓撲
所有固件、工具和拓撲都存放在主 SOF git 存儲庫中。從較高的層面來看,該存儲庫包含:
- 固件 - 用 C 語言和一些特定于體系結構的匯編語言編寫;它不鏈接外部依賴項。
- Test Bench - 允許固件組件和流水線在開發者的主機 PC 上運行。
- 鏡像工具 - 將 ELF 文件轉為可以在硬件上運行的二進制固件鏡像的 C 工具。
- 調試工具 - 可用于調試固件的腳本和工具。
- 追蹤工具 - 基于文本的工具,可以顯示來自固件的跟蹤數據。
- 調優工具 - 可用于創建音頻組件調優系數的 MATLAB/Octave 腳本。
- 運行時工具 - 可用于與運行中的固件交換數據的命令行應用程序。
- 拓撲 - 真實和示例拓撲,展示了簡單和復雜的音頻處理流水線的構建。
主機操作系統驅動程序
SOF 可以由主機操作系統驅動程序配置和控制,也可以選擇作為獨立固件運行。SOF 主機驅動程序當前支持 Linux 操作系統。
SOF 驅動程序具有模塊化的基于堆棧的架構,該架構是 BSD 和 GPL 雙重許可的代碼,允許其移植到其它操作系統和 RTOS。
主機驅動程序負責:
- 將固件從主機文件系統加載到 DSP 存儲器中并啟動。
- 將拓撲從主機文件系統加載到 DSP 中。
- 將音頻控制設備暴露給應用程序。
- 向應用程序公開音頻數據端點。
- 管理主機和 DSP 之間的 IPC 通信。
- 在主機端將 DSP 硬件抽象為通用 API 操作。
對于上面的幾點,一般情況下,其主要實現者如下:
- 將固件從主機文件系統加載到 DSP 存儲器中并啟動,完全由主機端的 SOF Linux 驅動程序完成,但 SOF 的 Linux 內核驅動程序框架已經提供了這個功能的實現,SOF Linux 驅動程序可以直接用,如果該實現不能完全滿足需要,則該實現也可以作為驅動程序提供這個功能實現的參考。
-
將拓撲從主機文件系統加載到 DSP 中,幾乎不需要具體的 SOF Linux 驅動程序實現參與,具體的 SOF Linux 驅動程序實現配置拓撲文件的路徑,在驅動程序
probe
期間,調用 SOF 的 Linux 內核驅動程序框架提供的接口完成。 - 將音頻控制設備暴露給應用程序,在拓撲配置文件中定義控制項,二進制的拓撲配置通過 ASoC 的拓撲模塊被加載時,SOF 的 Linux 內核驅動程序框架的拓撲模塊實現這些功能,幾乎不需要具體的 SOF Linux 驅動程序實現參與。
- 向應用程序公開音頻數據端點,在拓撲配置文件中定義 PCM 項,二進制的拓撲配置通過 ASoC 的拓撲模塊被加載時,SOF 的 Linux 內核驅動程序框架的拓撲模塊及 PCM 和 compress 等模塊實現這些功能,幾乎不需要具體的 SOF Linux 驅動程序實現參與。
- 管理主機和 DSP 之間的 IPC 通信,在 SOF 中,IPC 分為兩層,一是底層的 IPC 通道,它負責無差別地在主機操作系統和 DSP 之間傳遞消息,二是 IPC 消息協議,包括 IPC 通信所用的消息具體格式的定義和處理。IPC 通道完全由具體的 SOF Linux 驅動程序實現,IPC 消息協議由 SOF 的 Linux 內核驅動程序框架,IPC 消息協議需要與拓撲二進制文件的格式匹配。IPC 通道是具體的 SOF Linux 驅動程序實現的重點。
- 在主機端將 DSP 硬件抽象為通用 API 操作,拓撲配置文件、SOF 固件和 SOF 的 Linux 內核驅動程序框架配合實現,一般不需要具體的 SOF Linux 驅動程序實現參與。
Linux SOF ALSA/ASoC 驅動程序在 Linux v5.2 版進的內核,但早期版本還不是很完善。
固件工具鏈
GNU GCC 可以與專有的 DSP 供應商編譯器一起用作免費的 SOF 編譯器。編譯器的選擇取決于用戶,具體取決于功能和預算。GCC 編譯器是開源的。
DSP 仿真器
Qemu 可用于提供功能仿真器來同時跟蹤和調試驅動程序和 DSP 固件代碼。還可以使用專有的仿真器。
SOF CI 中還使用仿真來在合并新代碼之前進行功能驗證。
一般 FAQ
固件使用什么許可證?
固件使用標準 BSD 3 條款許可證發布,其中一些文件在 MIT 下發布。
我需要開源我的固件代碼修改嗎?
不需要。固件的 BSD 和 MIT 許可代碼意味著你可以將代碼修改保持私有。如果你決定開源你的工作,補丁總是歡迎的。
主機驅動程序使用什么許可證?
大多數主機驅動程序代碼是雙重許可的 BSD 或 GLPLv2(用戶選擇)。驅動程序中僅屬于 GPLv2 的部分是位于驅動程序堆棧頂部的 Linux 集成層。
我是否需要開源我的驅動程序代碼的改動?
不需要,對于驅動程序棧最底部的兩層。比如,如果你把驅動程序移植到了另一個操作系統,這些改動可以保持私有的。注意,所有的驅動程序 GPL 源文件是 Linux 特有的,且不應該被移植到另一個操作系統。
我如何參與進來?
參與進來最好的方式是通過 github。你也可以加入我們的 郵件列表。
開發模型是什么樣的?
SoF (Sound Open Firmware) 完全在 github 上開發。補丁通過 Pull Request 來 review,討論,并在合并前由 CI 做測試。預期的發布節奏是每 6 - 8 周。穩定版經過 QA 測試之后會打標簽;下一個版本的開發仍在繼續。
誰在為 SoF (Sound Open Firmware) 工作?
來自大量不同公司的專業開發者 (如果想了解更多相關信息的話可以參考 git 日志) 以及一些開發愛好者。
我如何添加對主機架構 X 的支持?
請參考 SOF 架構頁面。
我如何添加對主機平臺 X 的支持?
添加新的主機平臺比添加新的 DSP 架構簡單多了。添加新的主機平臺由這么幾部分組成,添加一個新的 src/platform/ 目錄,其中包含內存映射,IRQs,GPIOs 和 DSP 內存地址空間中的外設??赡芤残枰?drivers 目錄下添加新的驅動程序 (比如 DMA,I2S 的)。
我如何移植到其它操作系統?
請參考 SOF 主機架構頁面。
支持哪些音頻組件?
SoF (Sound Open Firmware) 現在支持一個小的免費開源的組件庫,這些組件與源代碼一起分發。SOF 還可以支持專有的音頻處理組件,只要它們被包裝為使用 SOF 組件API。有關開源組件及其功能的列表,請參閱音頻組件頁面。
我如何創建我自己的流水線?
流水線目前是使用 M4 宏處理語言定義的。M4 拓撲在被編譯為二進制文件之前先被預處理為 alsaconf 格式。用于流水線構建的基于 Eclipse 的 GUI 目前正在開發中。
如今,上游支持靜態 (內置) 和動態 (運行時加載) 流水線。
我可以添加我自己的媒體編碼器/解碼器嗎?
當然可以。
我可以添加非音頻的功能嗎?
可以。DSP 所使用的指令集也擅長非音頻的處理任務,比如低功耗傳感器信號處理。如果你的 DSP 具有其它非音頻設備可以連接的物理 IO 端口,那么數據也可以從這些設備處理。
工具鏈 FAQ
SOF 目前支持哪些 Xtensa 工具鏈?
SOF 目前支持兩個工具鏈家族:GCC 和 Cadence XCC。
這些工具鏈家族被細分為各個 Xtensa ISA 的工具鏈,因為 Tensilica 架構包含可變的指令集,因此你必須使用與你的平臺匹配的工具鏈。
-
定制的,開源 GCC 工具鏈通過 crosstool-NG 構建,如入門指南中所述。它們必須從源代碼構建。有關說明,請參閱以下內容:
- 從入門指南中的 第 3 步. 從源碼構建工具鏈 來了解從頭開始構建 SOF。
- 工具鏈和嵌入式發行版
-
Cadence 的部分閉源工具鏈。Cadence XCC 編譯器是專有的,但使用了開源的 GNU binutils。XCC 必須從 Cadence 購買。更多信息,請參考:
Cadence binutils 補丁或覆蓋位于 SOF git 存儲庫中。
請注意,Cadence 并不是 Tensilica 的唯一用戶。一些 Xtensa 工具鏈來自于 其它地方。然而,截至2020年6月,SOF 支持的所有平臺均來自 Cadence。
Cadence 和 gcc 工具鏈之間的主要區別是什么?
gcc 工具鏈是完全開源的。Cadence 的工具鏈使用基于 gcc 或基于 clang 的開源前端以及與平臺匹配的閉源后端。
XCC 支持完整的 Xtensa HiFi SIMD 內在函數,而 GCC 不支持 HiFi SIMD。這可能會導致巨大的性能差異,尤其是在處理音頻處理的代碼中。
Cadence xt-xcc 還是 Cadence xt-clang?
這取決于平臺。截至 2020 年 6 月,SOF 支持的大多數平臺都依賴 xt-xcc。展望未來,所有較新的平臺都需要 xt-clang。gcc 前端不支持異常大的寄存器,因此遷移到 xt-clang。
請注意,xt-xcc 并不完全支持 C99。xt-clang 可以。
是否即將支持其它工具鏈?
展望未來,我們希望支持 LLVM C 編譯器。 歡迎補丁。