Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CherryUSB
STM32
基于 CherryUSB 调试 dwc2 usb host 笔记
20.00
发布于 2022-06-13 23:33:18 浏览:4652
订阅该版
[tocm] ## 背景 之前适配 DWC2 USB IP 的时候,主要是基于 st 的 hal 库来走的,当时我就对他们的 hal 库代码不满,只是无奈,迫于时间就没重构,果不其然,usb bug 一堆,随意举例,这还只是冰山一角。 https://club.rt-thread.org/ask/article/dac2a83e018f6ad2.html https://club.rt-thread.org/ask/article/b39785f4dd8a6032.html 再论 usb 的性能,那 hal 库写的,性能直接歇菜,根本没法用。 ## 排坑 ok,现在我们开始一步步排坑 - 全局中断 SOF 首先是全局中断 SOF ,这是一个比较坑的,尤其是带了 OS 以后,几个意思,跟我 os 抢中断呢?sof 中断 1ms会触发一次,很费中断。为什么会有这个中断开启?后面再来说,结论就是 dwc2 这个ip太辣鸡,硬件做的很随意,功能没有做到硬件上去,而这个 sof 主要就是给中断传输和同步传输用的。 ![QQ图片20220613230829.png](https://oss-club.rt-thread.org/uploads/20220613/5b84aa1d18091292a73ad9f74193620e.png "QQ图片20220613230829.png") - HCFG 中的 bit 0-1 这也是坑,我们直接看结论,人家手册里说了,每次设置时,需要复位,st 代码中楞是一个字没看见。小坑 ![QQ截图20220613231215.png](https://oss-club.rt-thread.org/uploads/20220613/31c9536bc90106277ea899242d32e1d0.png "QQ截图20220613231215.png") - HCINTMSK 中的 USB_OTG_HCINTMSK_NAKM 这里面中断标志那是相当多,最坑的是什么,`USB_OTG_HCINTMSK_NAKM`,我可以说,论坛出现的所有 NAK 的原因都是他造成的,什么枚举 NAK,U盘 NAK,都是他。究其原因,NAK 表示当前没有准备好,需要重试,但是其实并不需要,st 的代码中,进入 NAK 中断以后会关闭当前通道传输,然而,对于控制和批量传输这是没有必要的,传输是可以等到完成的。开了这个,就会造成,各种地方需要手动重发,然后读 `HAL_HCD_HC_GetURBState`,没有必要,关掉该中断给你带来无限可能。 ![QQ截图20220613231506.png](https://oss-club.rt-thread.org/uploads/20220613/37e01cea89cecf504403cf73ea5b3e2b.png "QQ截图20220613231506.png") - HAL_HCD_HC_SubmitRequest 大坑来了,此函数就是配置发送需要的 size、packet、buf地址等等。坑1:有 dma 没见你用。坑2:`hc->xfer_len` 并不能为所欲为的传任何值。坑3:开了 fifo 不为空中断,却没有该中断处理。 ![QQ截图20220613232024.png](https://oss-club.rt-thread.org/uploads/20220613/c533f0516985ee12541ba673bf9c1c46.png "QQ截图20220613232024.png") ![QQ截图20220613232146.png](https://oss-club.rt-thread.org/uploads/20220613/a3dd2a4262aca3f1ba2dbb5dfac2112c.png "QQ截图20220613232146.png") ## 修改 - 能用 dma 的全都用 dma - 关闭 NAK 中断,中断和同步传输保留 - HAL_HCD_HC_SubmitRequest 函数设计太拉稀,我们需要做一个调用一次,大小随意,具体切包的实现在完成中断中,最后达到满意的大小后,释放信号量,达到最大带宽。比如我要发送 16K,我只管传16K,里面怎么发,设计好就行,后续看我代码吧。现在的函数是不行的。 - 中断和同步传输,由于硬件太坑,只能用定时器了,因为中断和同步,调用类似 `HAL_HCD_HC_SubmitRequest` 的函数并不能帮我们完全的发出去,也就是即使我调用了,他也不一定会成功,相信看过 rt 源码的知道,`drv_pipe_xfer` 中有个 delay函数。而我们的做法则是挂到定时器中,链表式发送。 - 最后是关于 `HCTSIZ_XFRSIZ` 这个寄存器 bits,需要格外注意, in 和 out 的含义是不一样的,并且数据发送接收完成以后,进入中断,再读取这个值,也是不一样的含义(藏个谜底,后续代码揭晓) ## 代码已更新 支持 dma 模式下调用一次收发函数,长度可达 16K 字节。并且 DMA 模式下自动分包。 https://github.com/sakumisu/CherryUSB/blob/master/port/dwc2/usb_hc_dwc2.c
13
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
sakumisu
https://github.com/sakumisu
文章
3
回答
46
被采纳
10
关注TA
发私信
相关文章
1
裸机工程移植 RT-Thread
2
Keil MDK 移植 RT-Thread Nano
3
移植 Nano,rt_thread_mdelay()延迟时间不对
4
裸机工程移植 RT-Thread内核
5
关于利用0x68000000作为扩展sram?
6
STM32F413 SD 卡写入速度提升方法
7
STM32 RTC 闹钟
8
http_ota 提示no memory
9
studio中怎么把PB3 和PA15引脚设置为普通IO口使用?
10
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部