1、问题:
展锐平台,usb otg高概率不能正确检测识别到
2、思路:
usb使用musb控制器,展锐的平台处理代码是musb_sprd.c,在这个文件中对usb mode做检测和切换,log级别跳到最高,在probe中的关键函数前后添加log,确定出现问题的上下文,最终确定是在vbus和id检测的回调函数上下文有问题,musb_sprd_vbus_notifier回调函数 和 musb_sprd_id_notifier检测回调函数之间的顺序概率性的错误。
 正常的顺序是,先做vbus的检测,检测到cable vbus之后,再做id的检测,确定extcon设备mode。
 现在出现错误时,分析是: vbus检测work未完成,id检测work就开始了
3、解决:
在musb_sprd_vbus_notifier函数和musb_sprd_id_notifier函数中,展锐的代码是使用spin_lock锁来对函数中变量和queue_work做互斥保护,但是还是会发生长时间的等待状态的情况,所以有概率性的出现问题
 修改: 使用原子量来对两个函数中的资源和queue_work做临界保护,
定义原子锁,做初始化:
  替换两个函数中的spin lok 锁:
替换两个函数中的spin lok 锁:


 在sprd_musb_work函数中也使用原子量,保证usb的时序不会出现错误,不然可能有问题:otg将usb resume之后,usb又进入了idle,suspend状态,导致otg和hdc都不能正确识别了

 最后需要在sprd_musb_work函数和probe中,对原子量做还原和初始重置:

这样修改的前提是,type-c能正确检测到usb信号,只是usb的状态切换有问题的情况下,可以到平台的文件中调试
 当遇到插入usb完全没有反应的情况,就需要排查usb的type-c部分和phy信号的情况


![[附源码]Python计算机毕业设计Django的黄河文化科普网站](https://img-blog.csdnimg.cn/ca2c70c9b15a43ea9a369c28ca710777.png)





![[附源码]Nodejs计算机毕业设计基于java网上心理咨询系统数据分析Express(程序+LW)](https://img-blog.csdnimg.cn/ae65938a415f4edcb8417b643b6e3642.png)






![[附源码]Python计算机毕业设计大学生网络安全题库系统Django(程序+LW)](https://img-blog.csdnimg.cn/50b35b51010e4ef9a24017518d6d5a18.png)



