前言
2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。
ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。
今天分享第29篇技术报告,由赵思蓉整理,题目为:
“从应用程序的角度概述Zephyr RTOS中的USB设备支持”
作者简介

Johann Fischer
Johann是挪威半导体公司NORDIC SEMICONDUCTOR ASA的研发工程师,自2016年柏林举办的ELCE 2016大会后便成为Zephyr项目的贡献者。作者的主要职责之一是在Zephyr操作系统中维护USB支持。除了USB之外,作者还对传感器、显示控制器、磁盘驱动器和MODBUS感兴趣并做出了贡献。
文章简介
Zephyr RTOS自其初始阶段就具备了USB设备支持的实现。除了在用户应用程序中直接使用外,Zephyr RTOS中的各种子系统也利用了设备支持。自版本v.3.3.0以来,作为实验性USB支持的一部分,还引入了新的设备堆栈。作者将从应用程序的角度概述Zephyr RTOS中的USB设备支持,以及支持中的差异和特性。文章将从配置USB设备支持开始,说明如何选择所需的功能(类别)以及如何启用USB设备支持。作者将逐步深入了解不同的USB类别实现,并解释它们的特点以及它们如何与其他子系统一起工作。
如何启用USB设备支持
通过对设备树的配置进行修改,来使Zephyr支持USB设备,主要是如下配置选项。

下面提供了最小的代码启动USB,来使能USB的支持。每次底层创建新对任务时,都会申请启动使能,但可能会延迟申请,所以可以提前准备启动USB使能。

还有其他的一些配置项:
CONFIG_USB_COMPOSITE_DEVICE:用于启用或禁用USB复合设备支持,允许一个物理设备提供多种不同的功能或接口
CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT:用于指定是否在系统启动时初始化USB 设备
CONFIG_USB_DEVICE_BOS:用于启用或禁用 USB 设备的BOS支持
CONFIG_USB_DEVICE_OS_DESC:用于启用或禁用 USB 设备的操作系统描述符(OS_DESC)支持
可以通过应用程序来添加新的USB设备支持,添加供应商ID等相关信息来启动使能,比如下面这个示例:

UART驱动程序API被各种子系统用于通信
UART API有三种类型:轮询(polling)、中断驱动(interrupt driven)和异步(ASYNC)
CDC ACM实现提供了一个虚拟UART接口
期望模拟行为与实际接口相似
CDC ACM实现支持轮询和中断驱动的API
通信完全由主机(host)决定
应用程序无法直接访问主机端,不存在IN/OUT令牌
如果USB设备未配置,传递给uart_poll_in()或uart_fifo_fill()函数的数据将被丢弃
如果处于配置状态,uart_poll_in()函数将从尾部丢弃字符
在设计应用程序时,应使用UART API进行设计,而不是针对特定的CDC ACM UART实现

Mass Storage Class(MSC)

蓝牙 HCI USB 传输层
Zephyr支持蓝牙低功耗控制器(LE Link Layer)
不支持BR/EDR SCO(蓝牙经典音频链路)
HCI RAW API公开了与远程设备通信的HCI接口
蓝牙HCI USB传输层使用HCI RAW API
实现新旧USB设备支持
当前的实现不能与其他类别组合使用

网络

新的USB设备支持的实现正在进行中
当前的HID实现支持多个实例,并使用了设备驱动模型(Device Driver Model)
没有特定的HID设备API,但提供了hid_ops接口
使用LISTIFY宏和CONFIG_ USB_ HID_ DEVICE_ COUNT进行实例化
每个实例需要一个HID报告描述符和一个中断输入端点,输出端点是可选的
遵循USB音频规范版本1.00
仅支持同步类型
支持多个实例
使用了设备驱动模型(Device Driver Model)
没有特定的USB音频设备API,但提供了usb_audio_ops接口
使用LISTIFY宏和设备树(devicetree)进行实例化
USB固件(DFU)