嵌入式开发者社区

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

作者: 378087736    时间: 2016-12-1 09:25
标题: 关于USB的问题
     小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
' j, I3 r, \6 h% U' yhub 2-0:1.0: over-current condition on port 1
; L( |4 A6 \& |8 c; Q$ c3 G" Dda8xx_musb_interrupt 538: VBUS error workaround (delay coming)
2 x/ c# A# L( Q( _8 X* e. v, S我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会' D$ N7 A$ m3 y' f6 F6 a0 g2 ~9 z
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,9 K6 p- J+ J6 t: o- N3 E9 A% A& C
发现,在da8xx_musb_interrupt函数中,有如下代码:
3 @  r& [, z( \if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {4 C( i" d# O0 y6 k9 m3 |
                int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);) x4 m% I6 \3 I
                void __iomem *mregs = musb->mregs;
  ~1 h- `# @- X1 c  p0 s                u8 devctl = musb_readb(mregs, MUSB_DEVCTL);3 Z+ K1 @4 {0 \2 t; m1 L3 s
                int err;
: K8 J2 {! V: d" F1 {
/ d1 L* O2 |1 N# e( ]                err = is_host_enabled(musb) && (musb->int_usb &
7 z) x5 O. z7 ~                                                MUSB_INTR_VBUSERROR);: d* a! G+ l' c7 |, N
                if (err) {$ m# F% S1 S& m& v' b
                        /*$ @5 Y/ [) Y6 s2 L( T( V% ~
                         * The Mentor core doesn't debounce VBUS as needed
$ L  Y+ |1 ?9 L                         * 。。。
; @9 y5 t. t$ D* e& j& \& T                         */) {# M4 U9 C5 ]; ~' ?. e3 V" f
                        musb->int_usb &= ~MUSB_INTR_VBUSERROR;- O3 h' N4 r  x: R$ \* O$ t
                        musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;2 B6 J( s) E1 p
                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);. ]  F5 d1 C% S! `$ }# z
                        WARNING("VBUS error workaround (delay coming)\n");
1 L, t9 n" E1 L/ g                }$ m& u* L- r" h

; L' v1 X7 O* q0 b一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,1 ]& F5 `" k# i2 T4 Z" e9 d
跳入如下分支:$ p: \3 Y2 F  `
devctl = musb_readb(mregs, MUSB_DEVCTL);, R' c8 P+ \5 b/ J7 k0 z
。。。
2 f6 N8 l! ~& b2 T% m) ?case OTG_STATE_A_WAIT_VFALL:. J. }) K+ h- F: Y
                /*
4 \1 Y  [) ~! }$ M+ {9 N: t                 * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
, U: w/ ~' l- p  Z1 q9 N! u                 * RTL seems to mis-handle session "start" otherwise (or in
1 y- ^! Z9 q' A5 \: Y                 * our case "recover"), in routine "VBUS was valid by the time) L" r" w; P5 w) ~5 b4 U5 @
                 * VBUSERR got reported during enumeration" cases.' B. X- b8 ^) k0 S+ d# r7 F
                 */
" I- o9 Z1 k; B                if (devctl & MUSB_DEVCTL_VBUS) {
$ B1 x( w  b0 S- P& S  b, i( P                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
. }! P$ T  p- ^# h# }3 h7 |4 y                        break;
1 U3 p/ j, q4 a& O: i! ?" u                }: F+ I" G3 B) a  ^0 M5 E' s9 Y
                musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;0 A5 ~- r# P/ T7 ^! M% \+ i9 s2 T$ v1 u
                musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,/ l5 p2 N0 m) \/ B( F* w2 w2 I* u
                            MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
8 q( @/ _4 C# o$ s* l8 H9 _                break;. a1 n: i2 r& k( R

, r& h6 N: ?+ e5 m; d其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
$ r2 Z+ |( l! i+ V+ d不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
/ R: u/ W- k0 p; M        不知道亲们有没有遇到类似的情况,是怎么解决的?1 ~8 t  p! V" {; ^

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




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