嵌入式开发者社区

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

作者: 378087736    时间: 2016-12-1 09:25
标题: 关于USB的问题
     小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:3 L  r% u& q. @. D7 C
hub 2-0:1.0: over-current condition on port 1
4 Q  X. @$ d4 e2 ?$ f, V) [da8xx_musb_interrupt 538: VBUS error workaround (delay coming)' {7 z/ w* B$ E, u
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
- \: O: t* o" ^! l2 W2 s9 m随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码," _+ s$ I: B/ |6 w9 U3 T
发现,在da8xx_musb_interrupt函数中,有如下代码:
1 [  b; J2 z; F0 y: [if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
7 d2 h& y2 p7 ]$ N# M. h                int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);) r  R* r; E3 @  \" n& B2 K2 d# i
                void __iomem *mregs = musb->mregs;3 @5 u9 n+ d  I, a; o
                u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
; c/ _5 u7 F* K! H& f' l: F                int err;
: V, M+ }$ V8 C, r' W: ~% G- d" ?! D& p" |: S  y7 s( e; x9 [9 Q
                err = is_host_enabled(musb) && (musb->int_usb &7 R7 j' @: O! R, [" v& J
                                                MUSB_INTR_VBUSERROR);
& W4 ~8 h3 d& ^: ]; q* J* k                if (err) {
4 }# w" l$ t$ y: X                        /*
* S7 }; D% }! r$ O                         * The Mentor core doesn't debounce VBUS as needed+ r( ?9 _/ Y$ y: |
                         * 。。。$ }* O# Y9 ]; T. I1 \
                         */
4 j4 D0 g0 `) ?8 Q$ c+ R5 Y! f                        musb->int_usb &= ~MUSB_INTR_VBUSERROR;
3 g  I8 e4 ^# T( ]                        musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;) z9 L8 c# |3 J& |
                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);7 R: q2 ~: E4 e- M
                        WARNING("VBUS error workaround (delay coming)\n");% q( r6 V1 w0 K. ^9 m4 @
                }; @3 u# i3 {3 S3 A

. ~' e8 s( J7 C一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,/ `; }' w& S8 _  @. N' \/ c; @0 J
跳入如下分支:
) U/ j5 H& v# d4 W! [devctl = musb_readb(mregs, MUSB_DEVCTL);
+ j7 T* |! ^& O5 v8 X4 L3 x! p。。。* f7 y- J( s. z2 b, ^2 z5 ?( A$ Q( g8 x
case OTG_STATE_A_WAIT_VFALL:; R3 b' f* X; _1 d8 ~
                /*
  @2 j8 {( b4 h- p" d                 * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
$ [* @6 C2 z' a" Y! t                 * RTL seems to mis-handle session "start" otherwise (or in% J7 r- _5 q. k* k" W$ ^
                 * our case "recover"), in routine "VBUS was valid by the time- \  ]1 M) {6 O* p+ U) j. k
                 * VBUSERR got reported during enumeration" cases.
: n9 n7 Y; n/ C- _# J7 {                 */
- u% L" ^: x2 f* D* [% i% q% ?5 p                if (devctl & MUSB_DEVCTL_VBUS) {; ?! @) @+ u! l9 P  L" o
                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
2 M  z* G. }+ a- ^: m% c                        break;) G# M, y+ M; k
                }
6 q# w# r1 p6 F) R  x                musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
3 ]. R& I& k5 Y4 d/ X' Z5 k$ [1 M                musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
1 {  P. Q. D& [/ n4 N; o2 ]                            MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);: g. n0 c! r% e+ D7 U
                break;
7 z. I5 S4 t; ]( e1 t/ K' R  ~+ e8 d! x. M, \( H
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
7 ]' I; j5 b' d5 A, i. u7 X& o不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。* `+ [0 f7 R+ p! ^
        不知道亲们有没有遇到类似的情况,是怎么解决的?
- l8 o3 S. l' |
作者: human    时间: 2016-12-1 22:01
如果4块正常的话,那驱动应该是没问题的,多半是硬件的问题




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