|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:! o; A: K( I8 V+ s3 e! U: H8 ^; f0 Y
hub 2-0:1.0: over-current condition on port 1/ [! ?; Y6 [0 L+ d/ b3 `6 }" x
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)! {! N9 l: j8 n: Y% I
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会, ?) G. x8 [* S# i6 B' v5 C
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
% M# [% n3 I. \9 S1 U$ F发现,在da8xx_musb_interrupt函数中,有如下代码:
# G/ L# V, S" i2 B* Wif (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
. u7 R. z: k8 U6 Y5 y* H int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);' G7 Y+ T: m% F
void __iomem *mregs = musb->mregs;8 j! [& H0 d/ n4 a/ W
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
/ ?+ Y( J* E0 A/ i int err;
1 P8 M4 V' L* P9 p) _1 b
# ~# @( {9 o5 } err = is_host_enabled(musb) && (musb->int_usb &% O* l% q" |8 f, r
MUSB_INTR_VBUSERROR);
( N; M) w3 a# Z; U" D5 _5 T if (err) {
1 ]' _# S( V& [- j8 s( _# ^ /*
; {: Q3 E" H* J1 L& G; Y$ q9 R * The Mentor core doesn't debounce VBUS as needed
* O5 P. U7 v9 o * 。。。
# L5 W6 V8 M0 B8 ?* C" D: F4 \ */- |, u, Q8 `4 h
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
2 a! h5 B8 X4 x; e5 ] musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
# b& G3 P, J6 O+ ]7 q' p mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);3 Y7 c: s S7 A
WARNING("VBUS error workaround (delay coming)\n");) V8 A" R9 s$ l' `% D* k1 T5 k
}2 r0 z7 u2 A8 a9 m/ w$ ]
8 s4 e* I9 |' m3 w6 T+ f7 _! N' w& O
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
; T# y* `& b% r# X [) u) g$ H跳入如下分支:
+ R1 z9 }0 w; `' {: E, Edevctl = musb_readb(mregs, MUSB_DEVCTL);5 ?# k0 k5 S: G" Z- T3 g( s1 l2 }
。。。
; |8 ~, b7 e+ [) ^+ {$ ]case OTG_STATE_A_WAIT_VFALL:
- ~( o$ Z9 n0 H M) k( z! Z9 a /*9 ~1 b3 }& m" s0 D/ O
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
$ z" v8 b2 b% F: f I * RTL seems to mis-handle session "start" otherwise (or in. {3 f+ G+ k) a S, z- S
* our case "recover"), in routine "VBUS was valid by the time2 x3 }" S4 q/ o) |
* VBUSERR got reported during enumeration" cases.+ z- W3 a3 i. ?- H
*/4 h, K0 L* \/ f6 E( d& X) f
if (devctl & MUSB_DEVCTL_VBUS) {
8 I/ _- n! ]5 o+ T/ b/ \ mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);* T+ ]+ m2 q: V- ?$ z! X0 |
break;
! `9 g+ m; J/ g$ c6 V; n; o }; d. ~3 q2 y/ G' Z
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;$ ~. \$ t8 B; F
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,' E& T1 e/ @) |
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
3 s( \ B* C8 [2 }/ t3 f& Z: p break;3 d" y. i9 g7 B& I+ O" Z8 [: X
) ~0 M# _* l! T& {( K1 {其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
4 i6 R3 v1 L; x( {; \+ o不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。) j% j* w* S1 q# F @
不知道亲们有没有遇到类似的情况,是怎么解决的?& h& x2 K- @% j6 m C
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|