demo.rst 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. 基于现有 demo 快速验证
  2. =========================
  3. 在学习 USB 或者是学习 CherryUSB 代码之前,我们需要先基于现有的 demo 进行快速验证,为什么?是为了提升对 USB 的兴趣,能有信心进行下一步的动作,如果 demo 都跑不起来,或者自己摸索写代码,或者先看 USB 基本概念,结果看到最后,
  4. 发现一点都看不懂,概念好多,根本记不住,从而丧失对 USB 的兴趣。因此,先跑 demo 非常重要。下面我将给大家罗列目前支持的 demo 仓库。
  5. 基于 bouffalolab 系列芯片(官方 SDK 支持)
  6. ------------------------------------------
  7. .. list-table::
  8. :widths: 10 10 10
  9. :header-rows: 1
  10. * - Repo url
  11. - USB IP
  12. - Version
  13. * - https://github.com/CherryUSB/cherryusb_bouffalolab
  14. - FOTG210
  15. - less than latest
  16. 基于 HPMicro 系列芯片(官方 SDK 支持)
  17. -----------------------------------------------------
  18. .. list-table::
  19. :widths: 10 10 10
  20. :header-rows: 1
  21. * - Repo url
  22. - USB IP
  23. - Version
  24. * - https://github.com/CherryUSB/cherryusb_hpmicro
  25. - CHIPIDEA
  26. - less than latest
  27. 基于 esp32s2/s3/p4 系列芯片(官方 SDK 支持)
  28. -------------------------------------------------
  29. .. list-table::
  30. :widths: 10 10 10
  31. :header-rows: 1
  32. * - Repo url
  33. - USB IP
  34. - Version
  35. * - https://github.com/CherryUSB/cherryusb_esp32
  36. - DWC2
  37. - less than latest
  38. 默认 demo 采用组件库安装的形式,在 https://components.espressif.com/ 中搜索 cherryusb 即可。也可使用官方 idf 仓库下的 cherryusb demo。
  39. ESP-Registry 可以参考官方文档,推荐使用 vscode + esp-idf 的开发环境。
  40. - ctrl + shift + p 选择 ESP-IDF 欢迎界面,然后选择 Component mananger
  41. .. figure:: img/esp1.png
  42. - 找到 cherryusb 并安装
  43. .. figure:: img/esp2.png
  44. - 打开 menuconfig,并打开 cherryusb 的配置,根据实际情况选择主机或者从机模式
  45. .. figure:: img/esp3.png
  46. .. figure:: img/esp4.png
  47. 基于 Phytium 系列芯片(官方 SDK 支持)
  48. ---------------------------------------
  49. .. list-table::
  50. :widths: 10 10 10
  51. :header-rows: 1
  52. * - Repo url
  53. - USB IP
  54. - Version
  55. * - https://gitee.com/phytium_embedded/phytium-free-rtos-sdk
  56. - PUSB2/XHCI
  57. - equal to v1.4.0
  58. 基于 Essemi 系列芯片(官方 SDK 支持)
  59. -----------------------------------------
  60. .. list-table::
  61. :widths: 10 10 10
  62. :header-rows: 1
  63. * - Repo url
  64. - USB IP
  65. - Version
  66. * - https://github.com/CherryUSB/cherryusb_es32
  67. - MUSB
  68. - less than latest
  69. 基于 Artinchip 系列芯片(官方 SDK 支持)
  70. -----------------------------------------------
  71. .. list-table::
  72. :widths: 10 10 10
  73. :header-rows: 1
  74. * - Repo url
  75. - USB IP
  76. - Version
  77. * - https://gitee.com/artinchip/luban-lite
  78. - AIC/EHCI/OHCI
  79. - less than latest
  80. 基于 Kendryte canmv-k230 系列(官方 SDK 支持)
  81. -----------------------------------------------
  82. .. list-table::
  83. :widths: 10 10 10
  84. :header-rows: 1
  85. * - Repo url
  86. - USB IP
  87. - Version
  88. * - https://github.com/CherryUSB/k230_sdk
  89. - DWC2
  90. - less than latest
  91. 基于 NXP MCX 系列芯片
  92. ---------------------------
  93. .. list-table::
  94. :widths: 10 10 10
  95. :header-rows: 1
  96. * - Repo url
  97. - USB IP
  98. - Version
  99. * - https://github.com/CherryUSB/cherryusb_mcx https://github.com/RT-Thread/rt-thread/tree/master/bsp/nxp/mcx
  100. - CHIPIDEA/kinetis
  101. - less than latest
  102. 基于 SiFli SF32 系列芯片(官方 SDK 支持)
  103. --------------------------------------------
  104. .. list-table::
  105. :widths: 10 10 10
  106. :header-rows: 1
  107. * - Repo url
  108. - USB IP
  109. - Version
  110. * - https://github.com/OpenSiFli/SiFli-SDK
  111. - MUSB
  112. - less than latest
  113. 基于 RP2040/RP2035 芯片(官方 SDK 即将支持)
  114. --------------------------------------------
  115. .. list-table::
  116. :widths: 10 10 10
  117. :header-rows: 1
  118. * - Repo url
  119. - USB IP
  120. - Version
  121. * - https://github.com/CherryUSB/pico-examples https://github.com/CherryUSB/pico-sdk
  122. - RP2040
  123. - less than latest
  124. 基于 Actionstech 系列芯片(官方 SDK 支持)
  125. ------------------------------------------------------
  126. Not opensource, 请联系 Actionstech 官方
  127. 基于 ST 系列芯片
  128. ---------------------------
  129. .. list-table::
  130. :widths: 10 10 10
  131. :header-rows: 1
  132. * - Repo url
  133. - USB IP
  134. - Version
  135. * - https://github.com/CherryUSB/cherryusb_stm32
  136. - DWC2/FSDEV
  137. - less than latest
  138. 默认提供以下 demo 工程:
  139. - F103 使用 fsdev ip
  140. - F429 主从使用 USB1, 引脚 pb14/pb15, 默认从机没有开启 DMA 模式
  141. - H7 设备使用 USB0, 引脚 pa11/pa12,没有开 DMA 模式。主机使用 USB1 ,引脚 pb14/pb15,并且需要做 nocache 处理
  142. demo 底下提供了 **stm32xxx.ioc** 文件,双击打开,点击 **Generate Code** 即可。
  143. .. caution:: 生成完以后,请使用 git reset 功能将被覆盖的 `main.c` 和 `stm32xxx_it.c` 文件撤回,禁止被 cubemx 覆盖。
  144. 涵盖 F1/F4/H7,其余芯片基本类似,不再赘述,具体区别有:
  145. - usb ip 区别:F1使用 fsdev,F4/H7使用 dwc2
  146. - dwc2 ip 区别: USB0 (引脚是 PA11/PA12) 和 USB1 (引脚是 PB14/PB15), 其中 USB1 默认全速,可以接外部PHY 形成高速主机,并且带 dma 功能
  147. - F4 无 cache,H7 有 cache
  148. 如果是 STM32F7/STM32H7 这种带 cache 功能,需要将 usb 使用到的 ram 定位到 no cache ram 区域。举例如下
  149. .. code-block:: C
  150. cpu_mpu_config(0, MPU_Normal_NonCache, 0x24070000, MPU_REGION_SIZE_64KB);
  151. 对应 keil 中的 sct 脚本修改:
  152. .. code-block:: C
  153. LR_IROM1 0x08000000 0x00200000 { ; load region size_region
  154. ER_IROM1 0x08000000 0x00200000 { ; load address = execution address
  155. *.o (RESET, +First)
  156. *(InRoot$$Sections)
  157. .ANY (+RO)
  158. .ANY (+XO)
  159. }
  160. RW_IRAM2 0x24000000 0x00070000 { ; RW data
  161. .ANY (+RW +ZI)
  162. }
  163. USB_NOCACHERAM 0x24070000 0x00010000 { ; RW data
  164. *(.noncacheable)
  165. }
  166. }
  167. USB Device 移植要点
  168. ^^^^^^^^^^^^^^^^^^^^^^
  169. - 使用 **stm32cubemx** 创建工程,配置基本的 RCC、UART (作为log使用)
  170. .. figure:: img/stm32_1.png
  171. .. figure:: img/stm32_2.png
  172. - 如果使用 fsdev ip,勾选 **USB** 。如果使用 dwc2 ip,勾选 **USB_OTG_FS** 或者勾选 **USB_OTG_HS**。开启 USB 中断,其他配置对我们没用,代码中不会使用任何 st 的 usb 库。
  173. .. figure:: img/stm32_3_1.png
  174. .. figure:: img/stm32_3_2.png
  175. - 配置 usb clock 为 48M
  176. .. figure:: img/stm32_4_1.png
  177. .. figure:: img/stm32_4_2.png
  178. - 选择好工程,这里我们选择 keil,设置好 stack 和 heap,如果使用 msc 可以推荐设置大点,然后点击 **Generate Code**。
  179. .. figure:: img/stm32_5.png
  180. - 添加 CherryUSB 必须要的源码( **usbd_core.c** 、 **dwc2/usb_dc_dwc2.c** 或者是 **fsdev/usb_dc_fsdev.c** ),以及想要使用的 class 驱动,可以将对应的 class template 添加方便测试。
  181. .. figure:: img/stm32_6.png
  182. - 头文件该加的加
  183. .. figure:: img/stm32_7.png
  184. - 复制一份 **cherryusb_config_template.h**,放到 `Core/Inc` 目录下,并命名为 `usb_config.h`
  185. .. figure:: img/stm32_8.png
  186. - 如果使用 fsdev ip,(V1.5.0 开始需要增加 **fsdev/usb_glue_st.c**) 在 `usb_config.h` 中实现以下宏,具体数值不同芯片不一样:
  187. .. code-block:: C
  188. #define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2
  189. - 编译器推荐使用 **AC6**。勾选 **Microlib**,并实现 **printf** ,方便后续查看 log。
  190. .. figure:: img/stm32_10.png
  191. .. figure:: img/stm32_11.png
  192. .. note :: 以下两个步骤从 V1.5.0 开始不再需要,**fsdev/usb_glue_st.c**, **dwc2/usb_glue_st.c** 文件中已经实现
  193. - 拷贝 **xxx_msp.c** 中的 **HAL_PCD_MspInit** 函数中的内容到 **usb_dc_low_level_init** 函数中,屏蔽 st 生成的 usb 初始化
  194. .. figure:: img/stm32_12.png
  195. .. figure:: img/stm32_14.png
  196. - 在中断函数中调用 `USBD_IRQHandler`,并传入 `busid`
  197. .. figure:: img/stm32_13.png
  198. - 如果芯片带 cache,cache 修改参考 :ref:`usb_cache` 章节
  199. - 调用 template 的内容初始化,并填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBDEV_MAX_BUS`
  200. .. figure:: img/stm32_15.png
  201. USB Host 移植要点
  202. ^^^^^^^^^^^^^^^^^^^^^^
  203. 前面 6 步与 Device 一样。需要注意,host 驱动只支持带 dma 的 hs port (引脚是 PB14/PB15),所以 fs port (引脚是 PA11/PA12)不做支持(没有 dma 你玩什么主机)。
  204. - 添加 CherryUSB 必须要的源码( **usbh_core.c** 、 **usbh_hub.c** 、 **usb_hc_dwc2.c** 、 **usb_glue_st.c** 以及 **osal** 目录下的适配层文件),以及想要使用的 class 驱动,并且可以将对应的 **usb host.c** 添加方便测试。
  205. .. figure:: img/stm32_16.png
  206. - 编译器推荐使用 **AC6**。勾选 **Microlib**,并实现 **printf** ,方便后续查看 log。
  207. .. figure:: img/stm32_10.png
  208. .. figure:: img/stm32_11.png
  209. - 复制一份 **cherryusb_config_template.h**,放到 `Core/Inc` 目录下,并命名为 `usb_config.h`
  210. .. note :: 以下两个步骤从 V1.5.0 开始不再需要,**fsdev/usb_glue_st.c**, **dwc2/usb_glue_st.c** 文件中已经实现
  211. - 拷贝 **xxx_msp.c** 中的 `HAL_HCD_MspInit` 函数中的内容到 `usb_hc_low_level_init` 函数中,屏蔽 st 生成的 usb 初始化
  212. - 在中断函数中调用 `USBH_IRQHandler`,并传入 `busid`
  213. .. figure:: img/stm32_19.png
  214. - 链接脚本修改参考 :ref:`usbh_link_script` 章节
  215. - 如果芯片带 cache,cache 修改参考 :ref:`usb_cache` 章节
  216. - 调用 `usbh_initialize` 并填入 `busid` 和 USB IP 的 `reg base` 还有 `event_handler` 可缺省为NULL, `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS`
  217. - 启动线程
  218. .. figure:: img/stm32_18.png