|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:/ A( ~& j- n5 h: e/ k
hub 2-0:1.0: over-current condition on port 1) h7 `0 h: L t; k
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
: L+ t, H- e0 C' J) S' |! e我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
8 ?5 J: A* f3 y/ _ s1 h随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
) r- o) Z: ^) o8 Z/ V8 Y, i$ n发现,在da8xx_musb_interrupt函数中,有如下代码:$ O/ Q% d a' ]
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {9 Z: }+ q e, t# u
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);$ Y! ~ r& N+ B: \ T% r
void __iomem *mregs = musb->mregs;. \- h3 G* y& n. t
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
& s) E: J& }3 y% |; C9 Y- R5 X int err;8 p* f4 T) \8 }& ^4 g1 w
3 x5 q# @7 x0 `; F' @3 ~
err = is_host_enabled(musb) && (musb->int_usb &
* }! F$ X1 L& y( r( j MUSB_INTR_VBUSERROR);" W' Q0 C( b, `$ u
if (err) {
) T! U: F' |) e /*
( J) i' d- P O1 Q! g * The Mentor core doesn't debounce VBUS as needed" k2 p5 E/ s2 ?) h- \$ {# y( b b
* 。。。0 g3 ~# `8 h2 o1 d: X- f+ P
*/
! c1 }' z3 y. X( R7 q& p/ v$ ? musb->int_usb &= ~MUSB_INTR_VBUSERROR;' G! z9 O- R/ d W5 V
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
- z+ |/ h$ O) U4 \- @/ s. c mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);9 C/ B: L2 P1 k! ^0 \- B2 S# L
WARNING("VBUS error workaround (delay coming)\n");
8 m' b/ U; s, X+ L3 y: Q }( ]- J+ a1 s7 x, F$ C
( K5 {8 ?, i6 C* i4 s
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数, d3 A3 B5 p) `) q
跳入如下分支:" c7 g) m( ^. \8 T
devctl = musb_readb(mregs, MUSB_DEVCTL);
( G: [5 ~' i2 I! g6 x2 ~$ `。。。
$ `3 m" [9 o' R, }/ N' O: M6 scase OTG_STATE_A_WAIT_VFALL:7 Q2 t4 X0 t9 p0 l2 G4 ^
/*
# p4 u! R4 _. X2 K0 J/ L * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.35 h! P; a7 P9 |- z
* RTL seems to mis-handle session "start" otherwise (or in* y+ t- R+ p8 A2 R" Y
* our case "recover"), in routine "VBUS was valid by the time
; L) C" T: t7 _9 a* q, O. O * VBUSERR got reported during enumeration" cases.
) d, ~( n% _/ i0 p. }) D7 ]; P */
& C, ]' h) k) B5 G* T if (devctl & MUSB_DEVCTL_VBUS) {" C" `7 \" [; n" h: Q" F1 f/ V
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);1 ~, P( y4 X& [$ t2 R: \* a
break;, T3 `8 A# ~1 J6 r! B
}% I. u# k4 @* D1 b3 t# E4 o
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;1 e) ^. o" _, f( z" N2 ^
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
( T' T- f1 x! b1 w2 l8 E+ l% T MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
/ _9 R% g u% ^/ [$ I8 E \ break;
, j0 E% P7 L! R3 f" g7 l* h
* s7 `7 e Y: o/ x其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,- `# V. Y( \1 {* `/ F, q" n
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
* q# h2 {5 g# Y8 O9 |; X* }9 m. B 不知道亲们有没有遇到类似的情况,是怎么解决的?7 u4 b9 y+ Q! C9 Y. }9 s
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|