|
|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:" m a& @0 {# X) Y; d
hub 2-0:1.0: over-current condition on port 1
e! b3 x7 J" g% S9 Yda8xx_musb_interrupt 538: VBUS error workaround (delay coming)
% A5 p9 q& d/ b( y我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会( E$ \. ]* F9 t( ]
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
1 Z8 |/ _ y* M$ s$ N: |发现,在da8xx_musb_interrupt函数中,有如下代码:4 z9 \7 r8 x5 D
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {$ A- m, Z1 q5 L+ ^) e& T- Z
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);" y* ?& |% g: W$ r1 I" n; z( w
void __iomem *mregs = musb->mregs;
' K$ V. J! i5 `1 z0 ` u8 devctl = musb_readb(mregs, MUSB_DEVCTL); v, Q6 D" \! U: i3 Y' k
int err;. C y5 C1 S2 g# B+ D; E9 b
# p$ n: D1 F+ l err = is_host_enabled(musb) && (musb->int_usb &2 Z1 _; n( _. n c
MUSB_INTR_VBUSERROR);
9 [" g5 `( [! k& h% g: ` if (err) {
( j% }9 l- `$ F2 P6 | /*5 U+ _: l0 E1 U* e! f5 n
* The Mentor core doesn't debounce VBUS as needed
" `: s- G7 W4 D0 @# N * 。。。- o9 J$ o" Z# F: h# a: [ V) H+ T
*/
4 m4 W* h* T* e/ C musb->int_usb &= ~MUSB_INTR_VBUSERROR;, \# ~/ z2 S: `2 ~7 y1 G1 o) O
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
a2 h# a3 \0 y# [ mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
1 ]9 u# M* Q' ?% s6 J WARNING("VBUS error workaround (delay coming)\n");
# o5 P/ N" u/ t9 h/ }, D0 c' \ }0 M2 K0 n# K3 `" v4 K
4 z6 u& @* j E" I; M3 t- [- y5 e# k一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,( C" \5 ~ ?4 v5 Q2 X5 V+ @: w: i* _
跳入如下分支:
' e. [- v5 I- F0 J- |% edevctl = musb_readb(mregs, MUSB_DEVCTL);
/ D2 _' o8 B, W0 ]) `" |' t。。。
* u* @( S0 J3 ncase OTG_STATE_A_WAIT_VFALL:* g. _; u" {- q9 x6 t
/*
) Z3 r" e7 u0 ^, s" z9 i7 n0 a" _ * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.38 t8 G* J3 S v
* RTL seems to mis-handle session "start" otherwise (or in
0 a0 f" C7 Y0 c% E* I& O* I* ^ * our case "recover"), in routine "VBUS was valid by the time
5 N' P9 j8 E: f5 n' ` * VBUSERR got reported during enumeration" cases.
. i; I q# K, x5 J; m3 r: U$ Y */8 Q8 @6 D& M5 y: f9 f4 C. W
if (devctl & MUSB_DEVCTL_VBUS) {
, T, J' z/ r9 b mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);- q% { v0 c1 h5 D- a e; G
break;
$ m7 a; W% R! z }
- j# [+ S8 J3 P) P8 \2 g' v musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
8 q+ y1 ^4 Q" y: e2 ~ musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
+ |" `- Q9 H! h9 h MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);0 E& {" |7 T+ s! P# b! j2 V
break;. `$ u$ u$ d5 H- ] H7 J8 E o# E
6 _2 ~6 T5 T' @& c0 t/ _! j2 J; E
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
4 P6 R% t q0 M# G8 g+ e- ~$ e不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。0 d# X' S% s% u1 Q9 q
不知道亲们有没有遇到类似的情况,是怎么解决的?
' R$ m2 P6 j$ H5 X- K7 P9 A4 m |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|