|
小弟最近做了5块板子,用的创龙的核心板,其中4块USB2.0 host都没有问题,只有一块老是周期性报如下错误:( x( M( @. s2 A5 w) h
hub 2-0:1.0: over-current condition on port 1
1 u, [% V- ^& o" S4 oda8xx_musb_interrupt 538: VBUS error workaround (delay coming)- }3 i- R! F9 k3 u* Q7 V% e; V
我的电路图如附件,我用示波器测量过了,开始USB0_DRVVBUS脚起始是低电平,开机瞬间,它会变成高电平,USB0_VBUS也会
* y* e( l9 w" J4 z) V4 u' l8 |随着上升至5V,开机瞬间,USB0_VBUS并没有出现跌落至低于4.4V,从电路上没有发现问题,然后开始追踪linux3.3 USB驱动代码,
- F. l- u' _" v6 o: s6 C( H发现,在da8xx_musb_interrupt函数中,有如下代码:
o$ e' X8 d- ?6 u0 g, |if (status & (DA8XX_INTR_DRVVBUS << DA8XX_INTR_USB_SHIFT)) {
1 c+ [; S/ V# [; G/ _, ] int drvvbus = musb_readl(reg_base, DA8XX_USB_STAT_REG);; e, H$ e1 h. {3 o, t
void __iomem *mregs = musb->mregs;, ~9 N$ X o5 j3 |' C7 E
u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
s! Z3 T( p: }3 }" g1 l int err;
5 }) g/ r s! t! J+ ~
5 Y- E/ s! p2 W: A err = is_host_enabled(musb) && (musb->int_usb &# [% @- u# L! ~8 s
MUSB_INTR_VBUSERROR);, h6 B w0 P5 `7 l( s1 _- d1 j% J
if (err) {
2 z! g. m4 g* L5 a* ?" L /*
4 X( u! t& F: @; }5 g8 C * The Mentor core doesn't debounce VBUS as needed5 m# l H' L/ [' J' K2 j9 v
* 。。。6 U+ r c0 d+ A# r# _6 m. v; M
*/
% W% t. h: K9 p8 [- ]: N" u9 } musb->int_usb &= ~MUSB_INTR_VBUSERROR;1 u2 F1 ~; S2 |; {
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
% G, i9 W3 W N1 ?4 t; J mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);7 P! Q7 c# b% p) H
WARNING("VBUS error workaround (delay coming)\n");
) T0 v9 l( q/ x. V7 e2 z }8 i0 J, ?# s2 Y- ?
# ~0 u, H! a" V0 l一直发生MUSB_INTR_VBUSERROR错误,然后会启动定时器,周期调用otg_timer函数,
: |! Y$ ?8 B. U$ u0 g' J& o跳入如下分支:
4 X8 h2 W9 @: W7 a% Kdevctl = musb_readb(mregs, MUSB_DEVCTL);
1 t9 r' `1 [9 r" J9 y。。。& d* E+ P& ]7 x- h' u- D: _1 @
case OTG_STATE_A_WAIT_VFALL:
8 x& T7 I" d$ @6 F8 N. _ /*% [; `$ P9 b; w
* Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3
, G, Z& o) M: y" y" X% } * RTL seems to mis-handle session "start" otherwise (or in' ]: l- H& l9 `/ }
* our case "recover"), in routine "VBUS was valid by the time
! y- }9 w1 P V% u * VBUSERR got reported during enumeration" cases.4 Z) t2 J" h; m" b
*/1 ~" r1 J2 [% t
if (devctl & MUSB_DEVCTL_VBUS) {
% X4 W+ O5 N2 {* ^ mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
& ^$ M- q3 l1 F( y# N break;
" `9 [6 u+ X; x! E% K8 @5 B }
0 h h1 g/ p9 F9 Y musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
) F t9 @5 o5 j musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,! C0 B4 |! r' m( x8 S3 l
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
( T7 V6 s2 m. O* t) } break;0 N4 w8 Y6 j1 s& C' U! h' W
4 `( q7 h; ]5 w' A' v3 |
其中,devctl是设备控制寄存器,我打印了它的直,是0x80, 也就是位7是1,代表着是B device,,明明是A类,1 z G L( {7 i) D
不知道为啥自动变成B类了。而且VBUS一直是5V,正常的啊,可是驱动也无法修复。。. _. P8 Z% Y5 L2 K7 h, n
不知道亲们有没有遇到类似的情况,是怎么解决的?+ L% C" T# z, z2 j; h! u3 Y
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|