ep = container_of(_ep, dwc_otg_pcd_ep_t, ep);
request_done(ep, req, -ECONNABORTED);
DWC_PRINT("%s::ep %s req not empty,done it error!\n" , __func__, _ep->name);
- return -EINVAL;
}
+ return -EINVAL;
}
ep = container_of(_ep, dwc_otg_pcd_ep_t, ep);
return 0;
}
+static int dwc_otg_pcd_pullup(struct usb_gadget *_gadget, int is_on)
+{
+ unsigned long flags;
+ dwc_otg_pcd_t *pcd;
+ dctl_data_t dctl = {.d32=0};
+ dwc_otg_core_if_t *core_if;
+ DWC_DEBUGPL(DBG_PCDV,"%s(%p)\n", __func__, _gadget);
+
+ if (_gadget == 0)
+ {
+ return -ENODEV;
+ }
+ else
+ {
+ pcd = container_of(_gadget, dwc_otg_pcd_t, gadget);
+ core_if = GET_CORE_IF(pcd);
+ }
+ if(is_on) //connect
+ {
+ dctl.d32 = dwc_read_reg32( &core_if->dev_if->dev_global_regs->dctl );
+ dctl.b.sftdiscon = 0;
+ dwc_write_reg32( &core_if->dev_if->dev_global_regs->dctl, dctl.d32 );
+ }
+ else //disconnect
+ {
+ dctl.d32 = dwc_read_reg32( &core_if->dev_if->dev_global_regs->dctl );
+ dctl.b.sftdiscon = 1;
+ dwc_write_reg32( &core_if->dev_if->dev_global_regs->dctl, dctl.d32 );
+ }
+}
+
static const struct usb_gadget_ops dwc_otg_pcd_ops =
{
.get_frame = dwc_otg_pcd_get_frame,
.wakeup = dwc_otg_pcd_wakeup,
+ .pullup = dwc_otg_pcd_pullup,
// current versions must always be self-powered
};
core_if = GET_CORE_IF(pcd);
gctrl.d32 = dwc_read_reg32( &core_if->core_global_regs->gotgctl );
if( gctrl.b.bsesvld ) {
- dwc_otg_msc_lock(pcd);
pcd->conn_status++;
dwc_pcd_reset(pcd);
/*
if( gctrl.b.bsesvld ) {
/* if usb not connect before ,then start connect */
if( _pcd->vbus_status == 0 ) {
+ dwc_otg_msc_lock(_pcd);
DWC_PRINT("********vbus detect*********************************************\n");
- _pcd->vbus_status = 1;
- /* soft disconnect */
- dctl.d32 = dwc_read_reg32( &core_if->dev_if->dev_global_regs->dctl );
- dctl.b.sftdiscon = 1;
- dwc_write_reg32( &core_if->dev_if->dev_global_regs->dctl, dctl.d32 );
- /* Clear any pending interrupts */
- dwc_write_reg32( &core_if->core_global_regs->gintsts, 0xFFFFFFFF);
- if(_pcd->conn_en)
- {
- schedule_delayed_work( &_pcd->reconnect , 8 ); /* delay 1 jiffies */
- _pcd->check_vbus_timer.expires = jiffies + (HZ<<1); /* 1 s */
- }
+ _pcd->vbus_status = 1;
+ /* soft disconnect */
+ dctl.d32 = dwc_read_reg32( &core_if->dev_if->dev_global_regs->dctl );
+ dctl.b.sftdiscon = 1;
+ dwc_write_reg32( &core_if->dev_if->dev_global_regs->dctl, dctl.d32 );
+ /* Clear any pending interrupts */
+ dwc_write_reg32( &core_if->core_global_regs->gintsts, 0xFFFFFFFF);
+ if(_pcd->conn_en)
+ {
+ schedule_delayed_work( &_pcd->reconnect , 8 ); /* delay 1 jiffies */
+ _pcd->check_vbus_timer.expires = jiffies + (HZ<<1); /* 1 s */
+ }
} else if((_pcd->conn_status>0)&&(_pcd->conn_status <3)) {
- dwc_otg_msc_unlock(_pcd);
+ //dwc_otg_msc_unlock(_pcd);
DWC_PRINT("********soft reconnect******************************************\n");
- _pcd->vbus_status =0;
+ //_pcd->vbus_status =0;
/* soft disconnect */
dctl.d32 = dwc_read_reg32( &core_if->dev_if->dev_global_regs->dctl );
dwc_write_reg32( &core_if->dev_if->dev_global_regs->dctl, dctl.d32 );
/* Clear any pending interrupts */
dwc_write_reg32( &core_if->core_global_regs->gintsts, 0xFFFFFFFF);
+ if(_pcd->conn_en)
+ {
+ schedule_delayed_work( &_pcd->reconnect , 8 ); /* delay 1 jiffies */
+ _pcd->check_vbus_timer.expires = jiffies + (HZ<<1); /* 1 s */
+ }
}
else if((_pcd->conn_en)&&(_pcd->conn_status == 0))
{
* when receive reset int,the vbus state may not be update,so
* always start timer here.
*/
- mod_timer( vbus_timer , jiffies + (HZ<<2));
+ mod_timer( vbus_timer , jiffies + (HZ));
}
/*