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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于USB的问题

[复制链接]

13

主题

41

帖子

1181

积分

金牌会员

Rank: 6Rank: 6

积分
1181
QQ
跳转到指定楼层
楼主
发表于 2016-12-1 09:25:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:! o; A: K( I8 V+ s3 e! U: H8 ^; f0 Y
hub 2-0:1.0: over-current condition on port 1/ [! ?; Y6 [0 L+ d/ b3 `6 }" x
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)! {! N9 l: j8 n: Y% I
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会, ?) G. x8 [* S# i6 B' v5 C
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
% M# [% n3 I. \9 S1 U$ F发现,在da8xx_musb_interrupt函数中,有如下代码:
# G/ L# V, S" i2 B* Wif (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
. u7 R. z: k8 U6 Y5 y* H                int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);' G7 Y+ T: m% F
                void __iomem *mregs = musb->mregs;8 j! [& H0 d/ n4 a/ W
                u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
/ ?+ Y( J* E0 A/ i                int err;
1 P8 M4 V' L* P9 p) _1 b
# ~# @( {9 o5 }                err = is_host_enabled(musb) && (musb->int_usb &% O* l% q" |8 f, r
                                                MUSB_INTR_VBUSERROR);
( N; M) w3 a# Z; U" D5 _5 T                if (err) {
1 ]' _# S( V& [- j8 s( _# ^                        /*
; {: Q3 E" H* J1 L& G; Y$ q9 R                         * The Mentor core doesn't debounce VBUS as needed
* O5 P. U7 v9 o                         * 。。。
# L5 W6 V8 M0 B8 ?* C" D: F4 \                         */- |, u, Q8 `4 h
                        musb->int_usb &= ~MUSB_INTR_VBUSERROR;
2 a! h5 B8 X4 x; e5 ]                        musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
# b& G3 P, J6 O+ ]7 q' p                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);3 Y7 c: s  S7 A
                        WARNING("VBUS error workaround (delay coming)\n");) V8 A" R9 s$ l' `% D* k1 T5 k
                }2 r0 z7 u2 A8 a9 m/ w$ ]
8 s4 e* I9 |' m3 w6 T+ f7 _! N' w& O
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
; T# y* `& b% r# X  [) u) g$ H跳入如下分支:
+ R1 z9 }0 w; `' {: E, Edevctl = musb_readb(mregs, MUSB_DEVCTL);5 ?# k0 k5 S: G" Z- T3 g( s1 l2 }
。。。
; |8 ~, b7 e+ [) ^+ {$ ]case OTG_STATE_A_WAIT_VFALL:
- ~( o$ Z9 n0 H  M) k( z! Z9 a                /*9 ~1 b3 }& m" s0 D/ O
                 * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
$ z" v8 b2 b% F: f  I                 * RTL seems to mis-handle session "start" otherwise (or in. {3 f+ G+ k) a  S, z- S
                 * our case "recover"), in routine "VBUS was valid by the time2 x3 }" S4 q/ o) |
                 * VBUSERR got reported during enumeration" cases.+ z- W3 a3 i. ?- H
                 */4 h, K0 L* \/ f6 E( d& X) f
                if (devctl & MUSB_DEVCTL_VBUS) {
8 I/ _- n! ]5 o+ T/ b/ \                        mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);* T+ ]+ m2 q: V- ?$ z! X0 |
                        break;
! `9 g+ m; J/ g$ c6 V; n; o                }; d. ~3 q2 y/ G' Z
                musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;$ ~. \$ t8 B; F
                musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,' E& T1 e/ @) |
                            MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
3 s( \  B* C8 [2 }/ t3 f& Z: p                break;3 d" y. i9 g7 B& I+ O" Z8 [: X

) ~0 M# _* l! T& {( K1 {其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
4 i6 R3 v1 L; x( {; \+ o不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。) j% j* w* S1 q# F  @
        不知道亲们有没有遇到类似的情况,是怎么解决的?& h& x2 K- @% j6 m  C

本帖子中包含更多资源

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

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-7 09:00 , Processed in 0.038612 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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