|
|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:& Q) X& K( F, A1 ]/ a; d* f( V v
hub 2-0:1.0: over-current condition on port 1
' |" S0 d% g3 c$ A# lda8xx_musb_interrupt 538: VBUS error workaround (delay coming)
# V( k+ V% e" {我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会% O: Z/ C, Y5 R8 A
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
) X+ h* E% q" f# u( o( e* r& Z发现,在da8xx_musb_interrupt函数中,有如下代码:
2 w* u% S, k! t$ [$ u4 I6 Rif (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {2 s! M: Y6 i* M# b: o
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
5 J0 x) \9 u" e$ \" G4 o" h void __iomem *mregs = musb->mregs;* E& L# f* f( C
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
+ z$ u: Q0 w; D int err;
1 s2 l) }5 ?, q; o" V+ C
. N& }0 _! Q3 V2 v7 w err = is_host_enabled(musb) && (musb->int_usb &- i/ A: r, [! M
MUSB_INTR_VBUSERROR);3 ]3 U3 I7 W5 {& i* |3 ]5 P
if (err) {
: N/ x. l9 R( D; ^! H8 g /*
! Y' W5 A( a' k9 j3 t, _# D! y7 ^; g * The Mentor core doesn't debounce VBUS as needed
8 S: Y# j; i* Z1 O2 h+ Z * 。。。
( t* q+ a, {/ f( l6 ? */
5 g+ u. ^% C9 T/ @. _ B( w musb->int_usb &= ~MUSB_INTR_VBUSERROR;
4 m- B8 L: f z2 k; F' f musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;% j9 @+ S% n/ j5 ?4 e/ S* z8 D6 [
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
7 }7 z1 i! ~: S0 w$ C WARNING("VBUS error workaround (delay coming)\n");
6 C( ?( W% D$ S6 K( T }
$ c4 {. u7 `4 q5 }$ k0 x( P0 R0 Z/ @+ {9 ?
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
( m& Z3 F9 [/ I! Q跳入如下分支:: m5 g! t: _5 U5 i2 }8 K9 p
devctl = musb_readb(mregs, MUSB_DEVCTL);
% V, Q6 P" _/ z3 `7 m1 m9 c。。。8 s/ A- @$ \; a/ o7 W
case OTG_STATE_A_WAIT_VFALL:- K2 ~/ N+ j3 `
/** S& K3 P& W f& s, ?9 `
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3) [8 U- S. h2 E1 ]
* RTL seems to mis-handle session "start" otherwise (or in9 F' v6 l4 W" k
* our case "recover"), in routine "VBUS was valid by the time4 ~8 V* n' o$ Y Z% D- ^1 ^
* VBUSERR got reported during enumeration" cases., U+ u- T2 [* u. C
*/
& r1 x& U" O1 M# ?# |1 r' e if (devctl & MUSB_DEVCTL_VBUS) {
s1 K2 w5 A* l. c: q! q! g6 ^1 | mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
$ [- ]* ~7 F( u' L' t! Q1 N6 E break;
4 W: d0 Z8 L9 ?3 a/ {) N& W }- ~3 e7 O4 w% Q1 p* l
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;9 ]0 B" a. F+ s4 R
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,$ s: U% A7 s- m# o: N. G/ s
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);9 c0 h% o# Y6 m5 @
break;' @" _9 B! P: N
- W# y. e# {( ?3 I, k8 C! E其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
) n) M" w+ v" a9 C3 f9 n& K不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
# o/ {% @: { K: ^8 m 不知道亲们有没有遇到类似的情况,是怎么解决的?+ @& k8 p) Z' k/ K
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|