|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:7 i* j7 X, Z& w: j% l% N
hub 2-0:1.0: over-current condition on port 1
4 [7 y% C7 k9 p! n- w/ C) f7 V2 Eda8xx_musb_interrupt 538: VBUS error workaround (delay coming)1 S& J& u& @$ I6 T2 ]0 h% Y
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
% q. j d6 @" Z4 j; ~# e# F随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
" }' x0 H7 h8 Q) m发现,在da8xx_musb_interrupt函数中,有如下代码:+ n' i, @% ]$ A/ q5 W
if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {: B" O0 i# l) ~) b) r6 a
int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);/ y4 j) P) e/ s/ j* M% ~
void __iomem *mregs = musb->mregs;
9 `, v3 l1 U" c* n9 C. J3 D u8 devctl = musb_readb(mregs, MUSB_DEVCTL);6 n- S3 m% o% Q3 Q: u0 [
int err;
9 l: f# z/ n7 C5 [: w) M0 G' e
: U- m' K% X% T err = is_host_enabled(musb) && (musb->int_usb &; M, A' `9 W" ]& O- G% d9 L
MUSB_INTR_VBUSERROR);/ U7 ^2 B7 h3 m1 P! o
if (err) {
`+ K* l& X, ?6 ^ /*
8 d( n7 u/ p( f* u f4 |1 e * The Mentor core doesn't debounce VBUS as needed y7 `) x% D( R% {/ J8 K' x+ X
* 。。。 w/ K8 c4 Y$ V+ f# G$ u
*/
- v* \; O- h- O. x# a musb->int_usb &= ~MUSB_INTR_VBUSERROR;
* y- c8 e! n4 s3 D+ D musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
9 r' D! b- N4 m2 {, H/ _. G mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
7 d5 E- k; W | WARNING("VBUS error workaround (delay coming)\n");( y. f% ~9 S% C) y
}2 U% f4 l) T* N ~" X! f" B
+ r2 q8 G* a+ r, a一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,4 u4 B/ g* A# }) k" F X& p
跳入如下分支:: E/ |3 u5 ?3 I3 s+ E
devctl = musb_readb(mregs, MUSB_DEVCTL);+ B: m. P8 L+ [
。。。
! F' V" z) m; g+ c" _' s' E; Rcase OTG_STATE_A_WAIT_VFALL:$ _" a8 k9 m+ n( e
/*) y' r, S1 c5 W- m, h4 M6 z# F$ x
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
& h7 @) D# `3 E" E2 [ * RTL seems to mis-handle session "start" otherwise (or in
* i: d; ]6 n( I' Q! M7 o * our case "recover"), in routine "VBUS was valid by the time9 q, W8 B% z) R- u
* VBUSERR got reported during enumeration" cases.2 Q1 s. a* X( S# G& t
*/
% w, `3 c: L1 [9 @, q if (devctl & MUSB_DEVCTL_VBUS) {
' P" u1 C4 X5 a9 j! g4 @) \5 ~ mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);+ Z% L3 j( x8 n2 F- [& }2 _
break;
, P4 \8 G$ s7 Q! |6 H0 h" D' E }7 V8 ?7 X( O; T9 s: |$ h5 s
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;. U) s: U. [3 Z, U/ L
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
% D8 d0 n+ `8 n, Y MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);6 @9 F1 I/ T7 Z. \4 [3 n
break;
. I- K) u9 O; J4 r2 ?( R0 H
. z/ j9 I1 S9 B% s! }, \2 T其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
& J3 ^2 U6 Z7 a% B" D0 b不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。
0 H) o5 ^" y" r+ [2 C8 h 不知道亲们有没有遇到类似的情况,是怎么解决的?
: W- }. R$ @5 p8 Y3 K |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|