|
|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:" A8 ]0 r1 O G& [
hub 2-0:1.0: over-current condition on port 19 |3 w; e- `; p+ F
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
. _; Z( e0 [4 x" d/ D! r; F我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会' x! u3 I" M& M* @) j9 q! M
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,- m7 A! k! h4 _- W
发现,在da8xx_musb_interrupt函数中,有如下代码:4 w1 ]. X4 w9 @1 [: k- F- d0 |
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
' m: x) Z/ ~& J/ P int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
5 j, V! v1 L" c* e$ Q( n; t, ] void __iomem *mregs = musb->mregs;
( @# X+ C( R0 _; _$ S# \ u8 devctl = musb_readb(mregs, MUSB_DEVCTL);! Y: n) I* C' _' O/ P0 m7 ~
int err;! p" `3 T' j; H4 R0 @3 W
- |2 [/ Q! I+ C( R. w! K err = is_host_enabled(musb) && (musb->int_usb &) y. y6 \2 y# J7 R( O0 _
MUSB_INTR_VBUSERROR);( B5 r, t7 X! d- {
if (err) {$ O }, G8 V8 ^3 O: O, ^! U$ J9 R- g6 G
/*
6 J% W# C! W! k2 F5 [# @2 h * The Mentor core doesn't debounce VBUS as needed
2 k' V# p. E7 q7 n+ k * 。。。5 t3 u0 K9 H. |/ K+ O3 w2 @
*/5 K$ Z: o" W; ]( F6 m
musb->int_usb &= ~MUSB_INTR_VBUSERROR;/ @3 |1 C: r: ?7 L2 L+ H
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;( a. V* Z, U* t3 g
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);! x2 U: q- X4 ^+ }2 x& r5 Q1 M
WARNING("VBUS error workaround (delay coming)\n");
# V( d9 j. B( b( n6 X }
* A0 d$ l% t2 O( I0 I- I- D6 u* L1 D! {( d4 O5 P5 J8 j
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
& U S/ ~) `- ]/ r) W1 l0 Z1 M跳入如下分支:0 F' ^: r8 C% I! H" A3 d
devctl = musb_readb(mregs, MUSB_DEVCTL);
: B0 N1 ~' v" h( Q$ t4 z6 D。。。
9 e }+ o# _- _! j. dcase OTG_STATE_A_WAIT_VFALL:9 O! g; S: D5 w
/*% h; M9 h: t) |
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
0 S% E) D/ V" c o * RTL seems to mis-handle session "start" otherwise (or in
2 Q$ a8 I/ f7 x* l& q * our case "recover"), in routine "VBUS was valid by the time# B6 r6 f$ e& x( F3 B3 ?7 l
* VBUSERR got reported during enumeration" cases.
4 D7 D" `1 {& `; m0 u5 m */, M: \: g# z. ~8 }* I1 A
if (devctl & MUSB_DEVCTL_VBUS) {
/ h/ _5 s; \1 C mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);4 f) B/ x* T' G2 z
break;
: Y6 |( s2 v! ` {1 c }
6 I1 i0 o& @! Q musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;0 `) E4 C* h/ ]' ?5 g! b0 w, \
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,1 M+ w: k) l1 F+ v$ m
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
) z$ E* f" q# k( W" c8 n2 e break;
$ G2 o3 X* ?& G$ \- u
" Z: L9 u9 j; p$ p) i, P+ |" L: u其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
" s$ R, A2 p/ x; I: v, t J/ P9 m# w不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
2 W1 [# X# B4 b9 w- j 不知道亲们有没有遇到类似的情况,是怎么解决的?
& k$ y9 L, ? A* |' O' x+ |% d) k |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|