嵌入式开发者社区

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

作者: 378087736    时间: 2016-12-1 09:25
标题: 关于USB的问题
     小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
' n2 m( I9 z. R% a, S1 z: uhub 2-0:1.0: over-current condition on port 1& ^2 j/ T2 c' i
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
. I- k4 E; g, u5 @3 V我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会1 |( G7 L& d& _( M0 {0 z
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
3 f! z; N0 ]# x8 [, [2 k2 z1 F6 u发现,在da8xx_musb_interrupt函数中,有如下代码:) B, L; p2 M1 D2 T3 Q! m% R# y
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {9 m) ]) }- u! t8 c6 X
                int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
4 {: B( S! w" W  I, F6 C                void __iomem *mregs = musb->mregs;5 n7 [7 ~# b" O% Z; \( d
                u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
; }8 V" ^2 g" y! @                int err;
% k9 S& W% f; \+ f& ^" I
* w  M2 l9 \& P8 v9 ~: i                err = is_host_enabled(musb) && (musb->int_usb &
$ k# P0 ?1 H4 w8 R: O! V                                                MUSB_INTR_VBUSERROR);8 R' y" {; V6 S- m' f. R8 Y
                if (err) {. d2 l; V* C1 {" t8 U
                        /*
& e9 V- {7 B7 G( f3 I- _                         * The Mentor core doesn't debounce VBUS as needed
; O" `3 ?/ \% r, L1 z* q                         * 。。。
) U+ N( t2 L2 Q4 j                         */, y- i5 E. H5 Q7 W6 N' b9 H+ o
                        musb->int_usb &= ~MUSB_INTR_VBUSERROR;
% y- l6 c9 w& W" x                        musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;& V. v& i/ b1 v/ @  D6 `( Q
                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
. ?! y5 e, Y: C$ u( A) H1 q7 f                        WARNING("VBUS error workaround (delay coming)\n");6 H/ T( H0 Y  n+ z- Z2 l/ Z
                }
2 q) h& Y7 @( B' _4 c; ]4 u/ R
7 W) _. a1 u0 ]0 ~4 K$ D6 v$ Z一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
4 p( d' u) j' ^& v# R: y7 \跳入如下分支:
" @4 K/ e. k1 [1 J6 ]) u* \devctl = musb_readb(mregs, MUSB_DEVCTL);6 l1 a0 I2 }, A$ G  H! _
。。。
( q8 f  V: Z. _, s- d# w: Gcase OTG_STATE_A_WAIT_VFALL:
# X0 C- x9 l4 m; e6 Z+ k                /*# f! T4 Q0 t! P& |2 {
                 * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
; D" P4 L" t! O* O# u# ]# _                 * RTL seems to mis-handle session "start" otherwise (or in
0 B3 ?; Y+ n' T+ X/ t0 k; ^                 * our case "recover"), in routine "VBUS was valid by the time
; P' ]$ |4 }; n6 G5 e4 ?                 * VBUSERR got reported during enumeration" cases.
3 h7 A7 w6 t* q1 `7 K1 Z                 */
; J5 R; U  v/ K& n1 r+ T6 `                if (devctl & MUSB_DEVCTL_VBUS) {
. m* d3 A: A0 ?* Q# j: D                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);+ l, |% j1 {. y' E0 w( v0 v
                        break;
' R- I$ v% s4 D, Q1 q1 u/ l7 n                }
1 S( R( G6 Y0 r- P$ H9 a; B* e                musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
0 Y0 M/ [/ H5 ^9 {, i( L, Z8 T% B                musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,& l! n- l0 Z" x" V5 X0 l
                            MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
# a: ?) Z; x/ P. i6 @4 D6 m% E2 J2 L                break;. z4 r4 y6 g1 R! }, A0 i7 r

" q  L0 A  e7 T5 ]其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,+ `5 I8 Z+ l, o" H4 j/ u
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
/ {0 h' Y1 S4 o        不知道亲们有没有遇到类似的情况,是怎么解决的?7 \3 T, {. O4 b9 v' E7 T

作者: human    时间: 2016-12-1 22:01
如果4块正常的话,那驱动应该是没问题的,多半是硬件的问题




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4