|
|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:0 z( A$ `$ ?# n8 E# s) ~, f
hub 2-0:1.0: over-current condition on port 1
; K3 U* _- E- M2 xda8xx_musb_interrupt 538: VBUS error workaround (delay coming)
. h2 v: f- T' Y% J& f! e/ v! h我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
- W5 T4 h e/ n& I. F随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,6 I! R6 s& k# s
发现,在da8xx_musb_interrupt函数中,有如下代码:) ?& b' v/ q8 i2 { W
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
/ V( Y( o$ `; f6 o3 z9 c; e# `( p int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);2 ?. l# U' z. h4 h0 _
void __iomem *mregs = musb->mregs;' `3 K5 i( H6 t& Z
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
' {9 ~ Y$ |! M3 a/ a& m( e int err;
- ~9 R1 ~2 P, m6 H# s: U4 U' O. D4 _3 \1 B5 ^
err = is_host_enabled(musb) && (musb->int_usb &
P6 q: I$ T/ o- K MUSB_INTR_VBUSERROR);
8 y; _5 d8 \4 u2 P; u' s8 Z$ L/ M if (err) {
% l K2 S$ F( d /*' Q/ A, A* X) Y$ v, s0 t
* The Mentor core doesn't debounce VBUS as needed
5 M) Y5 U0 q+ T3 g ~$ g7 H * 。。。
* d$ K$ N- n" ]4 B$ H K */4 ~# i9 A( Y6 C; y
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
$ H3 _! ~: ]) `- ` musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;$ a$ @* y" S Q! X+ i C
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);/ K1 e; t7 J3 E! n& [% `0 o
WARNING("VBUS error workaround (delay coming)\n");
6 E) I. Z+ K2 Y }
! [9 M P( Y/ v; t, j# \1 O' J- b6 G/ L- l- g5 c$ {
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
& U: x' s7 Z: Y( ]/ _: M5 j跳入如下分支:
6 f: v6 S4 ^! i, odevctl = musb_readb(mregs, MUSB_DEVCTL);
0 G/ N" ?# F: r! a. \。。。5 B" Z6 [; a" K/ d
case OTG_STATE_A_WAIT_VFALL:0 f$ k7 M" X# y2 u+ {, y0 L8 u+ t! q
/*
# H3 u' I) w! Z, T: ^ * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3# H' H6 T d% y; l: `( R+ C3 H
* RTL seems to mis-handle session "start" otherwise (or in
/ { K+ p, W, a * our case "recover"), in routine "VBUS was valid by the time
1 Y5 _1 n) A/ N- Q, V) G * VBUSERR got reported during enumeration" cases.
- ~& p1 p6 M5 P */
% b) j& {. W6 J; N7 Y if (devctl & MUSB_DEVCTL_VBUS) {$ X# h' r4 U7 r* q2 ?; B- i
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);9 N* q! Z5 Z v2 l$ b, v+ k3 A7 q
break;& v) b/ L# i. f) j+ g
}( W& b' Y4 Z) j
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
% Y/ `$ l- V4 G1 m: _0 T5 I musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,8 o( }- p1 s. x& L7 L& C0 n6 _3 K
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);5 q4 [9 `* V: G3 ]) q/ n0 v$ B9 S
break;' W" F( B. K) E: C/ T$ B& h' E
0 S- x# t- ~. l5 K. z. i( l3 I9 v$ {其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,2 r3 o3 r4 R/ s- \
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。5 _6 P* U7 R: M) {0 `: c
不知道亲们有没有遇到类似的情况,是怎么解决的?
0 V! r2 S$ t( X7 l( F0 Q4 Q4 H& m L+ r |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|