|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:: F8 L) x; @% N) s# L
hub 2-0:1.0: over-current condition on port 10 g5 R$ I: e0 O0 V6 L# F
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)8 K/ m M4 O# b' ]7 Z; S+ x
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
0 w# F2 R6 D5 f- G& |0 T T随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
- c4 q6 N0 I3 m2 V# G发现,在da8xx_musb_interrupt函数中,有如下代码:
: Q( i( ~8 `- ~" u' l e% e1 Kif (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
/ m S; H3 Z# o4 `5 }; p% q int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
4 \: L0 I9 k& P+ i; z void __iomem *mregs = musb->mregs;
1 Y( n8 E" I- J: a/ H u8 devctl = musb_readb(mregs, MUSB_DEVCTL);( o e3 V& M3 R! g6 I' b
int err;
) G9 c0 @' l" q9 z3 O. V8 f, ?+ g4 f: E! I: F( \, D; n' ~
err = is_host_enabled(musb) && (musb->int_usb &2 ^/ t% b7 \$ B5 a9 N5 C
MUSB_INTR_VBUSERROR);
/ k; M1 G C- k if (err) {
' i5 G/ Y) q2 F9 f( O /*1 j" Q1 i; P, G/ v! }7 g/ d+ L
* The Mentor core doesn't debounce VBUS as needed
5 `" L* J- Q% A9 T * 。。。* C: }+ H Q: _& W2 N
*/; K" n, `: Q/ c4 `
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
. g: `$ A' I; Y8 M( i musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
# N7 v1 @! ?1 L. V# m mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);+ l2 T) G6 m1 i' H$ a) R( D, X
WARNING("VBUS error workaround (delay coming)\n");8 B7 }: T! @9 B4 Z3 q) [4 b) Y( u
}6 d |: C& P# c
# w8 ?5 r# c+ ^ C8 ~2 f% M" u
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
% V0 d- F6 m8 n" J跳入如下分支:
7 u @3 E- A- ~/ u3 Sdevctl = musb_readb(mregs, MUSB_DEVCTL);. ^6 F" E. J' e
。。。
$ N& W1 F; B8 Z' w6 E' I. _case OTG_STATE_A_WAIT_VFALL:
1 c) ^+ D3 S# C /*2 [7 m# M x! ^: O# U" J. x
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
7 G' t9 O+ q/ M, c+ X, l# u" B * RTL seems to mis-handle session "start" otherwise (or in5 I# a) C) z$ \! ^% m- z
* our case "recover"), in routine "VBUS was valid by the time5 F: g O6 ?3 ]' H5 \
* VBUSERR got reported during enumeration" cases.4 i9 u1 m5 n$ C G
*/
: V6 f1 t X( r9 S d' P if (devctl & MUSB_DEVCTL_VBUS) {* _- S2 x: l: r
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
8 Z* C# g. T6 k: i break;
' D1 ]2 ^5 h( @; e. ]8 ] } [( j3 t8 j4 J4 l) G
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;4 O3 v3 K2 A" D5 C
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
- C: o' G: a, W) P' L# l MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);* t: S g+ w& `6 \( u
break;
6 j! \- ?$ |! s, W- w
9 X8 a6 P# z, U: x& k: J! Q其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,* K! U' q2 ]. u! r
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
' m8 e, q7 a) o4 x3 c+ m( Q 不知道亲们有没有遇到类似的情况,是怎么解决的?
5 l% q/ t; h% c% S, ]5 W( N |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|