嵌入式开发者社区
标题:
关于USB的问题
[打印本页]
作者:
378087736
时间:
2016-12-1 09:25
标题:
关于USB的问题
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
, c& a$ j- a$ V. X2 G5 g* ?
hub 2-0:1.0: over-current condition on port 1
# l7 P! O5 U* C0 d
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
/ [2 D% o4 ~0 y7 v" r$ q
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
* P( m C% D: q; R
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
t6 p# Y" k$ r8 _9 u+ r; E
发现,在da8xx_musb_interrupt函数中,有如下代码:
6 E" e8 f$ g8 ~
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
3 }5 O/ g! r( h+ a+ ]: V
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
2 i4 x' J% v$ ?3 E7 [* {/ }; s( u
void __iomem *mregs = musb->mregs;
5 g2 U- o7 k' J2 y/ G
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
R& y( i8 W ?4 A" r! N
int err;
) g' \5 v( m5 g1 ~
/ z, I3 G9 _: P& I+ c0 R
err = is_host_enabled(musb) && (musb->int_usb &
$ x# z8 T- J0 D7 @8 R$ y
MUSB_INTR_VBUSERROR);
. q$ V |( {2 @+ j/ F3 d
if (err) {
! c% P8 F& n P: q$ s% R
/*
: B/ [) W P8 ~8 R
* The Mentor core doesn't debounce VBUS as needed
( ~; N+ M I6 ~( ]
* 。。。
1 Q) z& k9 i' f$ O. l
*/
% w$ |2 I& O: @6 w9 {2 m& |5 y( d
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
3 j- \; ?0 O' w& `% e
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
& g6 `' k: y7 v5 ]9 u* {
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
/ Y1 ~0 d8 h. \ B+ W! e4 K
WARNING("VBUS error workaround (delay coming)\n");
1 w9 y* L9 h9 q% f. M
}
) E9 F# k: _9 E ?0 |, \
5 C9 @- A/ P* [0 M9 f# B6 k
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
5 g) h b- E9 t. _- B2 W4 S
跳入如下分支:
1 q6 G- j- H; T& x
devctl = musb_readb(mregs, MUSB_DEVCTL);
! [; c! R5 ~8 |3 |$ A- _0 [7 u: X% N
。。。
4 [& A$ f; M9 x3 ]
case OTG_STATE_A_WAIT_VFALL:
' F1 H1 N3 |$ k3 F9 U/ k
/*
% `: K+ H' Q0 s4 C) [
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
1 O8 o x+ h& _7 X& p
* RTL seems to mis-handle session "start" otherwise (or in
9 m5 i' W/ z7 p$ n6 o
* our case "recover"), in routine "VBUS was valid by the time
) q7 `+ s6 ^" M+ \
* VBUSERR got reported during enumeration" cases.
7 X8 }. f# `' l7 c
*/
4 p4 {2 C/ l$ a
if (devctl & MUSB_DEVCTL_VBUS) {
1 N) Q: S3 I) ^5 R4 }
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
! l" G# t7 X& i; M6 o: Y; d
break;
$ B% C+ X* c+ ~
}
- @/ y2 d. |5 [6 c; ^
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
& h. N3 a' J. z$ A4 a. F
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
; l2 W. a3 p" u8 y% q1 `9 P4 j
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
8 c& b1 Q2 v: b! L" c
break;
/ i7 w& p2 C" F5 M+ c) }- }
6 q3 ^5 k9 Q5 e* N
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
& |8 M t" d& c6 n) f( B4 T
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
?& A8 P8 r' {
不知道亲们有没有遇到类似的情况,是怎么解决的?
5 g( i% U/ f, T' U# Q
作者:
human
时间:
2016-12-1 22:01
如果4块正常的话,那驱动应该是没问题的,多半是硬件的问题
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4