Files
CherryUSB/docs/source/quick_start/demo.rst
Egahp 5d5b61a606 feat: host add event callback mechanism similar to device
* fix: fix warning for speed_table
* fix(port/dwc2/usb_hc_dwc2): add roothub.speed init
* feat(usbh_core): add event_callback
* fix(usbh_hub): fix event device reset port
* fix(usbh_hub): remove event init when init failed
* feat(usbh_core): add default dummy_event_callback
* fix(usbh_hub): emit reset event only on successful reset
* fix(usbh_core): emit interface start only on successful connect class driver
* feat(usbh_core): change event_callback to typedef
* feat(port): update port usbh init params
* doc: update usbh_initialize desc
* fix(usbh_core): check result from ret == 0 change to ret >= 0
---------

Signed-off-by: egahp <2687434412@qq.com>
2025-08-30 19:24:02 +08:00

210 lines
9.0 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
基于现有 demo 快速验证
=========================
在学习 USB 或者是学习 CherryUSB 代码之前,我们需要先基于现有的 demo 进行快速验证,为什么?是为了提升对 USB 的兴趣,能有信心进行下一步的动作,如果 demo 都跑不起来,或者自己摸索写代码,或者先看 USB 基本概念,结果看到最后,
发现一点都看不懂,概念好多,根本记不住,从而丧失对 USB 的兴趣。因此,先跑 demo 非常重要。下面我将给大家罗列目前支持的 demo 仓库。
基于 bouffalolab 系列芯片(官方 SDK 支持)
------------------------------------------
仓库参考https://github.com/CherryUSB/cherryusb_bouffalolab
- BL616/BL808USB2.0 内置 HS phy 芯片支持主从机。device 支持 5 个端点包括端点0不支持双向同时使用。
- USB 的相关应用位于 `examples/usbdev``examples/usbhost` 目录下,根据官方环境搭建完成后,即可编译使用。
基于 HPMicro 系列芯片(官方 SDK 支持)
-----------------------------------------------------
仓库参考https://github.com/CherryUSB/cherryusb_hpmicro
- HPM 系列: USB2.0 内置 HS phy 芯片支持主从机。device 支持 8/16 端点包括端点0并且可以同时使用双向不同芯片个数有差异。
- USB 的相关应用位于 `samples/cherryusb` ,根据官方环境搭建完成后,即可编译使用。
基于 esp32s2/s3/p4 系列芯片(官方 SDK 即将支持)
-------------------------------------------------
仓库参考https://github.com/CherryUSB/cherryusb_esp32
- esp32s2/s3USB2.0 内置全速 PHY 芯片支持主从机device 支持 7 个端点包括端点0并且可以同时使用双向。
- esp32p4一个 USB2.0 内置全速 PHY 芯片,一个 USB2.0 内置高速 PHY 芯片,支持主从机。
- 默认 demo 采用组件库安装的形式,在 https://components.espressif.com/ 中搜索 cherryusb 即可
基于飞腾派系列芯片(官方 SDK 支持)
-----------------------------------
仓库参考https://gitee.com/phytium_embedded/phytium-free-rtos-sdk
- 飞腾派支持两个 USB3.0 主机(采用 XHCI 两个 USB2.0 主从机
- USB 的相关应用位于 `example/peripheral/usb` ,根据官方环境搭建完成后,即可编译使用。
基于 Essemi 系列芯片(官方 SDK 支持)
-----------------------------------------
仓库参考https://github.com/CherryUSB/cherryusb_es32
- 支持全速和高速主从机。device 支持 6 个端点包括端点0并且可以同时使用双向。
基于 Artinchip 系列芯片(官方 SDK 支持)
-----------------------------------------------
仓库参考https://gitee.com/artinchip/luban-lite
- 支持全速和高速主从机,主机采用 EHCI + OHCI。device 支持 8 个端点包括端点0并且可以同时使用双向。
基于 canmv-k230 芯片(官方 SDK 支持)
---------------------------------------------
仓库参考https://github.com/CherryUSB/k230_sdk
- K230: 两个 USB2.0 内置 HS PHY 芯片支持主从机。device 支持 16 个端点包括端点0并且可以同时使用双向。
基于 NXP MCX系列芯片
---------------------------
仓库参考https://github.com/CherryUSB/cherryusb_mcx 或者 https://github.com/RT-Thread/rt-thread/tree/master/bsp/nxp/mcx
- 支持全速 IP 和高速 IP 高速 IP 支持主机和从机。device 支持 8 个端点包括端点0并且可以同时使用双向。
基于 RP2040/RP2035 芯片(官方 SDK 即将支持)
--------------------------------------------
仓库参考: https://github.com/CherryUSB/pico-examples 和 https://github.com/CherryUSB/pico-sdk
基于 ST 系列芯片
---------------------------
仓库参考https://github.com/CherryUSB/cherryusb_stm32
默认提供以下 demo 工程:
- F103 使用 fsdev ip
- F429 主从使用 USB1, 引脚 pb14/pb15, 默认从机没有开启 DMA 模式
- H7 设备使用 USB0, 引脚 pa11/pa12没有开 DMA 模式。主机使用 USB1 ,引脚 pb14/pb15并且需要做 nocache 处理
demo 底下提供了 **stm32xxx.ioc** 文件,双击打开,点击 **Generate Code** 即可。
.. caution:: 生成完以后,请使用 git reset 功能将被覆盖的 `main.c``stm32xxx_it.c` 文件撤回,禁止被 cubemx 覆盖。
涵盖 F1/F4/H7其余芯片基本类似不再赘述具体区别有
- usb ip 区别F1使用 fsdevF4/H7使用 dwc2
- dwc2 ip 区别: USB0 (引脚是 PA11/PA12) 和 USB1 (引脚是 PB14/PB15), 其中 USB1 默认全速可以接外部PHY 形成高速主机,并且带 dma 功能
- F4 无 cacheH7 有 cache
如果是 STM32F7/STM32H7 这种带 cache 功能,需要将 usb 使用到的 ram 定位到 no cache ram 区域。举例如下
.. code-block:: C
cpu_mpu_config(0, MPU_Normal_NonCache, 0x24070000, MPU_REGION_SIZE_64KB);
对应 keil 中的 sct 脚本修改:
.. code-block:: C
LR_IROM1 0x08000000 0x00200000 { ; load region size_region
ER_IROM1 0x08000000 0x00200000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM2 0x24000000 0x00070000 { ; RW data
.ANY (+RW +ZI)
}
USB_NOCACHERAM 0x24070000 0x00010000 { ; RW data
*(.noncacheable)
}
}
USB Device 移植要点
^^^^^^^^^^^^^^^^^^^^^^
- 使用 **stm32cubemx** 创建工程,配置基本的 RCC、UART (作为log使用)
.. figure:: img/stm32_1.png
.. figure:: img/stm32_2.png
- 如果使用 fsdev ip勾选 **USB** 。如果使用 dwc2 ip勾选 **USB_OTG_FS** 或者勾选 **USB_OTG_HS**。开启 USB 中断,其他配置对我们没用,代码中不会使用任何 st 的 usb 库。
.. figure:: img/stm32_3_1.png
.. figure:: img/stm32_3_2.png
- 配置 usb clock 为 48M
.. figure:: img/stm32_4_1.png
.. figure:: img/stm32_4_2.png
- 选择好工程,这里我们选择 keil设置好 stack 和 heap如果使用 msc 可以推荐设置大点,然后点击 **Generate Code**
.. figure:: img/stm32_5.png
- 添加 CherryUSB 必须要的源码( **usbd_core.c****dwc2/usb_dc_dwc2.c** 或者是 **fsdev/usb_dc_fsdev.c** ,以及想要使用的 class 驱动,可以将对应的 class template 添加方便测试。
.. figure:: img/stm32_6.png
- 头文件该加的加
.. figure:: img/stm32_7.png
- 复制一份 **cherryusb_config_template.h**,放到 `Core/Inc` 目录下,并命名为 `usb_config.h`
.. figure:: img/stm32_8.png
- 如果使用 fsdev ipV1.5.0 开始需要增加 **fsdev/usb_glue_st.c**`usb_config.h` 中实现以下宏,具体数值不同芯片不一样:
.. code-block:: C
#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2
- 编译器推荐使用 **AC6**。勾选 **Microlib**,并实现 **printf** ,方便后续查看 log。
.. figure:: img/stm32_10.png
.. figure:: img/stm32_11.png
.. note :: 以下两个步骤从 V1.5.0 开始不再需要,**fsdev/usb_glue_st.c**, **dwc2/usb_glue_st.c** 文件中已经实现
- 拷贝 **xxx_msp.c** 中的 **HAL_PCD_MspInit** 函数中的内容到 **usb_dc_low_level_init** 函数中,屏蔽 st 生成的 usb 初始化
.. figure:: img/stm32_12.png
.. figure:: img/stm32_14.png
- 在中断函数中调用 `USBD_IRQHandler`,并传入 `busid`
.. figure:: img/stm32_13.png
- 如果芯片带 cachecache 修改参考 :ref:`usb_cache` 章节
- 调用 template 的内容初始化,并填入 `busid` 和 USB IP 的 `reg base` `busid` 从 0 开始,不能超过 `CONFIG_USBDEV_MAX_BUS`
.. figure:: img/stm32_15.png
USB Host 移植要点
^^^^^^^^^^^^^^^^^^^^^^
前面 6 步与 Device 一样。需要注意host 驱动只支持带 dma 的 hs port (引脚是 PB14/PB15),所以 fs port (引脚是 PA11/PA12)不做支持(没有 dma 你玩什么主机)。
- 添加 CherryUSB 必须要的源码( **usbh_core.c****usbh_hub.c****usb_hc_dwc2.c****usb_glue_st.c** 以及 **osal** 目录下的适配层文件),以及想要使用的 class 驱动,并且可以将对应的 **usb host.c** 添加方便测试。
.. figure:: img/stm32_16.png
- 编译器推荐使用 **AC6**。勾选 **Microlib**,并实现 **printf** ,方便后续查看 log。
.. figure:: img/stm32_10.png
.. figure:: img/stm32_11.png
- 复制一份 **cherryusb_config_template.h**,放到 `Core/Inc` 目录下,并命名为 `usb_config.h`
.. note :: 以下两个步骤从 V1.5.0 开始不再需要,**fsdev/usb_glue_st.c**, **dwc2/usb_glue_st.c** 文件中已经实现
- 拷贝 **xxx_msp.c** 中的 `HAL_HCD_MspInit` 函数中的内容到 `usb_hc_low_level_init` 函数中,屏蔽 st 生成的 usb 初始化
- 在中断函数中调用 `USBH_IRQHandler`,并传入 `busid`
.. figure:: img/stm32_19.png
- 链接脚本修改参考 :ref:`usbh_link_script` 章节
- 如果芯片带 cachecache 修改参考 :ref:`usb_cache` 章节
- 调用 `usbh_initialize` 并填入 `busid` 和 USB IP 的 `reg base` 还有 `event_handler` 可缺省为NULL `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS`
- 启动线程
.. figure:: img/stm32_18.png