嵌入式开发者社区

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

作者: 378087736    时间: 2016-12-1 09:25
标题: 关于USB的问题
     小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:2 K1 l! w- w* O2 ~7 k# ~* V! [1 o
hub 2-0:1.0: over-current condition on port 1* s2 q5 e0 V- ]5 T) _
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)6 }" J; t8 x1 k; Z1 Z6 f5 s9 i* X3 a
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
& v/ `& u( O9 `随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,) F0 X) S, ]4 s5 d" \
发现,在da8xx_musb_interrupt函数中,有如下代码:+ u* q/ y) E: n4 u, G% s6 ?7 d. ?, O6 a
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
& ]+ k) f" B4 A# C* R# ^, E                int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);- n) D% U3 ]$ I5 m
                void __iomem *mregs = musb->mregs;
/ S4 n, A1 j) Y  t                u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
2 O/ `7 H2 z  H* Z                int err;' T2 X6 ]6 x8 B; M  R- ?

) F( F5 K. E9 e9 e7 `1 K                err = is_host_enabled(musb) && (musb->int_usb &% `! d8 ^$ x4 D. T. E: R
                                                MUSB_INTR_VBUSERROR);
! a! x# q/ ~2 {+ q                if (err) {
/ K. r. O# P9 z8 U) c- ]                        /*
' P( G0 b2 X9 {5 ]+ h% j                         * The Mentor core doesn't debounce VBUS as needed
: }+ P& ~, ~. U' z                         * 。。。
; _$ U! ?  b& c8 w2 `: r                         */
3 s; p: i4 [: M0 O& |7 k* \                        musb->int_usb &= ~MUSB_INTR_VBUSERROR;* M2 g6 }' I$ v; ?
                        musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;6 Q" @: W6 O1 h. B. @; P
                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);! F1 n5 h& y: ]# D- i
                        WARNING("VBUS error workaround (delay coming)\n");
& L9 `  @  j8 _9 n+ ~$ x  |                }
% H7 u& n/ Z, i% t0 w, L6 `
. m" b; T4 _# o: c, _一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,8 q5 O- k0 A1 m+ W. L" k9 u
跳入如下分支:
, s* U0 d. k, U- G( Xdevctl = musb_readb(mregs, MUSB_DEVCTL);* [- A- h, c1 q4 m$ k! Q' x
。。。
8 I3 F0 a4 q( Bcase OTG_STATE_A_WAIT_VFALL:, D$ {+ E$ a, Z* [
                /*
1 I) u6 T4 ^1 R) d$ M                 * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
' S) V8 H! k' v' c* b$ l                 * RTL seems to mis-handle session "start" otherwise (or in( }  Q! {2 L" o" ~/ I6 [3 U3 L
                 * our case "recover"), in routine "VBUS was valid by the time
5 ^! ?5 l6 K! N- A9 J9 p  C& b                 * VBUSERR got reported during enumeration" cases.; t( y$ ^7 M. ~5 t9 z
                 */! p" W3 f* E' x; p# I8 r4 ]$ j8 `
                if (devctl & MUSB_DEVCTL_VBUS) {
7 q) \- {% c5 e3 e  f5 W+ V: ]                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);2 r1 `3 b6 ]3 L' _2 B, {0 \$ X, J
                        break;5 B+ T: ]4 V# H4 G6 V) w' x
                }
( ^! D! ]# t% |                musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;. p* L2 F) _. T6 ]/ ?
                musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,/ Y$ o$ R' [2 M! o
                            MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);- H+ a% k" U; ~$ p0 I
                break;
" @% F( F0 E( {! q8 w, ~+ z* o' Y5 c; d; u) b+ r
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,0 f: g' ]8 k( V3 g9 y* t( q* k% h
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
4 T, M; @6 h( I/ G) w        不知道亲们有没有遇到类似的情况,是怎么解决的?! F( _1 s5 `; m

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




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