基于CherryUSB调试dwc2 usb host笔记

作者:sakumisu
背景
之前适配 dwc2 usb ip 的时候,主要是基于 st 的 hal 库来走的,现在终于有空对此进行一下重构。
https://club.rt-thread.org/ask/article/dac2a83e018f6ad2.html
https://club.rt-thread.org/ask/article/b39785f4dd8a6032.html
排坑
ok,现在我们开始一步步排坑
全局中断 sof
首先是全局中断 sof ,这是一个比较坑的,尤其是带了 os 以后,几个意思,跟我 os 抢中断呢?sof 中断 1ms会触发一次,很费中断。为什么会有这个中断开启?后面再来说,结论就是 dwc2 这个ip太辣鸡,硬件做的很随意,功能没有做到硬件上去,而这个 sof 主要就是给中断传输和同步传输用的。
hcfg 中的 bit 0-1
这也是坑,我们直接看结论,人家手册里说了,每次设置时,需要复位,st 代码中楞是一个字没看见。小坑
hcintmsk 中的 usb_otg_hcintmsk_nakm
这里面中断标志那是相当多,最坑的是什么,usb_otg_hcintmsk_nakm,我可以说,论坛出现的所有 nak 的原因都是他造成的,什么枚举 nak,u盘 nak,都是他。究其原因,nak 表示当前没有准备好,需要重试,但是其实并不需要,st 的代码中,进入 nak 中断以后会关闭当前通道传输,然而,对于控制和批量传输这是没有必要的,传输是可以等到完成的。开了这个,就会造成,各种地方需要手动重发,然后读 hal_hcd_hc_geturbstate,没有必要,关掉该中断给你带来无限可能。
hal_hcd_hc_submitrequest
大坑来了,此函数就是配置发送需要的 size、packet、buf地址等等。坑1:有 dma 没见你用。坑2:hc->xfer_len 并不能为所欲为的传任何值。坑3:开了 fifo 不为空中断,却没有该中断处理。
修改
能用 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

位移传感器的应用领域都有哪些
控制系统典型应用车型 —— 停车机器人
地表更强Trailhawk实力自成一级 底气十足还送自动驾驶包
一文介绍5G NR定位
高精度高效率的LED恒流控制ICSM7522P相比较亚成微质量更好
基于CherryUSB调试dwc2 usb host笔记
什么是MPU?MPU在哪些方面保护内存安全?
java中怎么使用HTTP代理
苹果新版本推广 iPhone可选择关闭降频
外媒发Apple Car概念图引发热议
MC56F80xxx DSC:高性能、低成本的数字电源和电机控制开发,就选它!
2017年整体TLC-SSD出货比重将超过75%
pcb仿真软件
取消随机赠送的充电器将是手机行业新的潮流?
在 QSPI flash 上运行毫米波芯片的测试代码
CES 2021有哪些技术可缓解新冠疫情?
华为麒麟960为安卓最佳芯片? 网友说的一针见血
水质在线监测系统的简单介绍
大事件:华为要卖车了 中国建成全球规模最大的5G移动网络
双工器频率可以偏频吗