嵌入式开发者社区

标题: 关于USB的问题 [打印本页]

作者: 378087736    时间: 2016-12-1 09:25
标题: 关于USB的问题
     小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
) Q1 v  s0 U7 S8 jhub 2-0:1.0: over-current condition on port 1
8 w1 E' @! W+ X9 d, B2 bda8xx_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; xif (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, Kdevctl = musb_readb(mregs, MUSB_DEVCTL);
, c% m+ M( E: d7 Q3 d。。。
0 I! i: Z/ o* ^% O- o, C' Tcase 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