RT-Thread论坛
直播中

刘丽菲

8年用户 986经验值
私信 关注
[问答]

Cherry USB可以在cortex-A7 开发板上使用吗?

请教下 Cherry USB 可以在cortex-A7 开发板上使用吗

回帖(1)

陈敏

2025-10-10 17:36:22

基于我的理解,Cherry USB 是完全可以在 Cortex-A7 开发板上运行的,技术上绝对可行,但通常需要一定的适配工作(端口/移植)。 下面解释一下原因和需要考虑的关键点:


核心依据/可行性分析



  1. 架构无关性 (主要使用 C 语言): Cherry USB 的核心是一个用 C 语言编写的嵌入式 USB 协议栈。C 语言具有良好的可移植性,可以在任何配备了 C 编译器的 CPU 上运行,这与 CPU 指令集架构(如 ARM Cortex-A7)无关。

  2. 支持多种 USB 模式: Cherry USB 设计上既支持 USB Device (设备/Gadget) 模式,也支持 USB Host (主机) 模式,并提供了各种 USB Class(如 MSC, HID, CDC, Audio, Video, DFU等)。Cortex-A7 开发板通常同时具备或只具备其中一种控制器类型(比如 Host-only ETH 开发板、OTG/Device-only 的穿戴板、兼具的通用板)。

  3. 嵌入式设计理念: Cherry USB 的核心设计目标就是资源有限的嵌入式环境(相比庞大的 Linux USB 子系统)。Cortex-A7 虽然性能比 Cortex-M 强很多,但在嵌入式领域也是主流,RAM 和 Flash 资源对 Cherry USB 来说通常不是问题。


  4. 平台抽象层 (HAL, PAL): Cherry USB 的设计清晰地划分了核心协议栈层平台适配层。核心协议栈处理 USB 标准协议逻辑,与具体硬件无关。平台适配层 (hw_interface, hal, pal) 则负责:



    • 与具体的 USB 控制器驱动交互(读写寄存器、申请/处理传输描述符)。

    • 提供基本的时钟延时中断操作的封装。

    • 提供必要的电源管理接口。

    • 提供日志/调试输出接口。


    ? 因此,在 Cortex-A7 上跑 Cherry USB 的关键在于:为你的具体开发板实现好这个平台适配层(即 Porting 移植工作)。




关键考虑点与需要做的工作(端口/移植)




  1. USB 控制器驱动:



    • 最核心的部分! Cortex-A7 开发板上的 USB 功能是由底层具体型号的 USB 控制器 IP 核实现的(如 DesignWare USB OTG, Synopsys OTG, 或芯片厂商自己的 IP)。你需要为这个 具体的 USB 控制器硬件 编写底层驱动 (或者找到适配的驱动代码),实现 Cherry USB 的 HAL/PAL 层所要求的接口。

    • 从哪里获取驱动基础?

      • 芯片厂商 SDK/BSP: NXP (i.MX 6/7/8M Mini)、STMicro (STM32MP1)、Allwinner (V3s/S3/R328)、Rockchip 等为他们的 Cortex-A 系列芯片提供官方的 Linux BSP/SDK 或裸机/RTOS SDK。这些 SDK 中通常包含针对其 USB 控制器 IP 的寄存器级驱动

      • “借鉴” RTOS 或裸机例子: 如果官方 SDK 提供了 FreeRTOS、Zephyr、RT-Thread 或裸机下的 USB 示例,这部分 USB 控制器操作代码是最有价值的起点。

      • Linux 内核驱动源码: 虽然庞大复杂,但阅读内核中对应 USB 控制器驱动(drivers/usb/dwc2/, drivers/usb/dwc3/, drivers/usb/chipidea/ 等) 的寄存器操作部分和中断处理逻辑,可以加深理解,但请注意 Cherry USB 是裸机协议栈,千万别把依赖 Linux-Subsystem 操作直接搬来用





  2. 开发环境和工具链:



    • 需要为 Cortex-A7 配置好交叉编译工具链(如 GCC for ARM arm-none-eabi-arm-linux-gnueabihf-, 如果你选择在 OS 环境下推荐选带硬浮点的后者)。如果是开发板系统开发通常还涉及 U-Boot/Linux Kernel/文件系统编译等,但若仅用 Cherry USB 则选裸机开发即可(用 arm-none-eabi 工具链更简明)。

    • Makefile 或 CMake 项目需要配置正确,链接到正确的运行时库(裸机通常 --specs=nosys.specs)。




  3. 内存管理:



    • Cherry USB 会动态分配内存(用于配置端点描述符、传输缓冲区等)。在裸机环境下,你需要提供一个可靠的堆内存管理器。malloc/free 的实现要确保安全可用。

    • 如果内存紧张(虽不太可能),需要考虑静态分配或优化配置。




  4. 中断处理:



    • 配置好 USB 控制器中断向量 (IRQ),并在中断服务程序中调用 Cherry USB 提供的 usb_irq_handler(其具体名由平台自定义,如 usb_dc_isr_handler)来处理 USB 事件。




  5. 时钟与延时:



    • 为 USB 控制器提供合适的输入时钟(通常通过 PLL 配置),并启用其 PHY。

    • 实现 Cherry USB HAL 层所需的 usb_dc_delay_ms/usb_dc_delay_us 等延时函数(可以是忙等待或基于硬件定时器)。




  6. 模式选择 (DCD, HCD):



    • 根据你的 USB 控制器能力(OTG/Host-only/Device-only)和应用需求,在编译 Cherry USB 时选择使能 Device Controller Driver (DCD) 或 Host Controller Driver (HCD)。

    • OTG 控制器通常可以配置成 Host 或 Device 模式。

    • 某些 IP (如 DWC2) 可能需要配置不同的固件来运行 Device/Host 模式。




  7. USB PHY (物理层):



    • USB PHY 可能需要特定的初始化序列(如配置 UTMI/ULPI 接口,设置电荷泵等)。这部分通常在芯片厂商的参考驱动或 SDK 中提供示例代码。对稳定性非常重要的硬件初始化环节。




  8. 日志与调试:



    • 实现 Cherry USB 内部日志输出的底层接口(如重定向 printf 到串口)。Cherry USB 的调试信息非常宝贵,通过串口输出日志是移植和调试的得力助手。

    • 需要准备串口调试线甚至逻辑分析仪或 USB 分析仪(好的解决方案如 Saleae) 在实际设备连接出错时用于抓包分析调试。




总结 (我会这样建议你?)



  1. 明确目标: 你想让开发板作为一个 USB 设备?(如 U 盘、键盘鼠标、序列口)模式运行,还是作为一个 USB (主)主机(如读U盘、连接摄像头)?确定你的目标应用场景(Cherry 支持类型参考官方文档)。

  2. 查清硬件: 明确你的开发板上 USB 控制器的具体型号 和连接方式 (Host/Device/OTG 控制器类型?物理接口类型?主控芯厂商文档有无现成驱动?)。

  3. 寻找驱动基础:

    • 首要目标: 查看开发板供应商或主控芯片厂商是否提供裸机/RTOS 下的 USB 控制器驱动代码(常见驱动为 dwc2, dwc3, chipidea, musb)。

    • 备选方案: 如果没有裸机驱动,仔细研读其 Linux BSP 中对应驱动的部分寄存器操作和中断处理,并在你的移植代码中简化封装实现


  4. 准备开发环境: 搭建 Cortex-A7 的 交叉编译工具链

  5. 新建移植项目:

    • 创建新目录存放平台适配代码。

    • 根据 Cherry USB 的 docs/get_started.md 文档要求/参考 templatestm/rp 等已有示例(仅看实现结构)实现适配层接口,避免重复造轮子。

    • 包含芯片厂商的底层 USB 驱动或你封装的底层驱动。


  6. 实现 HAL/PAL 接口: 基于现有的底层驱动?,实现 Cherry USB 适配层接口中大头部分:

    • USB 控制器初始化使能 (usb_dc_init)

    • 端点配置 (ep_config)

    • 读写数据 API (ep_write, ep_read)

    • 中断服务程序调用 (usb_dc_isr)。


  7. 编译、烧录、调试: 应通过串口调试随时输出 Cherry USB 状态枚举流程及相关错误信息,减少定位问题的艰难程度。


? 最终结论: Cherry USB 的设计保证了它在 ARM Cortex-A7 这样的主流嵌入式处理器上完全可以跑通,且非常契合裸机或RTOS场景节省资源的需求。能否“开箱即用”?这取决于你的具体板卡芯片型号和应用场景——深度匹配情况下可直接上手(但可能性偏低),更多时候是参照已适配芯片平台(如 stm32/rp2040/NXPkinetis),针对目标平台进行迁移工作(即porting)。只要你愿意花时间去处理好平台适配层的各项因素,让它在你的A7开发板上跑起来一点也没问题!?

举报

更多回帖

发帖
×
20
完善资料,
赚取积分