|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
% ^7 x# U! F, X) Dhub 2-0:1.0: over-current condition on port 1
( z% w( p8 |* f4 Q. Oda8xx_musb_interrupt 538: VBUS error workaround (delay coming); j# i% V! ^$ w7 {1 D3 z
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
% M0 ?# o7 M8 F随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,* Z. E% d9 m5 A4 h8 K& d
发现,在da8xx_musb_interrupt函数中,有如下代码:
. c: {% k" x. N. P4 x B* cif (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
" J# d8 y5 s6 O- S int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
8 x7 M: k, u' Q7 n6 V# G2 {0 y) d void __iomem *mregs = musb->mregs;
7 i0 V; C' E% C$ K# z$ g2 ]/ v' J7 T u8 devctl = musb_readb(mregs, MUSB_DEVCTL);3 a2 h7 n" ?7 a) y h
int err;
, e4 O: B- A, L- g0 x8 i' z8 ^& h- h% y) G
err = is_host_enabled(musb) && (musb->int_usb &
6 F3 t G ~. C! a4 [9 ~ s) a MUSB_INTR_VBUSERROR);8 f9 f0 ?6 e( q2 m/ _! }
if (err) {) G8 |( l, j+ n8 a
/*
U% S' q7 f; A/ ^3 X# F; d * The Mentor core doesn't debounce VBUS as needed1 f- X' @) Z+ s+ }
* 。。。
% o4 ~% o: @5 [ */
' {0 G3 c# z" ] ^" v( _ musb->int_usb &= ~MUSB_INTR_VBUSERROR; O S% y+ t Y
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;- p' P7 S4 | ~7 ]
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);4 e6 r- L- Z* u/ k! n0 A- H
WARNING("VBUS error workaround (delay coming)\n");
) Z+ u9 {/ J$ G4 Z0 l& _& y1 f }
, K5 t9 s: o! z4 M
. \* }; ]. @8 `一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,% C) @) w7 P( Y/ o9 e7 I+ s
跳入如下分支:
# t/ b) k& U, rdevctl = musb_readb(mregs, MUSB_DEVCTL);+ x( l8 M7 ~9 P
。。。- F& [8 h: b; D& s. f4 W
case OTG_STATE_A_WAIT_VFALL:4 W# i0 O7 j3 A( V0 s' K$ n' R$ h; j
/*
! y" B2 }+ L) ~8 b4 k/ D * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3% e3 T& x0 I7 Q
* RTL seems to mis-handle session "start" otherwise (or in# |( V* `2 L) u% }2 `% ^4 P
* our case "recover"), in routine "VBUS was valid by the time: Z2 D' J: S" F, [
* VBUSERR got reported during enumeration" cases./ ]% l) V% {6 I4 S0 w/ i
*/
* u0 t! R/ T8 A7 D+ g if (devctl & MUSB_DEVCTL_VBUS) {
+ v7 `4 Y' x% E) c, O% {) ^ mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
8 ~1 b1 e/ j) N7 V3 _# v# k break;' G* [0 \; o! ]9 d! y3 h. X% T9 g
}
1 E3 P7 P$ x9 h+ X3 o3 K musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
- a; V! l7 t8 Q/ U; d1 _% V3 [7 a musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,1 Z) k3 Y# L6 Q8 T6 L2 [4 j
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
+ n; ]; E9 x/ [- v' ]1 [ break;; h. p7 l2 m! r2 M( h* |2 Q
' G, C; p. U: y其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,4 Y+ l' x/ ?; v* Y- {8 a
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
* I1 T6 L2 Z- x. `, W 不知道亲们有没有遇到类似的情况,是怎么解决的?6 C) S" ]3 j, j8 ~
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|