Kinetis:USB-FS driver

Removed the notion of attached. The khci_usbattach is call early in
   the init either in board_initalize or in board_app_initalize. In
   either case it is always done prior to the the class register.
   Therefore the khci_usbattach call only set a flag, and that
   flag is only tested in the class register. The class register will
   enable the soft connect pull up.
This commit is contained in:
David Sidrane 2017-06-06 13:18:41 -10:00
parent 182259921f
commit 36da2b91c5
2 changed files with 22 additions and 153 deletions

View File

@ -493,7 +493,6 @@ struct khci_usbdev_s
uint8_t ctrlstate; /* Control EP state (see enum khci_ctrlstate_e) */
uint8_t selfpowered:1; /* 1: Device is self powered */
uint8_t rwakeup:1; /* 1: Device supports remote wakeup */
uint8_t attached:1; /* Device is attached to the host */
uint8_t ep0done:1; /* EP0 OUT already prepared */
uint8_t rxbusy:1; /* EP0 OUT data transfer in progress */
uint16_t epavail; /* Bitset of available endpoints */
@ -618,9 +617,6 @@ static int khci_selfpowered(struct usbdev_s *dev, bool selfpowered);
static void khci_reset(struct khci_usbdev_s *priv);
static void khci_attach(struct khci_usbdev_s *priv);
#if defined(CONFIG_USBDEV_SELFPOWERED)
static void khci_detach(struct khci_usbdev_s *priv);
#endif
static void khci_swreset(struct khci_usbdev_s *priv);
static void khci_hwreset(struct khci_usbdev_s *priv);
static void khci_swinitalize(struct khci_usbdev_s *priv);
@ -2778,6 +2774,7 @@ static int khci_interrupt(int irq, void *context, FAR void *arg)
if (priv->devstate == DEVSTATE_ATTACHED)
{
/* Now were are in the powered state */
priv->devstate = DEVSTATE_POWERED;
@ -2999,7 +2996,6 @@ static void khci_suspend(struct khci_usbdev_s *priv)
regval = khci_getreg(KINETIS_USB0_USBCTRL);
regval |= USB_USBCTRL_SUSP;
khci_putreg(regval, KINETIS_USB0_USBCTRL);
}
/****************************************************************************
@ -3145,6 +3141,7 @@ khci_epreserved(struct khci_usbdev_s *priv, int epno)
/****************************************************************************
* Name: khci_ep0configure
****************************************************************************/
static void khci_ep0configure(struct khci_usbdev_s *priv)
{
volatile struct usbotg_bdtentry_s *bdt;
@ -3959,9 +3956,8 @@ static int khci_selfpowered(struct usbdev_s *dev, bool selfpowered)
* Name: khci_reset
*
* Description:
* Reset the software and hardware states. If the USB controller has been
* attached to a host, then connect to the bus as well. At the end of
* this reset, the hardware should be in the full up, ready-to-run state.
* Reset the software and hardware states. At the end of this reset, the
* hardware should be in the full up, ready-to-run state.
*
****************************************************************************/
@ -3975,18 +3971,9 @@ static void khci_reset(struct khci_usbdev_s *priv)
khci_hwreset(priv);
/* khci_attach() was called, then the attach flag will be set and we
* should also attach to the USB bus.
*/
if (priv->attached)
{
/* usbdev_attach() has already been called.. attach to the bus
* now
*/
/* Do the final hw attach */
khci_attach(priv);
}
}
/****************************************************************************
@ -4072,62 +4059,9 @@ static void khci_attach(struct khci_usbdev_s *priv)
/* Enable USB interrupts at the interrupt controller */
up_enable_irq(KINETIS_IRQ_USBOTG);
}
}
#if defined(CONFIG_USBDEV_SELFPOWERED)
/****************************************************************************
* Name: khci_detach
****************************************************************************/
static void khci_detach(struct khci_usbdev_s *priv)
{
#ifdef CONFIG_USBOTG
uint32_t regval;
#endif
/* Disable USB interrupts at the interrupt controller */
up_disable_irq(KINETIS_IRQ_USBOTG);
/* Disable the USB controller and detach from the bus. */
khci_putreg(0, KINETIS_USB0_CTL);
/* Mask all USB interrupts */
khci_putreg(0, KINETIS_USB0_INTEN);
/* We are now in the detached state */
priv->attached = 0;
priv->devstate = DEVSTATE_DETACHED;
#ifdef CONFIG_USBOTG
/* Disable the D+ Pullup */
regval = khci_getreg(KINETIS_USB0_OTGCTL);
regval &= ~USBOTG_CON_DPPULUP;
khci_putreg(regval, KINETIS_USB0_OTGCTL);
/* Disable and deactivate HNP */
#warning Missing Logic
/* Check if the ID Pin Changed State */
if ((khci_getreg(KINETIS_USB0_ISTAT) & khci_getreg(KINETIS_USB0_OTGICR) & USBOTG_INT_ID) != 0)
{
/* Re-detect & Initialize */
#warning "Missing logic"
/* Clear ID Interrupt Flag */
khci_putreg(USBOTG_INT_ID, KINETIS_USB0_ISTAT);
}
#endif
}
#endif
/****************************************************************************
* Name: khci_swreset
****************************************************************************/
@ -4306,12 +4240,6 @@ static void khci_swinitalize(struct khci_usbdev_s *priv)
priv->epavail = KHCI_ENDP_ALLSET & ~KHCI_ENDP_BIT(EP0);
priv->rwakeup = 1;
#if defined(CONFIG_USBDEV_BUSPOWERED)
/* Since this code is running we are physically attached to power */
priv->attached = 1;
#endif
/* Initialize the watchdog timer that is used to perform a delayed
* queue restart after recovering from a stall.
*/
@ -4570,10 +4498,7 @@ int usbdev_register(struct usbdevclass_driver_s *driver)
else
{
/* Setup the USB controller in it initial ready-to-run state (might
* be connected or unconnected, depending on usbdev_attach() has
* been called).
*/
/* Setup the USB controller in it initial ready-to-run state */
DEBUGASSERT(priv->devstate == DEVSTATE_DETACHED);
khci_reset(priv);
@ -4642,56 +4567,4 @@ int usbdev_unregister(struct usbdevclass_driver_s *driver)
leave_critical_section(flags);
return OK;
}
#if defined(CONFIG_USBDEV_SELFPOWERED)
/****************************************************************************
* Name: khci_usbattach and khci_usbdetach
*
* Description:
* The USB stack must be notified when the device is attached or detached
* by calling one of these functions.
*
****************************************************************************/
void khci_usbattach(void)
{
/* For now there is only one USB controller, but we will always refer to
* it using a pointer to make any future ports to multiple USB controllers
* easier.
*/
struct khci_usbdev_s *priv = &g_usbdev;
/* Mark that we are attached */
priv->attached = 1;
/* This API may be called asynchronously from other initialization
* interfaces. In particular, we may not want to attach the bus yet...
* that should only be done when the class driver is attached. Has
* the class driver been attached?
*/
if (priv->driver)
{
/* Yes.. then attach to the bus */
khci_attach(priv);
}
}
void khci_usbdetach(void)
{
/* For now there is only one USB controller, but we will always refer to
* it using a pointer to make any future ports to multiple USB controllers
* easier.
*/
struct khci_usbdev_s *priv = &g_usbdev;
/* Detach from the bus */
khci_detach(priv);
}
#endif /* CONFIG_USBDEV_SELFPOWERED */
#endif /* CONFIG_USBDEV && CONFIG_KHCI_USB */

View File

@ -66,8 +66,4 @@ struct usbotg_bdtentry_s
struct usbdev_s;
int kinetis_usbpullup(FAR struct usbdev_s *dev, bool enable);
void kinetis_usbsuspend(FAR struct usbdev_s *dev, bool resume);
#if defined(CONFIG_USBDEV_SELFPOWERED)
void khci_usbattach(void);
void khci_usbdetach(void);
#endif
#endif /* __ARCH_ARM_SRC_KINETIS_KINETIS_USBOTG_H */