|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
2 V; \* o, S4 phub 2-0:1.0: over-current condition on port 1
1 B4 t* n# c x7 sda8xx_musb_interrupt 538: VBUS error workaround (delay coming)
5 F" s4 S) A' A, n# m我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
9 ^% z& ~$ N0 N; }& H随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,& x+ ?+ n% I. a0 W
发现,在da8xx_musb_interrupt函数中,有如下代码:
8 Z# o, H( F9 c: A# _ F5 u6 `if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
/ }% z4 b+ I! j8 Z' A+ u" g int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
" O) L# Q* b3 E void __iomem *mregs = musb->mregs;$ n& \3 x4 S( l* _. ]3 g9 r+ \
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
5 |; E/ {1 B9 i+ a5 \5 X$ B int err;
& C$ `0 M$ _. K5 k
% [) `4 C% ]( w5 f err = is_host_enabled(musb) && (musb->int_usb &
5 Q8 y4 {! M$ K9 O3 U# ` MUSB_INTR_VBUSERROR);9 k0 H" Y" I) H( J
if (err) {+ y* E. ?- O; p" v8 m5 b- s2 `, u" Y
/*
) R6 y6 m9 ^( Q6 l * The Mentor core doesn't debounce VBUS as needed! t' U. [$ p$ J
* 。。。7 h" d% H" B8 w& u8 X) u
*/
0 z8 w2 f* ]5 t8 D musb->int_usb &= ~MUSB_INTR_VBUSERROR;
" N% u7 P# D+ w: G1 }( S) T musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
& P; T2 @: s8 O% ~9 \ mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);! b6 v- }. |) g) E1 e/ v" ?
WARNING("VBUS error workaround (delay coming)\n");
+ a: b+ L C% H4 Q% b/ b) w9 i$ w" D }
3 [' w8 b/ v4 _7 {; P! a3 T
+ b' C3 `! Y% P一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,8 m8 a* D. d: X o
跳入如下分支:$ l$ ^7 U! M2 O! N1 }
devctl = musb_readb(mregs, MUSB_DEVCTL);' e" W# B- v3 f
。。。; Q" e/ M2 G" s: J
case OTG_STATE_A_WAIT_VFALL:0 u+ z0 ~, k* G
/*! I, v m) l6 R1 ]' W) Y$ e( C
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
9 P; Y6 J# U" W* W. {- l! \/ [ * RTL seems to mis-handle session "start" otherwise (or in
" R; I0 R: p- ]4 b. i9 g * our case "recover"), in routine "VBUS was valid by the time
; Q$ X' \0 @/ ?8 P1 L+ O" W * VBUSERR got reported during enumeration" cases.
5 g2 ]0 \0 k7 |$ h8 e: m/ T9 @ */
) G+ G) A2 l5 f E! S. H if (devctl & MUSB_DEVCTL_VBUS) {
9 C6 R" Y! H8 @8 \, N mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
- {& O0 B* B0 [3 c break;4 W8 ^6 J2 {+ R/ b; O- l
}1 @" [2 ^9 C6 L( b& G) h! r
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;% [ w" V8 a# F# [5 M. ]8 r$ u- N
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,$ p3 p& a9 l1 v2 Y) [) P6 N
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT); ~: O$ [! P2 f9 O( O) c
break;
+ M' @, {$ _7 }9 r7 B3 |8 G% q) v1 S" {
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
" d' V' f# U$ y' o3 H不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。: R0 w( r" u- E7 v
不知道亲们有没有遇到类似的情况,是怎么解决的?. g3 L9 n3 O, g& P- H( H
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|