嵌入式开发者社区

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

作者: 378087736    时间: 2016-12-1 09:25
标题: 关于USB的问题
     小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
, c& a$ j- a$ V. X2 G5 g* ?hub 2-0:1.0: over-current condition on port 1
# l7 P! O5 U* C0 dda8xx_musb_interrupt 538: VBUS error workaround (delay coming)/ [2 D% o4 ~0 y7 v" r$ q
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会* P( m  C% D: q; R
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
  t6 p# Y" k$ r8 _9 u+ r; E发现,在da8xx_musb_interrupt函数中,有如下代码:6 E" e8 f$ g8 ~
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
3 }5 O/ g! r( h+ a+ ]: V                int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);2 i4 x' J% v$ ?3 E7 [* {/ }; s( u
                void __iomem *mregs = musb->mregs;5 g2 U- o7 k' J2 y/ G
                u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
  R& y( i8 W  ?4 A" r! N                int err;
) g' \5 v( m5 g1 ~
/ z, I3 G9 _: P& I+ c0 R                err = is_host_enabled(musb) && (musb->int_usb &
$ x# z8 T- J0 D7 @8 R$ y                                                MUSB_INTR_VBUSERROR);. q$ V  |( {2 @+ j/ F3 d
                if (err) {! c% P8 F& n  P: q$ s% R
                        /*
: B/ [) W  P8 ~8 R                         * The Mentor core doesn't debounce VBUS as needed
( ~; N+ M  I6 ~( ]                         * 。。。
1 Q) z& k9 i' f$ O. l                         */
% w$ |2 I& O: @6 w9 {2 m& |5 y( d                        musb->int_usb &= ~MUSB_INTR_VBUSERROR;3 j- \; ?0 O' w& `% e
                        musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
& g6 `' k: y7 v5 ]9 u* {                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);/ Y1 ~0 d8 h. \  B+ W! e4 K
                        WARNING("VBUS error workaround (delay coming)\n");1 w9 y* L9 h9 q% f. M
                }
) E9 F# k: _9 E  ?0 |, \
5 C9 @- A/ P* [0 M9 f# B6 k一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,5 g) h  b- E9 t. _- B2 W4 S
跳入如下分支:
1 q6 G- j- H; T& xdevctl = musb_readb(mregs, MUSB_DEVCTL);! [; c! R5 ~8 |3 |$ A- _0 [7 u: X% N
。。。
4 [& A$ f; M9 x3 ]case OTG_STATE_A_WAIT_VFALL:
' F1 H1 N3 |$ k3 F9 U/ k                /*% `: K+ H' Q0 s4 C) [
                 * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
1 O8 o  x+ h& _7 X& p                 * RTL seems to mis-handle session "start" otherwise (or in9 m5 i' W/ z7 p$ n6 o
                 * our case "recover"), in routine "VBUS was valid by the time
) q7 `+ s6 ^" M+ \                 * VBUSERR got reported during enumeration" cases.7 X8 }. f# `' l7 c
                 */
4 p4 {2 C/ l$ a                if (devctl & MUSB_DEVCTL_VBUS) {
1 N) Q: S3 I) ^5 R4 }                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
! l" G# t7 X& i; M6 o: Y; d                        break;
$ B% C+ X* c+ ~                }- @/ y2 d. |5 [6 c; ^
                musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;& h. N3 a' J. z$ A4 a. F
                musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,; l2 W. a3 p" u8 y% q1 `9 P4 j
                            MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);8 c& b1 Q2 v: b! L" c
                break;
/ i7 w& p2 C" F5 M+ c) }- }
6 q3 ^5 k9 Q5 e* N其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
& |8 M  t" d& c6 n) f( B4 T不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。  ?& A8 P8 r' {
        不知道亲们有没有遇到类似的情况,是怎么解决的?5 g( i% U/ f, T' U# Q

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




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