探索CherryUSB主机栈:嵌入式系统的高效USB设备管理

【免费下载链接】CherryUSB CherryUSB is a tiny and portable USB Stack (device & host) for embedded system with USB IP 【免费下载链接】CherryUSB 项目地址: https://gitcode.com/gh_mirrors/ch/CherryUSB

CherryUSB是一款针对嵌入式系统设计的轻量级USB协议栈,支持设备模式和主机模式。本文将重点介绍其主机栈功能,展示如何在嵌入式环境中实现高效的USB设备管理,帮助开发者快速集成各类USB外设。

为什么选择CherryUSB主机栈?

在嵌入式开发中,USB主机功能往往面临资源有限、兼容性复杂等挑战。CherryUSB主机栈通过以下特性解决这些痛点:

  • 超轻量级设计:核心代码仅需几十KB存储空间,适合资源受限的嵌入式设备
  • 跨平台兼容:支持多种MCU架构,包括ARM、RISC-V等主流处理器
  • 丰富的类驱动:内置HID、MSC、CDC、Audio等常用USB设备类驱动
  • 高效数据传输:优化的urb(USB请求块)管理机制,实现稳定的高速数据传输

CherryUSB主机栈架构 CherryUSB主机栈架构示意图,展示了从硬件抽象层到应用层的完整层次结构

核心功能与架构解析

CherryUSB主机栈采用分层设计,主要包含以下模块:

1. 硬件抽象层(HAL)

位于port/目录下,针对不同USB控制器(如DWC2、EHCI、XHCI)提供统一接口。例如:

  • port/dwc2/usb_hc_dwc2.c:DWC2控制器主机模式驱动
  • port/ehci/usb_hc_ehci.c:EHCI高速USB主机控制器驱动

2. 核心协议层

核心实现位于core/usbh_core.ccore/usbh_core.h,包含:

  • 设备枚举与配置管理
  • 端点请求处理
  • 总线管理与设备地址分配

关键函数usbh_initialize()负责初始化主机控制器,usbh_enumerate()处理设备枚举流程,这两个函数构成了主机栈的核心骨架。

3. 类驱动层

位于class/目录,提供各类USB设备的标准驱动:

  • class/hid/:人机接口设备(键盘、鼠标等)
  • class/msc/:大容量存储设备(U盘、移动硬盘等)
  • class/cdc/:通信设备类(虚拟串口等)
  • class/audio/:音频设备类

实战应用:高性能USB设备通信

1. 高速网络适配器测试

通过AX88772 USB以太网控制器,CherryUSB主机栈实现了高达94Mbps的TCP吞吐量:

USB以太网性能测试 AX88772 USB以太网控制器iPerf测试结果,显示94208 kbits/s的传输速度

核心实现位于class/serial/usbh_cdc_ecm.c,通过CDC-ECM协议实现网络数据传输。

2. 大容量存储设备访问

在XHCI控制器上测试USB存储设备,实现128MB/s的读取速度:

USB存储性能测试 XHCI控制器下USB存储设备基准测试,读取速度达128.53 MB/sec

相关代码在class/msc/usbh_msc.c中,支持SCSI命令集和多种文件系统。

3. USB Wi-Fi适配器支持

通过RTL8188EU芯片实现Wi-Fi连接,支持扫描、连接和TCP/IP通信:

USB Wi-Fi功能测试 USB Wi-Fi适配器扫描和连接测试,显示成功获取IP地址并进行iPerf测试

实现代码位于class/wireless/usbh_rndis.c,利用RNDIS协议实现网络连接。

快速上手:从零开始使用CherryUSB主机栈

1. 环境准备

git clone https://gitcode.com/gh_mirrors/ch/CherryUSB
cd CherryUSB

2. 基础配置

修改usb_config.h设置主机模式相关参数:

  • CONFIG_USBHOST:启用主机模式
  • CONFIG_USBHOST_MAX_BUS:设置支持的USB总线数量
  • CONFIG_USBHOST_MAX_INTERFACES:设置最大接口数量

3. 初始化主机栈

#include "usbh_core.h"

void usb_host_init(void)
{
    usbh_initialize(0, USB_OTG_FS_BASE, NULL);
}

4. 事件处理

通过注册事件回调函数处理设备连接/断开事件:

static void usb_host_event_handler(uint8_t busid, uint8_t hub_index, 
                                  uint8_t hub_port, uint8_t intf, uint8_t event)
{
    switch(event) {
        case USBH_EVENT_DEVICE_CONNECTED:
            USB_LOG_INFO("Device connected\n");
            break;
        case USBH_EVENT_DEVICE_DISCONNECTED:
            USB_LOG_INFO("Device disconnected\n");
            break;
        // 其他事件处理...
    }
}

高级特性与优化技巧

1. 多设备并发管理

CherryUSB支持通过USB hub连接多个设备,通过usbh_hub.c实现集线器管理,可在port/hub/目录下找到相关实现。

2. 电源管理

通过usbh_hubport_release()函数实现设备断开时的资源释放,优化系统功耗。

3. 性能调优

  • 调整CONFIG_USBHOST_REQUEST_BUFFER_LEN优化控制传输缓冲区大小
  • 设置CONFIG_USBHOST_MAX_ENDPOINTS调整端点数量
  • 通过usbh_urb_fill()系列函数优化数据传输

结语

CherryUSB主机栈为嵌入式系统提供了一套完整、高效的USB设备管理解决方案。无论是简单的HID设备还是复杂的网络适配器,都能通过其模块化设计快速集成。其轻量级特性和跨平台优势,使其成为各类嵌入式项目的理想选择。

要了解更多细节,可以参考项目中的示例代码和文档:

  • 官方示例:demo/usb_host.c
  • API文档:docs/en/api/api_host.rst
  • 类驱动实现:class/目录下的各类驱动代码

通过CherryUSB,开发者可以轻松为嵌入式系统添加强大的USB主机功能,加速产品开发进程。

【免费下载链接】CherryUSB CherryUSB is a tiny and portable USB Stack (device & host) for embedded system with USB IP 【免费下载链接】CherryUSB 项目地址: https://gitcode.com/gh_mirrors/ch/CherryUSB

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐