|
|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
2 L; [* K$ w1 |( dhub 2-0:1.0: over-current condition on port 1
0 ~( H8 g. x" l) L4 oda8xx_musb_interrupt 538: VBUS error workaround (delay coming)( Q" e) R) k2 {% \" p
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会, k. k0 X+ Z( @( f4 n! R
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
. z. z5 h4 b- ?发现,在da8xx_musb_interrupt函数中,有如下代码:
1 _# z. C& m4 o D1 z0 @* s/ mif (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
8 x- p! B: R* }! O9 g* C- e1 v int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);; H: ^# I' r# K4 C
void __iomem *mregs = musb->mregs;
8 ^0 t9 \; L. J u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
6 S6 d- W8 O; ~ Z/ ?# Z/ V9 S int err;$ S( S* T" I4 [+ l: F7 N. K" T# t3 }
A* U5 j& h% B# N
err = is_host_enabled(musb) && (musb->int_usb &
# u$ o" c# C- S( Q' i A MUSB_INTR_VBUSERROR);3 @+ ?2 @% `( A) w& h7 S+ Y
if (err) {6 H. V' f* S) z
/*' f- c: }( S8 z$ X& u% R6 U
* The Mentor core doesn't debounce VBUS as needed
8 {7 ]# k6 k* z) h) v9 k * 。。。
. l: J/ O2 W" `' b. R */
/ ~+ M( {* X7 U @! k0 x0 q1 e musb->int_usb &= ~MUSB_INTR_VBUSERROR;
1 J- q; E* s l) k6 v# V2 n) \) L musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
2 k' t3 L+ Y2 x8 ]9 m mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);" ], q( g! Q4 t" E# m; s9 c5 Y
WARNING("VBUS error workaround (delay coming)\n");
; W8 j/ O5 [; b }( U' W1 J: T, u2 A7 s$ g
0 ` }0 [$ n+ ]" J一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
0 K: g6 c0 d3 I- l7 H9 l; N跳入如下分支:9 _7 E; I6 V3 \0 _7 z+ B) e
devctl = musb_readb(mregs, MUSB_DEVCTL);$ t7 b: A2 G7 ~$ M+ \, W8 z
。。。
7 U1 E9 x! R( z1 acase OTG_STATE_A_WAIT_VFALL:
" G& |# L# |* h( t$ ~ /*) T) V+ n. R# k8 A) n' f6 P
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.33 F# R4 G f- {, ?
* RTL seems to mis-handle session "start" otherwise (or in
, P" `0 S9 p. j. ~( q * our case "recover"), in routine "VBUS was valid by the time3 L$ B+ i5 m3 a6 m
* VBUSERR got reported during enumeration" cases.
5 `9 l7 P+ u2 p, `: f! v */
9 L: Q5 I" T, u# u4 L% E if (devctl & MUSB_DEVCTL_VBUS) {
3 Z. ~7 \/ X/ o3 D" d7 { mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
8 {: U( b( T/ l7 H9 S break;' c7 N4 c# t9 k! ?: n- J; T
}
2 l3 w2 r& H) p ?" E8 C musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;0 n/ z' b- \& @- e. K7 J
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG," i1 d% T/ \6 ?" U
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
" k) O. `. X( ?) V$ m" I break;
1 n; s8 j& D# h% y' ^5 D+ e$ L* ]
9 ~, d. {' v M: V% c$ ^/ o/ `其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,6 S, H( P4 i. t5 @3 u
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
. j$ i9 i7 \$ B 不知道亲们有没有遇到类似的情况,是怎么解决的?
8 d3 j5 d8 B5 u; n |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|