嵌入式开发者社区

标题: 关于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 12 ^! 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 Sif (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' Zdevctl = 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