|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
0 z) s, D5 Z s1 X3 }2 }hub 2-0:1.0: over-current condition on port 1
, E* b% X) R& o+ V6 R& }da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
+ | [/ ]7 L7 ?8 w我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会( Z" ^& Z7 t8 J7 r
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
% q: y( q0 q; Z/ f4 N发现,在da8xx_musb_interrupt函数中,有如下代码:* r; S5 V+ g3 v' t) \0 |
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {4 u" ^$ V1 p) s1 Q/ T) ?. c! m- _
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);$ J8 T. B; B& |# F0 P
void __iomem *mregs = musb->mregs;
8 ]- v6 x0 y# ^% Y- v" ~9 t$ z u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
% i- B' i1 ~3 |6 y int err;
2 n& {* u; ?& _
6 C- f; c" ]! b) J err = is_host_enabled(musb) && (musb->int_usb &
! _6 ]/ U) C9 b MUSB_INTR_VBUSERROR);3 _7 ]1 Q1 `3 M& e; Q) h
if (err) {
/ M% r- ], @8 K- Q: y+ b8 s9 n /*
3 r1 [ T# `! n% N1 x * The Mentor core doesn't debounce VBUS as needed
! _; v5 |3 y( e; l. O * 。。。
! D ~6 T/ ]4 T) N9 |# ]6 B; A */4 m9 x: z5 a, U X }8 H! m
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
# ?0 w) Q8 ]7 _) I musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
9 }8 V/ g2 _1 x5 y0 b6 F mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
3 C2 Z6 Q, A( k3 ^6 s7 q2 ^ WARNING("VBUS error workaround (delay coming)\n");* H4 [" s# {! t! a+ k/ S1 l& E
}9 o8 q& w o' w( T. G
1 h9 I0 x* f. D& h# `
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
5 b' A& h* H+ N9 _. b* v1 v. c' W跳入如下分支:' P2 {' S3 E5 A0 E O& o
devctl = musb_readb(mregs, MUSB_DEVCTL);
4 G/ v( v$ i' X. i6 N3 T. B。。。
% k X0 G& s3 t5 x$ a! F* Ycase OTG_STATE_A_WAIT_VFALL:6 U! ]8 A7 G- ]; {2 Q5 m
/*$ _3 S& s2 I6 A" U6 M: E$ x, l4 R
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
1 [, V3 J% f* W R& ?5 W6 D * RTL seems to mis-handle session "start" otherwise (or in. S4 F2 m/ M/ u8 t( r
* our case "recover"), in routine "VBUS was valid by the time6 a7 H& G( S' w T
* VBUSERR got reported during enumeration" cases.1 g/ @0 R) \: k
*/
) Y% u4 x9 h/ [1 U! S+ ? if (devctl & MUSB_DEVCTL_VBUS) {
" w( t' O9 T. H1 v" i# s# c2 \/ O( f mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);5 p( y5 ]" \# i; q+ {9 P
break;
: ]+ H* x( e& L1 ^ }! L9 W" Z) g# b
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
8 y! y G; g4 K( c$ O musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
5 q8 L0 H+ k. y% o MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);- B8 z! p" l0 s+ `* C
break;8 q: K: z, X, l* s S. [
' b0 H. M6 W1 F
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
& K% ~7 l, n( j& T( _8 x+ K- n不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。! ]! e( b9 Y5 h5 x' p0 D( T+ v
不知道亲们有没有遇到类似的情况,是怎么解决的?
9 \, Z; m% r/ V+ z# c5 Y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|