嵌入式开发者社区
标题:
关于USB的问题
[打印本页]
作者:
378087736
时间:
2016-12-1 09:25
标题:
关于USB的问题
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
& c5 q2 D2 y( o# q& S
hub 2-0:1.0: over-current condition on port 1
2 ^! S4 x, S6 B, d
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
. P$ a7 C$ k6 ?' L0 P: E4 N7 V
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
3 J U$ g z/ \! {) R
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
: e5 h4 ~/ e* b O- F# \
发现,在da8xx_musb_interrupt函数中,有如下代码:
& e# [4 T. c1 r% v0 g" D; A7 S
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
9 n6 z( ]2 i3 P0 O! {
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
$ @- N2 c3 |) V2 Y, @
void __iomem *mregs = musb->mregs;
, q7 p+ _ ?! M2 w6 m
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
' G* N! J: [1 L
int err;
; ^1 r6 i2 j+ }( q
1 b; d7 X- F5 J" J0 n, V
err = is_host_enabled(musb) && (musb->int_usb &
: |# @/ g7 D8 L, A1 G
MUSB_INTR_VBUSERROR);
$ L- ]( z! x I6 \) {" U4 X8 b4 p
if (err) {
+ V( R, l6 Q0 }: Y, {4 n
/*
. D6 w6 c2 ]" S" G5 @7 l+ x
* The Mentor core doesn't debounce VBUS as needed
& ?9 a8 s9 m. H0 ?7 H
* 。。。
6 c) f+ z4 _8 b- ~9 t3 n
*/
0 n, c/ r& J' r/ k
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
( D x6 y. W5 s, r0 W
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
* H4 d& ~& Y/ ~' f ?5 H) ^2 _( Z
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
8 H6 R. \0 d, k! w/ i. N, T2 B
WARNING("VBUS error workaround (delay coming)\n");
! O2 u+ G- q7 N" c3 e q( x
}
! z4 W! J l+ v, r+ ~% Q8 ]3 t
5 V, V4 R4 P& A
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
0 {. `) S, W2 X/ L7 S
跳入如下分支:
; p# [3 k: A' Z
devctl = musb_readb(mregs, MUSB_DEVCTL);
& D$ x- M2 o7 }6 _! D
。。。
9 n( _! e! Y6 ]
case OTG_STATE_A_WAIT_VFALL:
. \# l0 p' |3 V4 w0 p
/*
: l4 ~* U( T' R: P0 S
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
% ]" ~% i5 x* ]" P8 J N
* RTL seems to mis-handle session "start" otherwise (or in
8 y& N+ Y; |# a6 T
* our case "recover"), in routine "VBUS was valid by the time
- v# i+ W; o) a9 v7 i8 `# h
* VBUSERR got reported during enumeration" cases.
2 B' w+ u4 @, Y/ r
*/
- N" x9 @2 z* S5 C2 l- ]* ?
if (devctl & MUSB_DEVCTL_VBUS) {
: A, P. S2 K+ T8 r; o0 @
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
2 X* k+ _; X# k5 K
break;
5 D9 o' R: U( F9 _- x. I
}
5 Y6 O7 k# o% g, d
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
; v( \0 d& y' i
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
! B9 o" K y& \0 ]* t
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
/ L' w/ _4 Z) Z( f
break;
, ~5 M) v( D" e4 k0 ^2 H. g
! z& g1 F2 J, u) c- y+ z
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
# _2 {2 Y0 j& c% x [' L
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
; d0 B- i, d* ~' e. ?
不知道亲们有没有遇到类似的情况,是怎么解决的?
9 u, J# o( B/ P# X9 f) j ^
作者:
human
时间:
2016-12-1 22:01
如果4块正常的话,那驱动应该是没问题的,多半是硬件的问题
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4