嵌入式开发者社区

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

作者: 378087736    时间: 2016-12-1 09:25
标题: 关于USB的问题
     小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
. W  [4 I, T1 \* yhub 2-0:1.0: over-current condition on port 1
; D$ _2 P- Z' q2 D% A- _% Sda8xx_musb_interrupt 538: VBUS error workaround (delay coming)& N5 T4 M2 F1 A8 j, u) N* {
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
/ a0 h- Q7 `9 y& m# l随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
5 o3 @& T; X' j8 b发现,在da8xx_musb_interrupt函数中,有如下代码:& L3 I  P# M$ O6 u% t
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {5 W+ H# w4 W' d3 ^
                int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);4 F6 T$ o4 A( ]; `% y7 n
                void __iomem *mregs = musb->mregs;
# O  [" `1 ~8 V9 j+ c                u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
+ U' D; u7 _" b8 P* B; H1 g                int err;$ ~( T" O, ~8 \. c: L# k: U+ j7 Q
4 [$ ?8 n8 Z6 s5 J' p$ c! J0 d
                err = is_host_enabled(musb) && (musb->int_usb &
2 K: A# ~' d( F/ K" ]                                                MUSB_INTR_VBUSERROR);; K/ ~& z( b' i* ^" `8 G& X
                if (err) {
4 o% V& T5 |+ T9 P) |                        /*
; }0 [" H! a. B) d6 F! Y                         * The Mentor core doesn't debounce VBUS as needed
9 [& O$ [8 O4 W9 s9 X                         * 。。。2 x. P8 }4 Y& k& C' ^, p& V
                         */
5 X  P3 [7 i( J, z  n5 U                        musb->int_usb &= ~MUSB_INTR_VBUSERROR;$ L7 s6 ^/ R$ V8 Q
                        musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;; y6 ?1 P! o+ A4 x
                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
) T; }: P/ s* r" a2 o& D                        WARNING("VBUS error workaround (delay coming)\n");: C' Y4 ?, U. l+ @3 X5 b
                }  B: I: B1 b' r* z3 `9 o. Y1 R9 Z
3 U' L# q# w- `( {( o/ h
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,2 H. x- ^. c7 T/ a
跳入如下分支:' q4 s4 Y8 q. b6 v. a! p1 U
devctl = musb_readb(mregs, MUSB_DEVCTL);
7 g8 D) b6 l/ N8 J。。。+ e- }% r" I4 K
case OTG_STATE_A_WAIT_VFALL:
1 L9 K2 P2 e/ y& F8 K, Y                /*
) _2 }7 ~$ h  w: d8 {/ p                 * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
3 C; n+ T! d2 `5 W/ h% O                 * RTL seems to mis-handle session "start" otherwise (or in. t) n' b+ K  H( p2 Q7 @
                 * our case "recover"), in routine "VBUS was valid by the time# z: ]0 G% C0 ]: o* x! t. ?6 i( b) u
                 * VBUSERR got reported during enumeration" cases.
0 Y4 ]: s1 m4 L" p3 M# W                 */
& ^) I& _8 b* a+ q, l; _                if (devctl & MUSB_DEVCTL_VBUS) {# x" H+ [5 C/ u
                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);0 Q8 ~9 f- \1 ]4 k# l+ a
                        break;" }0 e7 x4 G+ J
                }: C: l+ [9 W5 r* c
                musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;2 h' r0 t. G7 K  c6 E
                musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,  t- \- J0 P7 p. z/ G  _# ^
                            MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);; ^  K  @3 G0 D( r' P  b- v
                break;* J3 l  s7 v# L0 G; |
3 `1 ?) ]8 R0 b, b" o
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,- d8 Y) v: d7 {$ l9 \8 R
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
! ^, G: L3 b6 w- X        不知道亲们有没有遇到类似的情况,是怎么解决的?
  `) I  r- g: Q! S+ ?* |) _4 p: h
作者: human    时间: 2016-12-1 22:01
如果4块正常的话,那驱动应该是没问题的,多半是硬件的问题




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