|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
' P1 V0 Z' J8 W5 _8 T2 F& @- E" Zhub 2-0:1.0: over-current condition on port 1
* J1 M; k2 f) f2 C9 J$ e: Bda8xx_musb_interrupt 538: VBUS error workaround (delay coming)
- P! y, e' Q" v0 K6 [) o我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会! c8 g9 d" X+ A1 ~- C b
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
* _0 ]4 ~2 P8 P8 Q0 u U i Q发现,在da8xx_musb_interrupt函数中,有如下代码:
, f1 w. K9 q6 k Gif (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {' Z; @! O0 m# |7 T( Z* l+ U
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
. R$ ]* d; {3 q j& B void __iomem *mregs = musb->mregs;/ N: \) F; [1 y- @
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);( D/ Y0 I9 C( D" h
int err;
. G6 N. a8 c/ ]$ c
; v/ ~) Q: q: W n+ a; J9 n& m4 H6 t err = is_host_enabled(musb) && (musb->int_usb &- i& H5 m: ?/ u( s! F
MUSB_INTR_VBUSERROR);7 S! {# }" c2 @" @ @. v: X% h
if (err) {) S* \- z' |: T3 G9 a3 Y9 g
/*
/ m4 g" B% L7 R) p b2 M * The Mentor core doesn't debounce VBUS as needed
l, Z( T \0 W0 y * 。。。9 Y) N. n& _2 {8 K! D* R4 F3 w! v) d6 F& v
*/
8 ~. q( o( Y( h; S musb->int_usb &= ~MUSB_INTR_VBUSERROR;
, f4 v5 H# b' \$ k% P* C, Y musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;; V( z( d9 H1 E- g( _' l! K- I" N
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
; l7 X' R' q1 U g WARNING("VBUS error workaround (delay coming)\n");
# y* i+ I. Y! U3 J. {4 D! q }
2 d7 {5 l! K% t9 {
& P( U4 u( e; F& z一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
9 K% w- U2 V" z' b/ `( d* W0 |/ m跳入如下分支:
5 S3 G1 W( [; N, p4 G8 cdevctl = musb_readb(mregs, MUSB_DEVCTL);1 V* e# D2 V) V( s% y3 A! _8 E5 h$ Q
。。。, B8 k6 I6 j. B8 M
case OTG_STATE_A_WAIT_VFALL:
1 i& |# Z( Q/ w /*; w$ o* E/ f! A( [ t' p1 \/ S
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
4 y9 S7 r( l" ~3 A | * RTL seems to mis-handle session "start" otherwise (or in
! D+ v' L: x2 j * our case "recover"), in routine "VBUS was valid by the time
! Q. l4 Q! g8 J" S, A# M0 N8 W6 V; q * VBUSERR got reported during enumeration" cases.
' r4 [" B9 X: F A0 X; J) k */+ p% w. u8 \8 ]2 H" g3 R
if (devctl & MUSB_DEVCTL_VBUS) {
# u9 [; c5 v( K& G, ?: F8 \ mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);( i. G ~* J M7 }& t: r) D% C7 U9 `% T
break;1 J4 r, q `) |; J0 F+ K
}
7 f3 a8 N: f* x0 c2 Z! G6 u musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
8 C& C% M: {% }) y musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
/ |2 ~1 b1 u" q0 k O4 Z0 x! S' h MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
' i% i" `; o$ o2 _8 D break;3 B( D1 q: T# c( F6 r: G% c
0 n1 x; W2 y: s! l
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,/ z9 i& n0 B( m( x: d7 T$ N. f
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。3 \. g+ \, U- ^' H" t9 e4 e
不知道亲们有没有遇到类似的情况,是怎么解决的?8 O9 X# S/ t8 ?+ q# i+ }+ L& r
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|