嵌入式开发者社区
标题:
关于USB的问题
[打印本页]
作者:
378087736
时间:
2016-12-1 09:25
标题:
关于USB的问题
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
. W [4 I, T1 \* y
hub 2-0:1.0: over-current condition on port 1
; D$ _2 P- Z' q2 D% A- _% S
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
& N5 T4 M2 F1 A8 j, u) N* {
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
/ a0 h- Q7 `9 y& m# l
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
5 o3 @& T; X' j8 b
发现,在da8xx_musb_interrupt函数中,有如下代码:
& L3 I P# M$ O6 u% t
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
5 W+ H# w4 W' d3 ^
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
4 F6 T$ o4 A( ]; `% y7 n
void __iomem *mregs = musb->mregs;
# O [" `1 ~8 V9 j+ c
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
+ U' D; u7 _" b8 P* B; H1 g
int err;
$ ~( T" O, ~8 \. c: L# k: U+ j7 Q
4 [$ ?8 n8 Z6 s5 J' p$ c! J0 d
err = is_host_enabled(musb) && (musb->int_usb &
2 K: A# ~' d( F/ K" ]
MUSB_INTR_VBUSERROR);
; K/ ~& z( b' i* ^" `8 G& X
if (err) {
4 o% V& T5 |+ T9 P) |
/*
; }0 [" H! a. B) d6 F! Y
* The Mentor core doesn't debounce VBUS as needed
9 [& O$ [8 O4 W9 s9 X
* 。。。
2 x. P8 }4 Y& k& C' ^, p& V
*/
5 X P3 [7 i( J, z n5 U
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
$ L7 s6 ^/ R$ V8 Q
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
; y6 ?1 P! o+ A4 x
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
) T; }: P/ s* r" a2 o& D
WARNING("VBUS error workaround (delay coming)\n");
: C' Y4 ?, U. l+ @3 X5 b
}
B: I: B1 b' r* z3 `9 o. Y1 R9 Z
3 U' L# q# w- `( {( o/ h
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
2 H. x- ^. c7 T/ a
跳入如下分支:
' q4 s4 Y8 q. b6 v. a! p1 U
devctl = musb_readb(mregs, MUSB_DEVCTL);
7 g8 D) b6 l/ N8 J
。。。
+ e- }% r" I4 K
case OTG_STATE_A_WAIT_VFALL:
1 L9 K2 P2 e/ y& F8 K, Y
/*
) _2 }7 ~$ h w: d8 {/ p
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
3 C; n+ T! d2 `5 W/ h% O
* RTL seems to mis-handle session "start" otherwise (or in
. t) n' b+ K H( p2 Q7 @
* our case "recover"), in routine "VBUS was valid by the time
# z: ]0 G% C0 ]: o* x! t. ?6 i( b) u
* VBUSERR got reported during enumeration" cases.
0 Y4 ]: s1 m4 L" p3 M# W
*/
& ^) I& _8 b* a+ q, l; _
if (devctl & MUSB_DEVCTL_VBUS) {
# x" H+ [5 C/ u
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
0 Q8 ~9 f- \1 ]4 k# l+ a
break;
" }0 e7 x4 G+ J
}
: C: l+ [9 W5 r* c
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
2 h' r0 t. G7 K c6 E
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
t- \- J0 P7 p. z/ G _# ^
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
; ^ K @3 G0 D( r' P b- v
break;
* J3 l s7 v# L0 G; |
3 `1 ?) ]8 R0 b, b" o
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
- d8 Y) v: d7 {$ l9 \8 R
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
! ^, G: L3 b6 w- X
不知道亲们有没有遇到类似的情况,是怎么解决的?
`) I r- g: Q! S+ ?* |) _4 p: h
作者:
human
时间:
2016-12-1 22:01
如果4块正常的话,那驱动应该是没问题的,多半是硬件的问题
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4