嵌入式开发者社区
标题:
关于USB的问题
[打印本页]
作者:
378087736
时间:
2016-12-1 09:25
标题:
关于USB的问题
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
3 L r% u& q. @. D7 C
hub 2-0:1.0: over-current condition on port 1
4 Q X. @$ d4 e2 ?$ f, V) [
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
' {7 z/ w* B$ E, u
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
- \: O: t* o" ^! l2 W2 s9 m
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
" _+ s$ I: B/ |6 w9 U3 T
发现,在da8xx_musb_interrupt函数中,有如下代码:
1 [ b; J2 z; F0 y: [
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
7 d2 h& y2 p7 ]$ N# M. h
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
) r R* r; E3 @ \" n& B2 K2 d# i
void __iomem *mregs = musb->mregs;
3 @5 u9 n+ d I, a; o
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
; c/ _5 u7 F* K! H& f' l: F
int err;
: V, M+ }$ V8 C, r' W: ~% G
- d" ?! D& p" |: S y7 s( e; x9 [9 Q
err = is_host_enabled(musb) && (musb->int_usb &
7 R7 j' @: O! R, [" v& J
MUSB_INTR_VBUSERROR);
& W4 ~8 h3 d& ^: ]; q* J* k
if (err) {
4 }# w" l$ t$ y: X
/*
* S7 }; D% }! r$ O
* The Mentor core doesn't debounce VBUS as needed
+ r( ?9 _/ Y$ y: |
* 。。。
$ }* O# Y9 ]; T. I1 \
*/
4 j4 D0 g0 `) ?8 Q$ c+ R5 Y! f
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
3 g I8 e4 ^# T( ]
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
) z9 L8 c# |3 J& |
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
7 R: q2 ~: E4 e- M
WARNING("VBUS error workaround (delay coming)\n");
% q( r6 V1 w0 K. ^9 m4 @
}
; @3 u# i3 {3 S3 A
. ~' e8 s( J7 C
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
/ `; }' w& S8 _ @. N' \/ c; @0 J
跳入如下分支:
) U/ j5 H& v# d4 W! [
devctl = musb_readb(mregs, MUSB_DEVCTL);
+ j7 T* |! ^& O5 v8 X4 L3 x! p
。。。
* f7 y- J( s. z2 b, ^2 z5 ?( A$ Q( g8 x
case OTG_STATE_A_WAIT_VFALL:
; R3 b' f* X; _1 d8 ~
/*
@2 j8 {( b4 h- p" d
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
$ [* @6 C2 z' a" Y! t
* RTL seems to mis-handle session "start" otherwise (or in
% J7 r- _5 q. k* k" W$ ^
* our case "recover"), in routine "VBUS was valid by the time
- \ ]1 M) {6 O* p+ U) j. k
* VBUSERR got reported during enumeration" cases.
: n9 n7 Y; n/ C- _# J7 {
*/
- u% L" ^: x2 f* D* [% i% q% ?5 p
if (devctl & MUSB_DEVCTL_VBUS) {
; ?! @) @+ u! l9 P L" o
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
2 M z* G. }+ a- ^: m% c
break;
) G# M, y+ M; k
}
6 q# w# r1 p6 F) R x
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
3 ]. R& I& k5 Y4 d/ X' Z5 k$ [1 M
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
1 { P. Q. D& [/ n4 N; o2 ]
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
: g. n0 c! r% e+ D7 U
break;
7 z. I5 S4 t; ]( e1 t/ K' R
~+ e8 d! x. M, \( H
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
7 ]' I; j5 b' d5 A, i. u7 X& o
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
* `+ [0 f7 R+ p! ^
不知道亲们有没有遇到类似的情况,是怎么解决的?
- l8 o3 S. l' |
作者:
human
时间:
2016-12-1 22:01
如果4块正常的话,那驱动应该是没问题的,多半是硬件的问题
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4