|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:
! \* g1 r- Q: b+ Thub 2-0:1.0: over-current condition on port 12 m0 i. K# A& D' A3 ?' u, Q
da8xx_musb_interrupt 538: VBUS error workaround (delay coming)
$ q- E; g# `: L; y' h/ c, y我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会* |& ]! ^- }" V+ A# Y/ k& y: S
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
: c* V7 w# j4 D& y2 F9 Q. {. @! f发现,在da8xx_musb_interrupt函数中,有如下代码:
; G( J! j# k7 m, w: z6 ?! U, S Z+ Q t4 |if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
) `5 R6 S: F# Q' h' E int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);
% |. }: G+ h/ u, S void __iomem *mregs = musb->mregs;. @1 J' K& p' k! I, ~+ ]% `
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);) m* p$ X! x3 s" x3 B7 i
int err;
7 o- ~6 } m( U% Z. G" o8 h3 r- Y
err = is_host_enabled(musb) && (musb->int_usb &
8 P& @' I9 T; ]+ c- M MUSB_INTR_VBUSERROR);
4 @, w8 `! w& ?9 ^ if (err) {
. Z7 a0 I8 L/ i$ s- } /*
8 Z6 T5 r/ I: f2 W( T j$ e# Z ]& {7 v * The Mentor core doesn't debounce VBUS as needed
' X* l0 w- s1 t4 n- m * 。。。
) }4 Y \$ q$ L `+ q* m7 { */
% n4 m* E, M y: J: h- N musb->int_usb &= ~MUSB_INTR_VBUSERROR;! K7 ?$ Y% d, @8 z6 w9 Q" q( f# F
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
' v: h5 g. ]% P' a mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);8 H1 _5 a/ ]' Y' |, Y4 |
WARNING("VBUS error workaround (delay coming)\n");
5 Q7 \: E. b; t* d& w* c% _: U }
5 z4 f3 ^+ H8 t# ?$ ]+ @
. I/ i w) C, C6 F+ Y# `一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
+ f9 J" M/ U9 C; K跳入如下分支:, }. t7 y d- E0 W% g4 _7 G
devctl = musb_readb(mregs, MUSB_DEVCTL);) t# b& g1 S% `+ \
。。。6 }, b! W! m% T* k
case OTG_STATE_A_WAIT_VFALL:8 f8 T A2 R5 t! ^* ?) A& ?
/*
V- u! G# C' M' h! S * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
) h1 L$ b( N" p. }- v# n * RTL seems to mis-handle session "start" otherwise (or in
1 G+ b1 o& J h) s |) i' }/ x * our case "recover"), in routine "VBUS was valid by the time' x3 ~7 z2 y% u- O
* VBUSERR got reported during enumeration" cases.
5 c0 B1 W1 m: [' O8 d1 J */
, W" r# F7 V: n) d# ~ if (devctl & MUSB_DEVCTL_VBUS) {' o6 \( o$ D0 P- ^# F$ W
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
+ V+ h# Q6 c2 M% d$ ~7 [ break;/ A3 V9 Q2 i" Z. N5 d: E) E' x
}( H& }% }1 P. {) c5 ~3 ~
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
3 G- _. g# K: [1 r- V2 H/ y musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,5 T) i) \# i3 p: P# ]
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
$ ^* W, L! E3 K" j: h break;; x, b `9 |) L- _+ U
, I7 F9 E- T8 ^' d其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,
8 J7 f# c$ {" `! `; v不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。( q2 f* U, y. M
不知道亲们有没有遇到类似的情况,是怎么解决的?
- G" @1 r \6 B |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|