|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
8 \6 e; D T1 X ]hub 2-0:1.0: over-current condition on port 1
/ ]- \- I2 b, d" ^- oda8xx_musb_interrupt 538: VBUS error workaround (delay coming)& ?# j/ p C, k6 q, L% Q- ]
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
/ I* j' W7 ?" D! z# w, v随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
) k' u/ h6 b, j% x4 G9 N发现,在da8xx_musb_interrupt函数中,有如下代码:
. K- O) b. w9 l# y; }if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {1 M: m( M' \- Y: X8 g9 \. G
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);5 d% o. s. l; R
void __iomem *mregs = musb->mregs;
5 C0 m/ m" }" } j- Q6 Z u8 devctl = musb_readb(mregs, MUSB_DEVCTL);( {" Y! [; v( R
int err;* S7 d; a" [: n* `; M
1 p( I( Z# a& a. T5 H
err = is_host_enabled(musb) && (musb->int_usb &
1 x: c/ [5 M5 u! _ MUSB_INTR_VBUSERROR);* H. D2 q( B Y! m
if (err) {
* Q% g0 ~& w+ B8 f /*
( v, `! x/ n5 m4 d9 _ * The Mentor core doesn't debounce VBUS as needed
' D) z! }( G/ c' k1 |1 e1 l4 i * 。。。
! |( Y5 e% q! C* N7 E */
# [6 x: y2 F4 A. p( I" S/ H musb->int_usb &= ~MUSB_INTR_VBUSERROR;
1 ?! r: S, X' Q& I& S$ \ musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
9 t; }- R( K- ?/ R mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);* U' l( O# }; {5 x
WARNING("VBUS error workaround (delay coming)\n");! N" s9 o2 e; g( k }; n
}
4 ?$ u7 T) J9 i8 K" S5 q# Q" b! o4 O- X( X9 Z0 r' ]3 l
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,) w6 @, {. U' ^- B i6 \$ X
跳入如下分支:
- k% `1 w: r' E( x Idevctl = musb_readb(mregs, MUSB_DEVCTL);
4 }' L" [, n7 i$ U。。。
: q8 k2 `4 r" v! Mcase OTG_STATE_A_WAIT_VFALL:
3 C, @/ n+ ^/ c5 a# e6 ^6 ~ /*
1 r) @2 J- u8 U" @& G. l * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3) k5 G% \$ J0 `
* RTL seems to mis-handle session "start" otherwise (or in9 W# U: g7 d! T0 [$ |3 }
* our case "recover"), in routine "VBUS was valid by the time( h* V0 M2 n n: K
* VBUSERR got reported during enumeration" cases." e8 ? a k$ f$ q! ~/ H+ B, p
*/
1 a" f% n0 B9 v) `1 y( _7 } if (devctl & MUSB_DEVCTL_VBUS) {
+ f( F' |. p; N mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
4 w! @ a% w. X( U break;
$ w, U4 ~# u: q. S$ G: D }* w/ @0 U+ o1 L" ~; Z
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;: ?5 x$ a$ c+ ]. {- z& R
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,! V: Y9 i" q$ ~2 x
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);% Y5 U7 T/ k1 X, j
break;+ @3 {8 l8 U3 q( c
" N8 Z3 s* H4 j! _0 G) _
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,) j8 z6 E3 F, B. L7 u
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。, f+ e6 w" V; l( H* z
不知道亲们有没有遇到类似的情况,是怎么解决的?: F0 Y# R4 @* h: h' y6 [" x4 }
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|