嵌入式开发者社区
标题:
关于USB的问题
[打印本页]
作者:
378087736
时间:
2016-12-1 09:25
标题:
关于USB的问题
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
2 K1 l! w- w* O2 ~7 k# ~* V! [1 o
hub 2-0:1.0: over-current condition on port 1
* s2 q5 e0 V- ]5 T) _
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
6 }" J; t8 x1 k; Z1 Z6 f5 s9 i* X3 a
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
& v/ `& u( O9 `
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
) F0 X) S, ]4 s5 d" \
发现,在da8xx_musb_interrupt函数中,有如下代码:
+ u* q/ y) E: n4 u, G% s6 ?7 d. ?, O6 a
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
& ]+ k) f" B4 A# C* R# ^, E
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
- n) D% U3 ]$ I5 m
void __iomem *mregs = musb->mregs;
/ S4 n, A1 j) Y t
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
2 O/ `7 H2 z H* Z
int err;
' T2 X6 ]6 x8 B; M R- ?
) F( F5 K. E9 e9 e7 `1 K
err = is_host_enabled(musb) && (musb->int_usb &
% `! d8 ^$ x4 D. T. E: R
MUSB_INTR_VBUSERROR);
! a! x# q/ ~2 {+ q
if (err) {
/ K. r. O# P9 z8 U) c- ]
/*
' P( G0 b2 X9 {5 ]+ h% j
* The Mentor core doesn't debounce VBUS as needed
: }+ P& ~, ~. U' z
* 。。。
; _$ U! ? b& c8 w2 `: r
*/
3 s; p: i4 [: M0 O& |7 k* \
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
* M2 g6 }' I$ v; ?
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
6 Q" @: W6 O1 h. B. @; P
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
! F1 n5 h& y: ]# D- i
WARNING("VBUS error workaround (delay coming)\n");
& L9 ` @ j8 _9 n+ ~$ x |
}
% H7 u& n/ Z, i% t0 w, L6 `
. m" b; T4 _# o: c, _
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
8 q5 O- k0 A1 m+ W. L" k9 u
跳入如下分支:
, s* U0 d. k, U- G( X
devctl = musb_readb(mregs, MUSB_DEVCTL);
* [- A- h, c1 q4 m$ k! Q' x
。。。
8 I3 F0 a4 q( B
case OTG_STATE_A_WAIT_VFALL:
, D$ {+ E$ a, Z* [
/*
1 I) u6 T4 ^1 R) d$ M
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
' S) V8 H! k' v' c* b$ l
* RTL seems to mis-handle session "start" otherwise (or in
( } Q! {2 L" o" ~/ I6 [3 U3 L
* our case "recover"), in routine "VBUS was valid by the time
5 ^! ?5 l6 K! N- A9 J9 p C& b
* VBUSERR got reported during enumeration" cases.
; t( y$ ^7 M. ~5 t9 z
*/
! p" W3 f* E' x; p# I8 r4 ]$ j8 `
if (devctl & MUSB_DEVCTL_VBUS) {
7 q) \- {% c5 e3 e f5 W+ V: ]
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
2 r1 `3 b6 ]3 L' _2 B, {0 \$ X, J
break;
5 B+ T: ]4 V# H4 G6 V) w' x
}
( ^! D! ]# t% |
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
. p* L2 F) _. T6 ]/ ?
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
/ Y$ o$ R' [2 M! o
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
- H+ a% k" U; ~$ p0 I
break;
" @% F( F0 E( {! q8 w, ~
+ z* o' Y5 c; d; u) b+ r
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
0 f: g' ]8 k( V3 g9 y* t( q* k% h
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
4 T, M; @6 h( I/ G) w
不知道亲们有没有遇到类似的情况,是怎么解决的?
! F( _1 s5 `; m
作者:
human
时间:
2016-12-1 22:01
如果4块正常的话,那驱动应该是没问题的,多半是硬件的问题
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4