|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:" q2 R, \& h* Z
hub 2-0:1.0: over-current condition on port 1
/ j% z: u9 M1 B& f( i* d' Uda8xx_musb_interrupt 538: VBUS error workaround (delay coming)
- p: s* g" \4 k: x( E我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会) W1 T+ d# c8 X, S" a4 b7 b8 {
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
6 P! p' D: k6 |' ?8 U发现,在da8xx_musb_interrupt函数中,有如下代码:
% D5 N$ ^6 {) a% kif (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
6 |7 V }9 }3 z! P+ F0 _% j int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
! z- a0 K2 F" i9 t4 n' h/ c" V( Z void __iomem *mregs = musb->mregs;
6 N3 z& ~! I- f' w( J2 t7 \ u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
% R Z% f6 q9 ^$ h, ]2 X3 Q int err;5 R! J0 G6 Y) L# n& K: r
+ w4 j2 e# c% ^: x err = is_host_enabled(musb) && (musb->int_usb &' G7 B4 x% o- C# t" j Y3 w( b; D
MUSB_INTR_VBUSERROR);
! k8 V1 j0 X" b, r4 P2 a if (err) {
/ L# D2 F% @! B: f4 ` /*
- O9 Z! [1 G( r9 Z4 A$ @% z * The Mentor core doesn't debounce VBUS as needed
- M% G6 a% p; r' N& ^. {) V. a) e4 I6 f * 。。。
+ R l9 \, V% X( b */0 a/ S3 a) w" V, K6 F
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
" l( b, O ~2 n/ E musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;7 `6 Y, `' Q/ ]5 K# a5 Z, x
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);7 }1 [! A. m! P9 r2 V# @
WARNING("VBUS error workaround (delay coming)\n");
& L* x2 n, I% g @ }
, b/ B+ s3 x0 O' @" x
8 n; Q# `: B+ m, c1 A6 I一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,7 d' {6 ]; S8 ^" o% y8 R/ q% X) @/ v
跳入如下分支:: U; d J5 r0 c' ?; v
devctl = musb_readb(mregs, MUSB_DEVCTL);
) l: ?( s. S) b! Q。。。/ G) Z% r3 ^3 i9 V8 P) `
case OTG_STATE_A_WAIT_VFALL:+ L7 w4 F( ^2 j, c2 p
/*7 k$ _4 E' B6 b% `9 Y. L: k
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.36 q: n9 b2 H0 W6 `: E
* RTL seems to mis-handle session "start" otherwise (or in
7 g$ o' [. ]1 Z4 n$ u1 s * our case "recover"), in routine "VBUS was valid by the time
) P" Q) M$ L1 s! ~ * VBUSERR got reported during enumeration" cases.
" v, w' z8 |( u( u( ?: H */
+ g3 |( X7 g, p if (devctl & MUSB_DEVCTL_VBUS) {: H* |8 Q( j/ d0 v( `
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);3 ~( O/ A& X) E3 \2 ^1 f/ Y
break;/ n4 e, K; v* Y
}& s6 R& ?$ k8 X2 q2 {8 P
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
" Q: m- A* X- ?; a2 p musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,$ K0 F; _" a+ x3 m( y
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
( |" O) ^3 ]4 A break;* q, C& f, ]6 t8 r, ?& t
' W8 N& u3 C7 o0 c5 V9 [6 K
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
* V, n1 A; t% G8 I3 E$ C不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
) U7 x& b. Z6 J p9 J7 f# T 不知道亲们有没有遇到类似的情况,是怎么解决的?7 q" _3 |9 l3 l+ K; O/ D m6 r
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|