嵌入式开发者社区
标题:
关于USB的问题
[打印本页]
作者:
378087736
时间:
2016-12-1 09:25
标题:
关于USB的问题
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
8 e* Z; M6 ^% g" d
hub 2-0:1.0: over-current condition on port 1
7 g' p& H7 z! U
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
4 ~$ h2 V; k m+ }; L( W
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
; G( v9 v* P# z# J' n* V
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
- t8 ]. y! H9 t
发现,在da8xx_musb_interrupt函数中,有如下代码:
/ k, y2 E+ }( [/ A: ]2 b
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
2 t, g$ q5 o8 F" U D4 R' Y# q4 N
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
' q9 N$ \" U, I% `) Y& u8 l
void __iomem *mregs = musb->mregs;
9 g# U! c( n5 [2 X1 o( x
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
6 q* z) t6 u2 o3 ]
int err;
0 X% O' |4 i! I- _/ z
& S0 p1 z/ W5 Q3 }( P
err = is_host_enabled(musb) && (musb->int_usb &
% T, b; [7 ^! k8 L' f# u$ C
MUSB_INTR_VBUSERROR);
/ K% B+ o8 t: k8 T6 |
if (err) {
9 V( {2 G c) o1 d2 q5 c
/*
4 y! b. f( W6 A9 Z( I4 _
* The Mentor core doesn't debounce VBUS as needed
. E1 n9 F$ R% z6 Q1 U
* 。。。
* `3 m2 `3 j1 t0 I
*/
- `* C; `# j0 t0 U4 Q9 l( q9 k
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
" |) L+ R/ g) @
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
8 R; ]) h. |9 ~; B/ h% g0 e7 p
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
F7 E8 G; y! w6 u, W" ]5 s
WARNING("VBUS error workaround (delay coming)\n");
4 @' ]' e$ E+ M+ E8 B# Q5 o
}
! b* y7 v, I4 A1 E6 k
, T; q; l6 ~- L) L) Q5 ?& O% S. u
一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
. h5 q% C2 D- [; a3 E
跳入如下分支:
% D; v; N* ]* w6 Y6 v z- e
devctl = musb_readb(mregs, MUSB_DEVCTL);
. l: q3 c4 y; \# y5 e
。。。
" b/ l! _. b" ?
case OTG_STATE_A_WAIT_VFALL:
$ u. a5 o8 W5 y- O( [; X5 r/ q5 ~+ K
/*
5 l- m- F- F% p( g' c5 x7 p" i
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
" `: E R8 [$ w( E( Q
* RTL seems to mis-handle session "start" otherwise (or in
2 P" x. Z1 C, C& o7 h0 Y
* our case "recover"), in routine "VBUS was valid by the time
N1 A2 F1 D+ Q/ C1 w. Z
* VBUSERR got reported during enumeration" cases.
9 Z. ?2 E8 P- L+ v z6 F
*/
E ?) D/ Q+ b5 d
if (devctl & MUSB_DEVCTL_VBUS) {
% @6 W+ w" K: c# c5 ^! t/ `( V
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
; h# A( p) Y8 Z* W8 I5 ]3 s
break;
/ @5 n7 a/ V0 d. O
}
% P0 f! o, W* X+ X2 q: T9 g" }. }
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
; x$ C' D p: o3 T: r. i) N
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
6 `( P) _3 }5 E T% R# J
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
9 E7 k! r- C1 t9 b; X0 {
break;
1 a. o' D; e! l- S' G
1 `9 w3 N0 x3 g; U7 E) @* F: o
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
% s, x, y( M$ v, ?* N/ w5 N, @/ X- T
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
9 w! K6 A+ D% L- N1 @
不知道亲们有没有遇到类似的情况,是怎么解决的?
$ o7 F8 R: U c- C; D/ p
作者:
human
时间:
2016-12-1 22:01
如果4块正常的话,那驱动应该是没问题的,多半是硬件的问题
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4