关于USB的问题 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3543|回复: 1
打印 上一主题 下一主题

关于USB的问题

[复制链接]

13

主题

41

帖子

1181

积分

金牌会员

Rank: 6Rank: 6

积分
1181
QQ
跳转到指定楼层
楼主
发表于 2016-12-1 09:25:19 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
     小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
. E  L0 M$ O, Z* O& zhub 2-0:1.0: over-current condition on port 1
$ {: [) I) Y1 \da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
! Z3 U5 Y) J$ c: O0 S: n. i我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会- e0 I5 s# H  U# B( U( N: i( e: ~
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,# r2 c7 B" q2 _( s0 z; r
发现,在da8xx_musb_interrupt函数中,有如下代码:
: ]$ d7 M- D: sif (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {7 f: z+ }; W; ^# H/ v$ J
                int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
3 c* J! f: A3 N" A) ~, G. d                void __iomem *mregs = musb->mregs;
  W4 d/ _# m3 U5 W0 ~( Z                u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
$ P2 X$ Z- X# a3 \& e                int err;
8 A; {8 b* w9 h  [- J
$ h  Z. B/ C" U2 l" o: j                err = is_host_enabled(musb) && (musb->int_usb &
# F% k5 S2 K, Z+ l/ N+ ?                                                MUSB_INTR_VBUSERROR);' m& _, L; j, l8 [! D+ a! |
                if (err) {' X# N4 X2 g5 n# w0 d! N7 m
                        /*
: _/ }. u8 ]8 ?" f' X8 i                         * The Mentor core doesn't debounce VBUS as needed
2 m; u. g2 D$ V# G                         * 。。。
- P- f7 q" t( {" j8 O                         */
: _( @2 D9 j: z  ^4 I                        musb->int_usb &= ~MUSB_INTR_VBUSERROR;
* k) b) t0 y2 z5 J4 r5 j                        musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
# i; Q5 U0 O6 Y- X                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);  U, z) P  v# C
                        WARNING("VBUS error workaround (delay coming)\n");
" v/ H1 Q' \. f% @4 S9 G: E, |                }
( V/ e" _% ?; f- C9 ]/ q: l& V, f2 I+ Z& ^* ?" u* z" H4 I
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
3 h% Q" h. H3 ]7 D+ t跳入如下分支:
& A; Q. l. R! d+ B% gdevctl = musb_readb(mregs, MUSB_DEVCTL);
) h1 @6 p" ~  {# _! f! h# M。。。" m7 @6 O4 I& x. L! ?6 d" K, S4 d
case OTG_STATE_A_WAIT_VFALL:7 j* i3 I! V+ T! U& M" H  x
                /*) Y, J; t# l* k4 i: t+ S. W. \8 k
                 * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.36 s9 _( ?. q7 n
                 * RTL seems to mis-handle session "start" otherwise (or in
& M1 k! K5 [3 J9 {/ E: a                 * our case "recover"), in routine "VBUS was valid by the time
8 E) x% ?1 e" }/ Y5 }( R+ E! p                 * VBUSERR got reported during enumeration" cases.' I7 Y4 ~8 l$ N8 F7 t, ]
                 */4 s+ h/ \  ?/ Z+ W4 ~4 j
                if (devctl & MUSB_DEVCTL_VBUS) {
5 F0 W. k- D% e5 t2 b8 C# V                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
2 H" l& F6 R4 a. o                        break;
2 ?* V( d6 \* f) |  N, v2 V$ Y                }
! ?; r. M7 V, e( `                musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
5 }% L, D- Y- U6 d- n+ b& P                musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
2 r( N5 w7 c* {$ A4 w$ C                            MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);( w- Q7 g8 U7 m+ F2 N9 a! \
                break;
  |! T* \; m$ w$ u2 `7 ]: K. O. _2 F0 @$ |+ t/ p, `8 [
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,  l  o0 w( L+ j+ k: F5 f( Z) _" T
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
9 F3 S) s! Z6 l3 W5 q1 L        不知道亲们有没有遇到类似的情况,是怎么解决的?
, l4 R) t2 j4 m3 Y& q

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-5-4 23:26 , Processed in 0.042253 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表