|
|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
4 b4 G" R8 G0 ^7 U6 A( thub 2-0:1.0: over-current condition on port 1$ {/ a- |3 t& M9 \9 k
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
" v- G' K0 _- e+ `. b% t我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会- y& }3 L5 Z* I# G% }" Y C, R6 h
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码," P8 b6 b7 Q( C7 r, h% y
发现,在da8xx_musb_interrupt函数中,有如下代码:3 E5 c; K1 ]' H# O2 B3 e8 o
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
5 I( I4 u$ W+ I/ x P( k int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
) Q! m+ J. z3 k- N# X+ l7 M' X void __iomem *mregs = musb->mregs;
; e# H' }+ U; A3 G2 v* i u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
' \! b) g4 u: R; p& s( B9 s. x" F7 J int err;0 D, J/ o1 b: B9 P0 |2 ?, e( K. n
! X# w/ F( _5 f. [3 d
err = is_host_enabled(musb) && (musb->int_usb &- V0 N0 t- o6 w, p. Y8 f3 G
MUSB_INTR_VBUSERROR);$ L! r4 o- w$ o- P( i% U
if (err) {$ W) ^9 r2 V7 g* u2 Y
/*
, p; h& z) D( ~/ @ * The Mentor core doesn't debounce VBUS as needed
0 M( N, ]3 n" R0 u: _, O/ H * 。。。
5 L; g6 y7 b! A! P0 i: w- |1 ?& | */
( H2 y9 S% n5 W: D$ x' s" ?/ d musb->int_usb &= ~MUSB_INTR_VBUSERROR;3 i6 c. y! }( G& k: i
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;& |& q6 V& B/ N5 W7 ~
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);0 A% `( f1 ` ^2 J
WARNING("VBUS error workaround (delay coming)\n");2 ?- S7 a/ `& ^# d
}
" c- I3 v( @ O! w) A" q* Y
8 O- B6 ~+ J: V一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,3 S* c7 Z1 {$ v1 _) t/ t
跳入如下分支:( q: |! D' A1 @
devctl = musb_readb(mregs, MUSB_DEVCTL);4 G7 L; R$ p V8 y' F2 q& o5 ]
。。。( f6 h, m/ }" d# f* Z4 i3 W/ M6 ^# w
case OTG_STATE_A_WAIT_VFALL:
$ ~4 e( s" k9 d, u: N* E6 k, ^9 K /*6 {* T+ C+ w) j" k/ n+ ^% ]
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
) u) g( E7 J$ ]# R/ P: a * RTL seems to mis-handle session "start" otherwise (or in
2 s# s- B; L% K3 F4 W r3 y * our case "recover"), in routine "VBUS was valid by the time
1 W' f4 [9 D3 e) @* o3 J# { * VBUSERR got reported during enumeration" cases.
" Q# G, v4 f+ s0 |: |; ^ */
" i. U2 O% z6 r- c% Y7 W n* c6 e if (devctl & MUSB_DEVCTL_VBUS) {9 u1 K* W1 U" b8 \/ ~ G% h
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);! \- ^, j- ]* C7 k0 {
break;( f6 `- |; H) ] x. V
}) |6 H+ e4 \& D& L- T# @7 I0 ^5 x
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
3 O: [: m& M8 V. A- N4 g% @3 { musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
0 ^! ?# {4 d' P MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);* K! D2 {* r# E% `, w$ `1 z
break;
) S9 ?: ?! b5 u1 \9 ]: h$ R+ i# k" @1 w5 T4 J& I
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
* F. a* k5 r8 ]4 q, y! k不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
/ e' ^: w& W9 E p 不知道亲们有没有遇到类似的情况,是怎么解决的? `" N6 y6 p+ N1 O" V4 P) f
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|