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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于USB的问题

[复制链接]

13

主题

41

帖子

1181

积分

金牌会员

Rank: 6Rank: 6

积分
1181
QQ
跳转到指定楼层
楼主
发表于 2016-12-1 09:25:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:( x( M( @. s2 A5 w) h
hub 2-0:1.0: over-current condition on port 1
1 u, [% V- ^& o" S4 oda8xx_musb_interrupt 538: VBUS error workaround (delay coming)- }3 i- R! F9 k3 u* Q7 V% e; V
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
* y* e( l9 w" J4 z) V4 u' l8 |随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
- F. l- u' _" v6 o: s6 C( H发现,在da8xx_musb_interrupt函数中,有如下代码:
  o$ e' X8 d- ?6 u0 g, |if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
1 c+ [; S/ V# [; G/ _, ]                int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);; e, H$ e1 h. {3 o, t
                void __iomem *mregs = musb->mregs;, ~9 N$ X  o5 j3 |' C7 E
                u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
  s! Z3 T( p: }3 }" g1 l                int err;
5 }) g/ r  s! t! J+ ~
5 Y- E/ s! p2 W: A                err = is_host_enabled(musb) && (musb->int_usb &# [% @- u# L! ~8 s
                                                MUSB_INTR_VBUSERROR);, h6 B  w0 P5 `7 l( s1 _- d1 j% J
                if (err) {
2 z! g. m4 g* L5 a* ?" L                        /*
4 X( u! t& F: @; }5 g8 C                         * The Mentor core doesn't debounce VBUS as needed5 m# l  H' L/ [' J' K2 j9 v
                         * 。。。6 U+ r  c0 d+ A# r# _6 m. v; M
                         */
% W% t. h: K9 p8 [- ]: N" u9 }                        musb->int_usb &= ~MUSB_INTR_VBUSERROR;1 u2 F1 ~; S2 |; {
                        musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
% G, i9 W3 W  N1 ?4 t; J                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);7 P! Q7 c# b% p) H
                        WARNING("VBUS error workaround (delay coming)\n");
) T0 v9 l( q/ x. V7 e2 z                }8 i0 J, ?# s2 Y- ?

# ~0 u, H! a" V0 l一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
: |! Y$ ?8 B. U$ u0 g' J& o跳入如下分支:
4 X8 h2 W9 @: W7 a% Kdevctl = musb_readb(mregs, MUSB_DEVCTL);
1 t9 r' `1 [9 r" J9 y。。。& d* E+ P& ]7 x- h' u- D: _1 @
case OTG_STATE_A_WAIT_VFALL:
8 x& T7 I" d$ @6 F8 N. _                /*% [; `$ P9 b; w
                 * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
, G, Z& o) M: y" y" X% }                 * RTL seems to mis-handle session "start" otherwise (or in' ]: l- H& l9 `/ }
                 * our case "recover"), in routine "VBUS was valid by the time
! y- }9 w1 P  V% u                 * VBUSERR got reported during enumeration" cases.4 Z) t2 J" h; m" b
                 */1 ~" r1 J2 [% t
                if (devctl & MUSB_DEVCTL_VBUS) {
% X4 W+ O5 N2 {* ^                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
& ^$ M- q3 l1 F( y# N                        break;
" `9 [6 u+ X; x! E% K8 @5 B                }
0 h  h1 g/ p9 F9 Y                musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
) F  t9 @5 o5 j                musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,! C0 B4 |! r' m( x8 S3 l
                            MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
( T7 V6 s2 m. O* t) }                break;0 N4 w8 Y6 j1 s& C' U! h' W
4 `( q7 h; ]5 w' A' v3 |
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,1 z  G  L( {7 i) D
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。. _. P8 Z% Y5 L2 K7 h, n
        不知道亲们有没有遇到类似的情况,是怎么解决的?+ L% C" T# z, z2 j; h! u3 Y

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2016-12-1 22:01:12 | 只看该作者
如果4块正常的话,那驱动应该是没问题的,多半是硬件的问题
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 10:26 , Processed in 0.040229 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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