目前的位置: 首页 学术信息 正文

ZDS 2023技术报告分享第16篇:新的USB设备类API简介


前言

2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。


ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。


今天分享第16篇技术报告,题目为:

新的USB设备类API简介




新的USB设备支持状态

  • 三个UDC(USB Device Class)驱动程序和一个驱动程序骨架

  • 新的类实现

    • 蓝牙HCI USB传输层

    • USB CDC ACM

    • USB CDC ECM

    • USB大容量存储类

  • 需要移植的类

    • 音频(进行中)

    • HID(进行中)

    • USB DFU

    • RNDIS -> CDC NCM

    • 大容量存储类



API需求

函数示例(设备处于配置状态)

  • 类实现为主机提供了一些功能

  • 通过控制,中断,批量...管道进行通信

  • 接口描述符描述了实现接口

  • 实现至少需要一个接口描述符

  • 主机类驱动程序和设备堆栈需要了解有关类实现的“所有”信息都由接口描述符提供

  • 接口描述符是配置描述符的一部分

  • 接口是配置的一部分

  • 一次只能有一个配置处于活动状态


USB设备配置


应用程序负责配置和初始化

  • 应用程序必须实例化一个或多个USB设备实例

  • 应用程序必须为每个设备实例实例化至少一个配置

  • 应用程序必须将所需的类实例添加到特定的配置中

  • 应用程序必须初始化特定的USB设备实例

  • 应用程序可以启用特定的USB设备实例


用于测试的替代方案 - shell支持


类API的需求

  • 初始化处理程序

  • 关闭处理程序

  • 关联配置已选择事件处理程序

  • 关联配置已禁用事件处理程序

  • USB控制请求处理程序(发送给主机,发送给设备)

  • 接口配置更新处理程序

  • 端点传输请求完成事件处理程序

  • 暂停/恢复事件处理程序

  • 功能停止状态更新处理程序



USBD类实现

类实例化

  • 使用USBD_DEFINE_CLASS()宏和以下方法之一:

    • 如果涉及到设备模型,请使用DT_INST_ FOREACH_STATUS_OKAY()

    • 否则,定义一个由应用程序使用的实例化宏

    • 实例化宏和LISTIFY宏的组合

  • USB HID类实现是一个具有挑战性的例子


类初始化处理程序(init)

  • 在初始化过程中,堆栈会更新所有接口号和端点地址

  • 处理程序在usbd_init()的结果下被调用

  • 实现应该使用它来更新某些描述符部分

  • 处理程序可用于实例化接口字符串描述符


类关闭处理程序(shutdown)

  • 处理程序在usbd_shutdown()的结果下被调用

  • 实现可以使用它来删除自己的字符串描述符

  • 最后,堆栈会从配置中移除类实例


Class Enabled处理程序与Update处理程序

  • Enabled处理程序在关联的配置被选中时被调用

  • Update处理程序在接口替代发生改变时被调用

  • 这两个处理程序都可以用于触发特定的动作

  • CDC ECM使用Update处理程序来启用网络接口并启动OUT传输

  • CDC ACM使用Enabled处理程序来启用UART RX IRQ(接收中断请求)


控制请求

  • 为主机到设备和设备到主机请求分别设置独立的处理程序,类实现不需要检查传输方向

  • 协议错误通过errno变量来表示,返回值表示非协议错误

  • 使用USBD_VENDOR_REQ()宏将支持的供应商请求对设备堆栈可见(接收者为设备)

  • 处理程序不应该分配或释放缓冲区,这由较低层级和设备框架完成

  • 如果不使用控制传输,则类不能实现此处理程序


传输请求完成处理程序(request)

  • 类实现使用usbd_ep_enqueue()提交传输请求

  • 处理程序在完成中断/批量/ISO传输请求后被调用,无论结果如何

  • 如果只使用控制传输,则类不能实现此处理程序,例如USB DFU类


同步传输

  • 没有针对同步传输的特定支持

  • 实现应该使用信号量,信号量在传输排队后立即获取,在传输完成处理程序中释放


注意事项

  • 所有处理程序在USB设备堆栈的线程上下文中执行

上一条:ZDS 2023技术报告分享第17篇:HIFI 4 DSP与Zephyr 下一条:ZDS 2023技术报告分享第15篇:Zephyr时钟系统重构

关闭

嵌入式与网络计算湖南省重点实验室
版权所有 © 2023 湖南大学