|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
. E L0 M$ O, Z* O& zhub 2-0:1.0: over-current condition on port 1
$ {: [) I) Y1 \da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
! Z3 U5 Y) J$ c: O0 S: n. i我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会- e0 I5 s# H U# B( U( N: i( e: ~
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,# r2 c7 B" q2 _( s0 z; r
发现,在da8xx_musb_interrupt函数中,有如下代码:
: ]$ d7 M- D: sif (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {7 f: z+ }; W; ^# H/ v$ J
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
3 c* J! f: A3 N" A) ~, G. d void __iomem *mregs = musb->mregs;
W4 d/ _# m3 U5 W0 ~( Z u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
$ P2 X$ Z- X# a3 \& e int err;
8 A; {8 b* w9 h [- J
$ h Z. B/ C" U2 l" o: j err = is_host_enabled(musb) && (musb->int_usb &
# F% k5 S2 K, Z+ l/ N+ ? MUSB_INTR_VBUSERROR);' m& _, L; j, l8 [! D+ a! |
if (err) {' X# N4 X2 g5 n# w0 d! N7 m
/*
: _/ }. u8 ]8 ?" f' X8 i * The Mentor core doesn't debounce VBUS as needed
2 m; u. g2 D$ V# G * 。。。
- P- f7 q" t( {" j8 O */
: _( @2 D9 j: z ^4 I musb->int_usb &= ~MUSB_INTR_VBUSERROR;
* k) b) t0 y2 z5 J4 r5 j musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
# i; Q5 U0 O6 Y- X mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ); U, z) P v# C
WARNING("VBUS error workaround (delay coming)\n");
" v/ H1 Q' \. f% @4 S9 G: E, | }
( V/ e" _% ?; f- C9 ]/ q: l& V, f2 I+ Z& ^* ?" u* z" H4 I
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
3 h% Q" h. H3 ]7 D+ t跳入如下分支:
& A; Q. l. R! d+ B% gdevctl = musb_readb(mregs, MUSB_DEVCTL);
) h1 @6 p" ~ {# _! f! h# M。。。" m7 @6 O4 I& x. L! ?6 d" K, S4 d
case OTG_STATE_A_WAIT_VFALL:7 j* i3 I! V+ T! U& M" H x
/*) Y, J; t# l* k4 i: t+ S. W. \8 k
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.36 s9 _( ?. q7 n
* RTL seems to mis-handle session "start" otherwise (or in
& M1 k! K5 [3 J9 {/ E: a * our case "recover"), in routine "VBUS was valid by the time
8 E) x% ?1 e" }/ Y5 }( R+ E! p * VBUSERR got reported during enumeration" cases.' I7 Y4 ~8 l$ N8 F7 t, ]
*/4 s+ h/ \ ?/ Z+ W4 ~4 j
if (devctl & MUSB_DEVCTL_VBUS) {
5 F0 W. k- D% e5 t2 b8 C# V mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
2 H" l& F6 R4 a. o break;
2 ?* V( d6 \* f) | N, v2 V$ Y }
! ?; r. M7 V, e( ` musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
5 }% L, D- Y- U6 d- n+ b& P musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
2 r( N5 w7 c* {$ A4 w$ C MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);( w- Q7 g8 U7 m+ F2 N9 a! \
break;
|! T* \; m$ w$ u2 `7 ]: K. O. _2 F0 @$ |+ t/ p, `8 [
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类, l o0 w( L+ j+ k: F5 f( Z) _" T
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
9 F3 S) s! Z6 l3 W5 q1 L 不知道亲们有没有遇到类似的情况,是怎么解决的?
, l4 R) t2 j4 m3 Y& q |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|