|
|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
4 B% U9 u% ^. a. \5 r" |" W/ ?hub 2-0:1.0: over-current condition on port 1
* B, T$ Q7 F; N5 ?$ `5 t5 }da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
) z) d2 B& J: m/ M我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
1 a2 v7 m" d( x随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,3 I2 q7 ?# Z8 q
发现,在da8xx_musb_interrupt函数中,有如下代码:
2 |) z$ }( W& H6 f" {if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {9 B5 s2 D9 ?$ J
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);+ C' P" q* |& K& f1 Y" n* x
void __iomem *mregs = musb->mregs;
' ]( U% \' ]0 ~9 j: L/ ~ u8 devctl = musb_readb(mregs, MUSB_DEVCTL); ?; v4 a% P0 i, J# p" @+ Z% u
int err;6 m d8 f; K* T
) n- |2 s) S/ F6 z err = is_host_enabled(musb) && (musb->int_usb &( F( A2 [# w7 U) i8 X0 ]
MUSB_INTR_VBUSERROR);
, O- h! g' B! x, l6 L if (err) {; l9 A; `; D) _) n3 H: x, ]
/*" `2 o+ Z0 {# b. j
* The Mentor core doesn't debounce VBUS as needed) s2 ?5 a* n5 d) q1 ~3 E
* 。。。# ~; E: \( [, H3 x8 N
*/& `5 A% ?; x! f P+ M
musb->int_usb &= ~MUSB_INTR_VBUSERROR;9 u3 p6 n2 @; q0 z8 x
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;" R) P0 I0 I7 A8 u! \# j Y
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);0 G# g8 q/ M. B0 Q
WARNING("VBUS error workaround (delay coming)\n");/ ^8 B9 a/ g0 y \. d0 ?2 ]( `- |
}+ S+ E- M! T! w+ i; y
( P! P" ?- ~3 U9 m& G1 c" r一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数, o t% @; s2 _" x: l' r
跳入如下分支:
# U8 y N1 o9 e Ddevctl = musb_readb(mregs, MUSB_DEVCTL); i3 l5 z& c) ~4 V3 l
。。。0 \+ c. _+ H' `: @7 _) H. w- I
case OTG_STATE_A_WAIT_VFALL:/ J% Q6 G% [& m6 f: U2 M: P _
/*2 Q7 X: q6 S7 D. N" S; ?$ J0 M
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3 K6 h0 M* ?* d B2 _7 {
* RTL seems to mis-handle session "start" otherwise (or in
2 B- G) v5 O' t * our case "recover"), in routine "VBUS was valid by the time$ ?* Y( R" Q# x( m( l0 \' ~' k
* VBUSERR got reported during enumeration" cases.
# [7 a' L c4 q1 X# P Z4 S8 f, v; S) ~ */2 p1 s( S+ k& c" j% s( a/ a
if (devctl & MUSB_DEVCTL_VBUS) {6 R: P% R7 U% I7 M5 Q
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
4 L; O" Z6 w: z8 R4 T h break;% M, B- l/ @$ o$ {& L) H
}; B7 s$ x2 t) t( g/ k7 C |: \5 q
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
4 u6 |7 n. V0 n2 X musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
# ^0 |; U k0 K# g/ Y1 Z MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
1 f: p2 {( [& v0 I" \9 @# G. c break;
9 O3 n) r" ^2 x1 t) U1 W! \( S6 w. A v' e
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类, v! c& p1 i: A3 i* H1 ?
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。; v, j8 x" u' f7 _3 B# j1 M
不知道亲们有没有遇到类似的情况,是怎么解决的?
% B ^% q8 W, L2 d: f8 a |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|