|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:8 H$ v5 [! b6 k7 g# q5 k, A4 [
hub 2-0:1.0: over-current condition on port 1
% m* |9 e( l6 s, zda8xx_musb_interrupt 538: VBUS error workaround (delay coming)
: h1 e8 n+ c' R3 m7 l) x我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会/ k4 I' x9 L9 f! A
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,: L7 I3 y7 T. W; E1 m
发现,在da8xx_musb_interrupt函数中,有如下代码:- k2 n. s- Y' c C0 V% G
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {3 ]/ [: s" u& n! G8 E* ]! f
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
! X2 `; E* h: l, V! q, t3 Q5 w2 A void __iomem *mregs = musb->mregs;
6 S+ {) m8 O2 z4 T. |% m4 o. S* D u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
! \+ A( E0 o3 ]$ ] int err;
: h- N" i6 l& S9 }. x8 H- X
2 i6 B" w6 T8 y err = is_host_enabled(musb) && (musb->int_usb && u2 f4 W# r8 m7 A4 l2 \: }8 m2 a
MUSB_INTR_VBUSERROR);
% _: t* X5 `9 u if (err) {5 l5 k4 m, S2 m" g1 t' s/ ?
/*. C/ R" r4 E! @" z! F: W
* The Mentor core doesn't debounce VBUS as needed
, q6 n% G6 ^6 A, F& ]% j4 Q: H2 e * 。。。+ R. @" @* o8 K
*/- z# K( n# U8 n1 t2 n
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
2 h. {4 q/ g2 m7 O% f" Q1 w7 Y musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
4 D( [' X" n/ p mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);0 Y. C( l7 q' t3 ~3 \& f6 D8 x t
WARNING("VBUS error workaround (delay coming)\n");
! o. k% u* @( F, W6 B4 v }) i2 {9 n6 n+ S4 q
9 O% \' Z8 Y$ _1 W
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,* O( |7 Z# }# D% V. D- W
跳入如下分支:
8 ?: x, b! J( Y# ldevctl = musb_readb(mregs, MUSB_DEVCTL);
. z1 x4 G& X5 s! ?7 e" u- L8 _。。。8 ^5 a+ {( }, A3 c
case OTG_STATE_A_WAIT_VFALL:
/ S+ `. } _' b7 Z1 V /*
: z# F) {* c4 o6 R, Q! \# l2 P7 g * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
, \0 \# v. t& `7 U, p% `& z * RTL seems to mis-handle session "start" otherwise (or in) V+ W3 G" A( b$ g6 u0 y
* our case "recover"), in routine "VBUS was valid by the time, _5 y9 u6 m& A* a5 z4 W
* VBUSERR got reported during enumeration" cases.
4 I. B* c6 B ~/ Y */- h7 b9 o% o3 e! J6 K* l
if (devctl & MUSB_DEVCTL_VBUS) {4 A `5 m# {* y" M1 F8 d9 T2 c
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
b9 K5 b. x, t- k" W1 q" j ^0 ] break;6 _% p3 Z9 X4 P
}
5 K$ [7 Y( ?! I z" Q$ c musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ I1 t2 m/ y+ R% ] musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
9 t+ z/ Q% p; x* B0 { MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);; Y& p( @6 Q3 R! L. Q
break;% B e- @2 X+ C6 ~, @
. S1 l6 H+ j) D; f2 w3 _" V1 w3 B其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
. Q! S. o' J8 v1 E4 B1 O3 @; b不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
0 J. y7 `3 Y) |1 }+ h2 J 不知道亲们有没有遇到类似的情况,是怎么解决的?
, S! O7 r Z9 ]: e |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|