|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
" Z P+ \' d- |# l* ~; W) Bhub 2-0:1.0: over-current condition on port 1& Y" u# {% }0 f3 W: q
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
+ g5 D C+ l' X我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
5 ]5 d) W8 i; m o随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
' }7 c! U8 N0 I( w3 l4 z/ C发现,在da8xx_musb_interrupt函数中,有如下代码:* z/ @$ r7 i9 O6 ^. H2 B8 X9 U
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {& A' j; U9 S) F8 Q
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);6 W# Q. M" a# x7 M" \1 w6 x H
void __iomem *mregs = musb->mregs;. f8 U: _. S( C) y! O
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);" v$ {7 h3 c2 j2 c/ B" e5 q' Q
int err;4 t+ h: U8 H1 c/ a
# d2 B- X! b! ~- B
err = is_host_enabled(musb) && (musb->int_usb &% R# b+ q3 l3 ^3 T3 l4 \- d, N) C: p2 m" f
MUSB_INTR_VBUSERROR);) {+ h! u: l: Q1 f* d' h
if (err) {4 a3 d+ A) {+ r
/*
, Z+ U, s+ J- m8 }7 B * The Mentor core doesn't debounce VBUS as needed6 a$ R' u# J' L! d1 _7 H# L6 R
* 。。。
! c M7 Q( b& a */) t/ ?# P# m" r- u: J9 L- h
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
$ ^1 z1 k$ f/ s u# X musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;: n% A3 X k& @" m
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
& V3 u- N: k- N1 E3 o: d* \) c WARNING("VBUS error workaround (delay coming)\n");
" ~' w7 I: o0 W }* x& Q9 O: B5 B+ O) h# j. ]# ]6 z
# j7 Q' l) q" V" `9 q' n
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,. G- _/ j6 C, p
跳入如下分支:: |8 t, p+ w! ~# ]" I5 Y/ T! F
devctl = musb_readb(mregs, MUSB_DEVCTL);
z8 g3 u% L$ k( K9 k7 w3 `。。。* K' O9 n' k# [. v
case OTG_STATE_A_WAIT_VFALL:% f7 M+ T0 P9 x5 I. B( b: d
/*
. W& F% y, ]( Z3 @2 D * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
/ ~7 G* u7 K, D4 n * RTL seems to mis-handle session "start" otherwise (or in# S1 S7 p6 E7 ?
* our case "recover"), in routine "VBUS was valid by the time* k' W# d; K. K7 r* s0 H5 i
* VBUSERR got reported during enumeration" cases.: I, x% v- P' R$ Q, ]( b
*/& y, }0 i U6 `2 O7 |- L
if (devctl & MUSB_DEVCTL_VBUS) {1 Q. q' P& a0 J/ f% g3 q" s
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);1 h0 L f5 n) Z9 o" h! T4 _. f
break;9 }5 I& D6 B3 v# |& i/ n
}
/ K/ h% b' `0 X) a* B4 Z! V musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
$ b q/ E& }, A5 a* Q/ x$ ? musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,6 Z0 o% E3 v. o2 ^. n7 ~
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);% V+ _, g' H/ d2 r7 l, { z5 o
break;
4 u; a, W) s; O& y% o8 n' m8 |: K
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,; G) k9 y0 Z3 C* ^; D( B9 y/ i
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。; {" d$ ], n. O# L9 Z0 l( E
不知道亲们有没有遇到类似的情况,是怎么解决的?
) E( B+ n8 G% m o0 o, Z; ?% i |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|