原子量的妙用--保护usb时序

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 锁:

在这里插入图片描述

在这里插入图片描述
在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信号的情况

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值