嵌入式开发者社区
标题:
关于USB的问题
[打印本页]
作者:
378087736
时间:
2016-12-1 09:25
标题:
关于USB的问题
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
) Q1 v s0 U7 S8 j
hub 2-0:1.0: over-current condition on port 1
8 w1 E' @! W+ X9 d, B2 b
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
( p y& b4 P8 ?- t" \6 R- ~
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
, s$ H3 j6 y; D* {: {
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
. D" X# C" H. Y, d. b q
发现,在da8xx_musb_interrupt函数中,有如下代码:
K" N9 O. T: a! Y/ c; x
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
s6 Y3 T( ?6 m/ ]& \ z0 S9 C+ c
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
* a, [) ^- \# w. e4 _7 U
void __iomem *mregs = musb->mregs;
' o1 M' g6 d6 X2 b4 a4 Y ^! ~
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
7 m2 M7 Q& e8 p( i4 a4 b! E; ^
int err;
( B5 l, ^8 X% R
" M% @) p7 V/ {7 T+ n' F/ {
err = is_host_enabled(musb) && (musb->int_usb &
) b1 i- D s4 l; j
MUSB_INTR_VBUSERROR);
1 w; Y1 g9 Z" u C2 x
if (err) {
/ b+ V9 I. a6 J- v1 U, N5 T
/*
4 }% H, Q$ @- Y# \+ [- Z
* The Mentor core doesn't debounce VBUS as needed
. U6 P+ n; |& F' J* o: U
* 。。。
3 ~! k+ Q' E1 O& X( `$ a
*/
/ F: J" [/ B" C
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
$ ]$ S, p0 J0 @
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
, I8 j8 S. T/ e* a2 M* G
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
3 u: h) R- `* f9 U: T
WARNING("VBUS error workaround (delay coming)\n");
% h3 q. M( f4 Y3 h' a
}
$ E) u" E- l0 A" R8 l; M9 W
9 K! ^8 b: K% }( z# d/ G
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
( S( P( F) X" f$ m8 z6 o+ e. E
跳入如下分支:
8 U* l9 d: @ s' a, K
devctl = musb_readb(mregs, MUSB_DEVCTL);
, c% m+ M( E: d7 Q3 d
。。。
0 I! i: Z/ o* ^% O- o, C' T
case OTG_STATE_A_WAIT_VFALL:
l( s' J# C7 x
/*
/ w/ N/ a T$ i; |
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
" S( Q) s+ k+ N1 o4 Q; D
* RTL seems to mis-handle session "start" otherwise (or in
! p0 ]. I9 _ b6 f6 I* {1 d
* our case "recover"), in routine "VBUS was valid by the time
/ `9 _8 u" Y" [: R
* VBUSERR got reported during enumeration" cases.
9 H& ]+ R/ ], Z# Y
*/
: y* C( P6 T$ O4 y5 h) |# @
if (devctl & MUSB_DEVCTL_VBUS) {
9 c& C' b$ N# }/ |# P0 N
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
0 f( w' g) U2 T5 h/ d0 W
break;
' V5 q% w9 }/ c: s" K6 ]' j
}
+ h; ]) g/ X1 n5 d
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
9 p& x' [& `6 _5 c/ }3 ?0 k5 c
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
! u- ?9 U5 w4 j1 T
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
9 n; f }- ?' W% J7 I# {4 u
break;
3 O d! _1 ^6 Y
% I6 A* ~( o0 A( H, b- u
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
9 Z2 X/ i a, {- B, G1 N; J
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
* Q% A7 V* C! w9 ~; Z+ `
不知道亲们有没有遇到类似的情况,是怎么解决的?
% v# c: g; v. \& d$ R5 p
作者:
human
时间:
2016-12-1 22:01
如果4块正常的话,那驱动应该是没问题的,多半是硬件的问题
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4