前言
2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。
ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。
“在基于ARM Cortex®-A的设备上使用Zephyr RTOS启用Sound Open Firmware(SOF)”
作者简介
Dainiel在罗马尼亚的NXP公司工作,为i.MX主板添加Linux内核音频驱动程序。他是布加勒斯特POLITEHNICA大学操作系统内部课程的助教,非常热衷于帮助新手进入Linux内核世界,同时也是Google Summer of Code中的导师。
文章简介
本文主要介绍了Sound Open Firmware Sound Open Firmware(简称SOF)这样一个开源的音频固件和软件开发套件,且重点在于主要说明了SOF的Jailhouse支持、Linux驱动支持以及Zephyr支持。
音频基础知识和SOUND OPEN FIRMWARE解决方案概述
嵌入式音频系统的结构图:
声音开放固件解决框架图:
NXP I.MX8MP应用程序处理器架构图:
NXP I.MX95应用程序处理器架构图:
Sound Open Firmware Sound Open Firmware(简称SOF)是一个开源的音频固件和软件开发套件。它提供了一个具有BSD/MIT许可的固件以及BSD/GPL许可的Linux驱动程序。最初,它是为Cadence HIFI DSP系列开发的。SOF是一个跨平台的解决方案,支持多个主机平台,包括使用Intel和AMD的x86平台以及使用NXP和Mediatek的arm64平台。SOF是面向DSP无关的,它提供了一个通用的操作系统接口,使得它可以与不同的DSP(数字信号处理)硬件进行交互。SOF还提供了一些工具,包括专有和开源工具链以及库。它还包括一个用于记录系统日志和运行时调试功能的日志系统。SOF使用ALSA(Advanced Linux Sound Architecture)接口,作为与操作系统和应用程序之间进行音频数据交换的桥梁。ALSA是Linux内核提供的音频设备驱动程序框架,允许音频数据在硬件和软件之间进行传输和处理。
Linux中音频堆栈的情况:所有设备由Linux内核管理,音频应用程序使用ALSA接口,ALSA是"Advanced Linux Sound Architecture"的缩写,是Linux上的音频子系统, 典型的硬件IP涉及Digital Audio Interface(数字音频接口)负责将数字音频数据传输到和从其他硬件组件(如Codec)进行交换、Codec(编解码器):Codec是用于将模拟音频信号转换为数字音频数据、DMA(直接内存访问):DMA是一种用于高效数据传输的技术,它可以绕过CPU,直接在内存之间传输数据。
Jailhouse支持
在ARM架构多核处理器中,通常使用其中一个核心来专门处理音频相关的任务,以提高性能和实时性。,这一做法是利用Jailhouse在多核处理器上创建虚拟化的环境,以便在不同的核心上运行独立的实时任务。在这种情况下,Jailhouse可以用于隔离音频任务,确保它们不会干扰其他核心上的操作系统或应用程序。
Jailhouse Hypervisor的具体的做法如下:静态分区型虚拟化监控程序(static partitioning hypervisor)将现有的硬件资源划分为隔离的"cells",其中Linux作为根"cell"首先启动。在Linux启动后,加载Jailhouse内核模块以支持虚拟化,并启用根"cell",它具有直接访问物理硬件资源的权限。然后,根"cell"创建一个被监控的"inmate cell",并在其中加载zephyr.bin文件。zephyr.bin表示"inmate cell"将运行Zephyr操作系统或应用程序。最后,被监控的"inmate cell"启动,它在分配的资源上运行Zephyr环境。这种静态分区型虚拟化的方式实现在一个物理系统上同时运行多个隔离的执行环境,提供更高的安全性和资源隔离。
SOF的Linux驱动
SOF的Linux 驱动架构图
SOF Linux驱动的ALSA组件包括机器驱动、PCM驱动、通用IPC驱动和DSP平台驱动。这些组件协同工作,实现了与硬件设备的交互、PCM数据处理、ALSA命令传输和固件通信等功能,从而使SOF能够在Linux系统中提供完整的音频支持。
ALSA PCM操作(PCM OPS)是与音频流处理相关的操作集合,它定义了在ALSA PCM层面上执行的操作。以下是一些常见的ALSA PCM操作:
ALSA(Advanced Linux Sound Architecture)框架图
SOF(Sound Open Firmware)使用自定义IPC(Inter-Process Communication)协议来实现Linux主机与固件之间的通信。这个自定义协议包括多个功能和步骤,以确保音频设备在Linux系统上能够正确运行和进行配置,SOF IPC自定义协议的关键要点有:1. 固件加载(Firmware Load)2. 拓扑加载(Topology Load)3. 自定义传输协议(Custom Transport Protocol)4. 主机AP发送命令(Host AP Sends Commands)5. 辅助核心发送通知(Secondary Core Sends Notifications)
SOF(Sound Open Firmware)提供了一些实用工具,用于在Linux系统上与SOF驱动程序和固件进行交互。以下是一些常见的SOF实用工具:
sof-logger:这是一个用户空间应用程序,用于从共享内存中读取日志。SOF驱动程序可以将日志写入共享内存,而sof-logger可以读取这些日志并将其显示给用户,以便进行故障排除和调试。
rimage:这是一个用于创建固件镜像的工具。它将SOF固件的ELF格式文件封装到特定的二进制格式中,以便固件加载器可以正确识别和加载固件。
拓扑文件(Topology files):拓扑文件描述了音频组件的配置和连接关系。它是一种描述音频拓扑结构的文件格式,并基于此,Linux内核可以向固件发送命令来创建音频拓扑组件。拓扑文件是用于定义音频设备的特定配置的重要工具。
sof-ctl:这个工具用于向SOF固件发送自定义配置。通常,这些配置以二进制blob的形式进行编码,sof-ctl负责将其发送给固件,以便进行特定的配置更改。通过sof-ctl,用户可以调整和定制SOF固件的行为。
HiFi 4 DSP支持使用Zephyr操作系统的Sound Open Firmware(SOF)。此外,它还具有自定义的固件加载器和IPC框架,用于与SOF特定的API进行通信。这意味着可以使用SOF特定的API加载和运行自定义。
SOUND OPEN FIRMWARE(SOF)的开发方向包括以下几个关键点:
许可证和编程语言:SOF的代码采用宽松的BSD/MIT许可证,使其在使用和修改上更加灵活。代码是用C语言编写的,并且以体系结构无关的方式编写,最初支持Cadence Xtensa DSP。
体系结构支持:SOF最初支持英特尔所使用的HIFI2和HIFI3系列的Cadence Xtensa DSP,以及NXP在i.MX8MP、i.MX8QXP和i.MX8QM上使用的HIFI4 DSP。这些芯片架构为SOF提供了硬件加速和音频处理功能。
运行时选择功能:SOF支持在运行时使用Kconfig进行功能选择,这样可以根据具体需求为特定的平台或应用程序配置和启用功能。这种动态配置使得SOF能够灵活适应各种不同的音频场景和要求。
支持用户定义的音频场景:SOF支持用户在运行时加载动态的管道拓扑结构,以支持用户定义的音频场景。这允许用户在不重新编译固件的情况下动态配置音频处理流程,以满足特定的应用需求。
逐步转向Zephyr:SOF最初采用了XTOS作为其模块化设计的基础。然而,XTOS仅支持Xtensa体系结构,因此SOF正在逐步过渡到使用Zephyr作为基础。这将使SOF能够在Xtensa架构上继续支持,并且还能够扩展至arm64等其他体系结构。
而在Zephyr中继续增强对SOF的支持的方向包括以下几个方面:
消息单元(Messaging Unit):Zephyr中已经存在ipm_imx模块,但需要进行一些调整以适应SOF的IPC需求。这意味着需要对现有的消息传递机制进行适配,以确保SOF固件和Zephyr操作系统之间的有效通信。
中断控制(Interrupt Steer):需要针对Zephyr使用中断控制器API进行适配。这样SOF可以管理硬件中断,并与Zephyr的中断处理机制进行集成,以确保对中断的正确处理和分配。
时钟管理(Clocks):将时钟管理从主机操作系统(Host OS)移至SOF固件一侧。这意味着SOF固件将负责管理和配置硬件时钟,而不再依赖于主机操作系统的时钟管理。
电源域(Power domains):同样将电源域管理从主机操作系统移至SOF固件一侧。SOF固件将负责管理与功耗相关的硬件电源域,以实现更高效的功耗管理和控制。
解耦固件和主机操作系统:实现固件的独立运行,即使不依赖于主机操作系统也能够运行。
这样一来,SOF固件可以以独立的方式工作,而不必依赖特定的主机操作系统。这可能有助于在i.MX RT系列等特定平台上启用SOF固件的支持。