|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
! m* t9 I3 t2 E5 \* d6 L% c! ]hub 2-0:1.0: over-current condition on port 17 P- V [, \% @* q E! t- ~
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
# N& P6 U" E. J9 o' t1 C我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
% O" r9 S8 Y2 { I1 Y; k9 {3 K随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
% T7 S. T& r5 \7 u' J5 Z- l发现,在da8xx_musb_interrupt函数中,有如下代码:. L, T% |, S, E8 S
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
4 O8 i9 A+ D! L int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);& D' Z7 b' q i# |
void __iomem *mregs = musb->mregs;
; \* b; q4 o5 d: A7 l: N: y/ y u8 devctl = musb_readb(mregs, MUSB_DEVCTL);5 f+ q+ D S ^
int err;7 V. i5 M" ~+ H
$ Y4 A- C. K4 |
err = is_host_enabled(musb) && (musb->int_usb &
0 B! Q( U! G9 y+ G4 L; ?# W MUSB_INTR_VBUSERROR);! n# U2 Q! E, b$ h
if (err) {
2 @; `! m" S, l4 b2 z! I /*
$ _3 s6 L) O1 T9 A5 _4 T * The Mentor core doesn't debounce VBUS as needed1 G0 M$ E# }* T) N
* 。。。
) t F$ j9 I6 ~' ], x* _ */
8 |0 i; Y0 B9 q! |- P; ?9 i4 K musb->int_usb &= ~MUSB_INTR_VBUSERROR;4 }/ Z$ r$ r! u5 y" F
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;0 y2 L! q( v; _' t& |2 \6 p0 R
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
: o( `$ J0 Y0 s WARNING("VBUS error workaround (delay coming)\n");
" c% {2 z" q) R3 z }- q4 l) S L$ L' L; @
0 z$ u" ^# t3 G( X5 p l5 q1 _一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
2 e: C2 H7 z+ I1 m j! ]5 N+ U- G$ x9 p( N跳入如下分支:* U. K# R1 m/ }8 Y( v
devctl = musb_readb(mregs, MUSB_DEVCTL);
: a; m$ w# k( C. ^4 k( _6 G。。。$ s6 J1 _+ }# b9 ]3 i2 I ~9 q
case OTG_STATE_A_WAIT_VFALL:
2 Z; O# x/ J! w3 Z ~8 z /* L& ]7 M& }( n9 N8 r! s+ T q# X
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3& K, f, y% O! t3 Y$ |) [
* RTL seems to mis-handle session "start" otherwise (or in
' w/ G# R; ~% P' J/ C' f: y, C; w * our case "recover"), in routine "VBUS was valid by the time7 n! d2 u$ P5 l
* VBUSERR got reported during enumeration" cases.
1 U- k6 y; D- O7 f9 i* ~ Q */; U1 }; v. w* ^( o( B+ A5 e$ p0 w
if (devctl & MUSB_DEVCTL_VBUS) {
3 R1 a! _: B2 J; Y- O mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);% G0 [/ K- F( M7 [; @
break;! v1 F! B2 b* D3 h# d9 N
}' s. n5 u) W/ t7 ]
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;( k4 X7 p; f% u o6 W
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,/ P2 u W* @! q* J! i
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);8 N+ C" B$ [8 B5 x
break;
' u5 Z0 q/ r* j% x
: D2 `! E x( `4 F其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
7 e w" D7 R! @6 N. z8 o n不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
6 }+ c$ S0 t: w3 r8 B% K- {- E8 w 不知道亲们有没有遇到类似的情况,是怎么解决的?( d) B4 w% t f% y1 D+ W O
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|