|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:. N! ^8 C6 Z" @6 r+ i! f; W
hub 2-0:1.0: over-current condition on port 1
7 d4 v1 c2 s& dda8xx_musb_interrupt 538: VBUS error workaround (delay coming), e5 C/ o! G8 W- Q$ s7 p0 k
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会) M' x( ?) [* f/ m4 e
随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
4 R4 e$ N# x) B! J3 l3 @+ N5 M, O6 `发现,在da8xx_musb_interrupt函数中,有如下代码:
# w9 d, l$ `* K* W$ N% Mif (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
/ v3 j" Q8 a1 c4 M int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);1 |: p! g# X+ [
void __iomem *mregs = musb->mregs;
7 o# p9 v: Y3 E7 Q u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
/ I! p. D7 K3 i0 f5 z int err;. c( g' G8 D, j! k9 I. t
2 U7 c" C9 r, Y0 n err = is_host_enabled(musb) && (musb->int_usb &
' C N5 O6 U' x- k MUSB_INTR_VBUSERROR);
$ t! o# d: q" y( V5 |$ H if (err) {
: ?/ C0 p f% Q# F& | /*
/ D3 H9 J7 q& v2 e$ i4 M * The Mentor core doesn't debounce VBUS as needed
) L; \0 h1 n+ ` * 。。。
; Q' K( @ e3 {% R */7 U8 `1 `+ m8 P/ G
musb->int_usb &= ~MUSB_INTR_VBUSERROR;, K) K, i9 M9 n- e9 ~9 O$ [) {
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
/ L' {( y+ D, F }" D* W/ @7 X mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);& E0 D6 z/ U9 `8 J3 ]9 W4 l
WARNING("VBUS error workaround (delay coming)\n");
9 W" Q V4 J/ T# y ] }% K( h9 d, {$ p* d8 \" f! q
0 t6 z( c* C, I8 C! A1 ^一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,0 r5 T) ~% `" W- g3 V( V
跳入如下分支:, k7 [' L% E B7 o
devctl = musb_readb(mregs, MUSB_DEVCTL);2 @: f+ _5 M; U. O/ ?
。。。 Z+ d6 Z2 m. h7 j
case OTG_STATE_A_WAIT_VFALL:- @) c: {& Y; r; n4 j1 r8 P
/*4 H) |! Q& C1 e, |
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
5 [+ ?/ o! W5 T/ w# Z& d * RTL seems to mis-handle session "start" otherwise (or in4 N8 Z, w4 S/ |5 ]
* our case "recover"), in routine "VBUS was valid by the time
7 k+ x2 W3 W. |+ Q6 a+ i * VBUSERR got reported during enumeration" cases.
4 Y8 @. z& B' v9 z */
8 x) M i+ h t8 j, R3 H$ D if (devctl & MUSB_DEVCTL_VBUS) {
F$ o# Y' P& M) N: P) v3 u9 z4 P mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
/ A/ ~9 K, S' P2 i" l- }! ] break;
! I6 T! I" [ r* Q" s9 _ }( b E+ ]) j( s6 z0 S: T
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
; Z9 k1 T8 Y6 I& l! @9 l musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,' a' @- v* d. L1 F6 h2 U. g
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
/ e6 b( L: s: ~3 k, u0 G break;, Y+ _; j q* _8 J
" y) |' _, F3 E' |* b4 h% ~其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,6 Q4 Q3 ^- I+ z/ c* h+ p0 n7 s8 k( Q
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。3 C, i' f5 A l. T" P
不知道亲们有没有遇到类似的情况,是怎么解决的?6 z3 \3 w8 ^$ I* Z; z
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|