Trivial changes from review of last PR
This commit is contained in:
parent
e946431015
commit
82bb42aa93
@ -1,7 +1,7 @@
|
||||
/****************************************************************************************************
|
||||
* arch/arm/src/stm32f7/chip/stm32f_otgfs.h
|
||||
* arch/arm/src/stm32f7/chip/stm32f_otg.h
|
||||
*
|
||||
* Copyright (C) 2012, 2014-2015 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2012, 2014-2016 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2016 Omni Hoverboards Inc. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
* Paul Alexander Patience <paul-a.patience@polymtl.ca>
|
||||
|
@ -1,7 +1,7 @@
|
||||
/************************************************************************************
|
||||
* arch/arm/src/stm32f7/stm32_otg.h
|
||||
*
|
||||
* Copyright (C) 2012-2013 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2012-2013, 2016 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -146,4 +146,3 @@ void stm32_usbsuspend(FAR struct usbdev_s *dev, bool resume);
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* CONFIG_STM32F7_OTGFS */
|
||||
#endif /* __ARCH_ARM_SRC_STM32F7_STM32_OTG_H */
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* arch/arm/src/stm32f7/stm32_otgdev.c
|
||||
*
|
||||
* Copyright (C) 2012-2014 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2012-2014, 2016 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -63,12 +63,14 @@
|
||||
#include "up_internal.h"
|
||||
|
||||
|
||||
#if defined(CONFIG_USBDEV) && (defined(CONFIG_STM32F7_OTGFS) || defined(CONFIG_STM32F7_OTGHS))
|
||||
#if defined(CONFIG_USBDEV) && (defined(CONFIG_STM32F7_OTGFS) || \
|
||||
defined(CONFIG_STM32F7_OTGHS))
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
/* Configuration ***************************************************************/
|
||||
|
||||
/* Configuration ************************************************************/
|
||||
|
||||
#ifndef CONFIG_USBDEV_EP0_MAXSIZE
|
||||
# define CONFIG_USBDEV_EP0_MAXSIZE 64
|
||||
@ -164,7 +166,6 @@
|
||||
# define CONFIG_USBDEV_EP8_TXFIFO_SIZE 0
|
||||
#endif
|
||||
|
||||
|
||||
/* The actual FIFO addresses that we use must be aligned to 4-byte boundaries;
|
||||
* FIFO sizes must be provided in units of 32-bit words.
|
||||
*/
|
||||
@ -202,8 +203,8 @@
|
||||
|
||||
#if (STM32_RXFIFO_BYTES + \
|
||||
STM32_EP0_TXFIFO_BYTES + STM32_EP1_TXFIFO_BYTES + STM32_EP2_TXFIFO_BYTES + STM32_EP3_TXFIFO_BYTES + \
|
||||
STM32_EP4_TXFIFO_BYTES + STM32_EP5_TXFIFO_BYTES + STM32_EP6_TXFIFO_BYTES + STM32_EP7_TXFIFO_BYTES + CONFIG_USBDEV_EP8_TXFIFO_SIZE \
|
||||
) > STM32_OTG_FIFO_SIZE
|
||||
STM32_EP4_TXFIFO_BYTES + STM32_EP5_TXFIFO_BYTES + STM32_EP6_TXFIFO_BYTES + STM32_EP7_TXFIFO_BYTES + CONFIG_USBDEV_EP8_TXFIFO_SIZE \
|
||||
) > STM32_OTG_FIFO_SIZE
|
||||
# error "FIFO allocations exceed FIFO memory size"
|
||||
#endif
|
||||
|
||||
@ -295,7 +296,6 @@
|
||||
|
||||
/* Endpoints ******************************************************************/
|
||||
|
||||
|
||||
/* Odd physical endpoint numbers are IN; even are OUT */
|
||||
|
||||
#define STM32_EPPHYIN2LOG(epphy) ((uint8_t)(epphy)|USB_DIR_IN)
|
||||
@ -527,7 +527,7 @@ struct stm32_usbdev_s
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/* Register operations ********************************************************/
|
||||
/* Register operations ******************************************************/
|
||||
|
||||
#if defined(CONFIG_STM32F7_USBDEV_REGDEBUG) && defined(CONFIG_DEBUG_FEATURES)
|
||||
static uint32_t stm32_getreg(uint32_t addr);
|
||||
@ -537,13 +537,13 @@ static void stm32_putreg(uint32_t val, uint32_t addr);
|
||||
# define stm32_putreg(val,addr) putreg32(val,addr)
|
||||
#endif
|
||||
|
||||
/* Request queue operations ****************************************************/
|
||||
/* Request queue operations **************************************************/
|
||||
|
||||
static FAR struct stm32_req_s *stm32_req_remfirst(FAR struct stm32_ep_s *privep);
|
||||
static bool stm32_req_addlast(FAR struct stm32_ep_s *privep,
|
||||
FAR struct stm32_req_s *req);
|
||||
|
||||
/* Low level data transfers and request operations *****************************/
|
||||
/* Low level data transfers and request operations ***************************/
|
||||
/* Special endpoint 0 data transfer logic */
|
||||
|
||||
static void stm32_ep0in_setupresponse(FAR struct stm32_usbdev_s *priv,
|
||||
@ -582,7 +582,7 @@ static void stm32_req_complete(FAR struct stm32_ep_s *privep,
|
||||
static void stm32_req_cancel(FAR struct stm32_ep_s *privep,
|
||||
int16_t status);
|
||||
|
||||
/* Interrupt handling **********************************************************/
|
||||
/* Interrupt handling ********************************************************/
|
||||
|
||||
static struct stm32_ep_s *stm32_ep_findbyaddr(struct stm32_usbdev_s *priv,
|
||||
uint16_t eplog);
|
||||
@ -605,7 +605,8 @@ static inline void stm32_epout_interrupt(FAR struct stm32_usbdev_s *priv);
|
||||
|
||||
static inline void stm32_epin_runtestmode(FAR struct stm32_usbdev_s *priv);
|
||||
static inline void stm32_epin(FAR struct stm32_usbdev_s *priv, uint8_t epno);
|
||||
static inline void stm32_epin_txfifoempty(FAR struct stm32_usbdev_s *priv, int epno);
|
||||
static inline void stm32_epin_txfifoempty(FAR struct stm32_usbdev_s *priv,
|
||||
int epno);
|
||||
static inline void stm32_epin_interrupt(FAR struct stm32_usbdev_s *priv);
|
||||
|
||||
/* Other second level interrupt processing */
|
||||
@ -658,8 +659,10 @@ static void stm32_ep_freereq(FAR struct usbdev_ep_s *ep,
|
||||
/* Endpoint buffer management */
|
||||
|
||||
#ifdef CONFIG_USBDEV_DMA
|
||||
static void *stm32_ep_allocbuffer(FAR struct usbdev_ep_s *ep, unsigned bytes);
|
||||
static void stm32_ep_freebuffer(FAR struct usbdev_ep_s *ep, FAR void *buf);
|
||||
static void *stm32_ep_allocbuffer(FAR struct usbdev_ep_s *ep,
|
||||
unsigned bytes);
|
||||
static void stm32_ep_freebuffer(FAR struct usbdev_ep_s *ep,
|
||||
FAR void *buf);
|
||||
#endif
|
||||
|
||||
/* Endpoint request submission */
|
||||
@ -707,6 +710,7 @@ static void stm32_hwinitialize(FAR struct stm32_usbdev_s *priv);
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/* Since there is only a single USB interface, all status information can be
|
||||
* be simply retained in a single global instance.
|
||||
*/
|
||||
@ -833,10 +837,6 @@ const struct trace_msg_t g_usb_trace_strings_intdecode[] =
|
||||
};
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
@ -975,6 +975,7 @@ static bool stm32_req_addlast(FAR struct stm32_ep_s *privep,
|
||||
privep->tail->flink = req;
|
||||
privep->tail = req;
|
||||
}
|
||||
|
||||
return is_empty;
|
||||
}
|
||||
|
||||
@ -3822,8 +3823,8 @@ static void stm32_disablegonak(FAR struct stm32_ep_s *privep)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int stm32_epout_configure(FAR struct stm32_ep_s *privep, uint8_t eptype,
|
||||
uint16_t maxpacket)
|
||||
static int stm32_epout_configure(FAR struct stm32_ep_s *privep,
|
||||
uint8_t eptype, uint16_t maxpacket)
|
||||
{
|
||||
uint32_t mpsiz;
|
||||
uint32_t regaddr;
|
||||
@ -3917,8 +3918,8 @@ static int stm32_epout_configure(FAR struct stm32_ep_s *privep, uint8_t eptype,
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int stm32_epin_configure(FAR struct stm32_ep_s *privep, uint8_t eptype,
|
||||
uint16_t maxpacket)
|
||||
static int stm32_epin_configure(FAR struct stm32_ep_s *privep,
|
||||
uint8_t eptype, uint16_t maxpacket)
|
||||
{
|
||||
uint32_t mpsiz;
|
||||
uint32_t regaddr;
|
||||
@ -3979,7 +3980,8 @@ static int stm32_epin_configure(FAR struct stm32_ep_s *privep, uint8_t eptype,
|
||||
regval |= OTG_DIEPCTL_CNAK;
|
||||
}
|
||||
|
||||
regval &= ~(OTG_DIEPCTL_MPSIZ_MASK | OTG_DIEPCTL_EPTYP_MASK | OTG_DIEPCTL_TXFNUM_MASK);
|
||||
regval &= ~(OTG_DIEPCTL_MPSIZ_MASK | OTG_DIEPCTL_EPTYP_MASK |
|
||||
OTG_DIEPCTL_TXFNUM_MASK);
|
||||
regval |= mpsiz;
|
||||
regval |= (eptype << OTG_DIEPCTL_EPTYP_SHIFT);
|
||||
regval |= (eptype << OTG_DIEPCTL_TXFNUM_SHIFT);
|
||||
@ -5493,7 +5495,8 @@ void up_usbinitialize(void)
|
||||
/* At present, there is only a single OTG device support. Hence it is
|
||||
* pre-allocated as g_otghsdev. However, in most code, the private data
|
||||
* structure will be referenced using the 'priv' pointer (rather than the
|
||||
* global data) in order to simplify any future support for multiple devices.
|
||||
* global data) in order to simplify any future support for multiple
|
||||
* devices.
|
||||
*/
|
||||
|
||||
FAR struct stm32_usbdev_s *priv = &g_otghsdev;
|
||||
|
@ -72,7 +72,8 @@
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
/* Configuration ***************************************************************/
|
||||
|
||||
/* Configuration ************************************************************/
|
||||
/* STM32 USB OTG FS Host Driver Support
|
||||
*
|
||||
* Pre-requisites
|
||||
@ -135,7 +136,7 @@
|
||||
# undef CONFIG_STM32F7_USBHOST_PKTDUMP
|
||||
#endif
|
||||
|
||||
/* HCD Setup *******************************************************************/
|
||||
/* HCD Setup ****************************************************************/
|
||||
/* Hardware capabilities */
|
||||
|
||||
#define STM32_NHOST_CHANNELS 8 /* Number of host channels */
|
||||
@ -146,7 +147,7 @@
|
||||
#define STM32_MAX_PKTCOUNT 256 /* Max packet count */
|
||||
#define STM32_RETRY_COUNT 3 /* Number of ctrl transfer retries */
|
||||
|
||||
/* Delays **********************************************************************/
|
||||
/* Delays *******************************************************************/
|
||||
|
||||
#define STM32_READY_DELAY 200000 /* In loop counts */
|
||||
#define STM32_FLUSH_DELAY 200000 /* In loop counts */
|
||||
@ -281,7 +282,7 @@ struct stm32_usbhost_s
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/* Register operations ********************************************************/
|
||||
/* Register operations ******************************************************/
|
||||
|
||||
#ifdef CONFIG_STM32F7_USBHOST_REGDEBUG
|
||||
static void stm32_printreg(uint32_t addr, uint32_t val, bool iswrite);
|
||||
@ -302,16 +303,16 @@ static inline void stm32_modifyreg(uint32_t addr, uint32_t clrbits,
|
||||
# define stm32_pktdump(m,b,n)
|
||||
#endif
|
||||
|
||||
/* Semaphores ******************************************************************/
|
||||
/* Semaphores ***************************************************************/
|
||||
|
||||
static void stm32_takesem(sem_t *sem);
|
||||
#define stm32_givesem(s) sem_post(s);
|
||||
|
||||
/* Byte stream access helper functions *****************************************/
|
||||
/* Byte stream access helper functions **************************************/
|
||||
|
||||
static inline uint16_t stm32_getle16(const uint8_t *val);
|
||||
|
||||
/* Channel management **********************************************************/
|
||||
/* Channel management *******************************************************/
|
||||
|
||||
static int stm32_chan_alloc(FAR struct stm32_usbhost_s *priv);
|
||||
static inline void stm32_chan_free(FAR struct stm32_usbhost_s *priv, int chidx);
|
||||
@ -340,7 +341,7 @@ static int stm32_xfrep_alloc(FAR struct stm32_usbhost_s *priv,
|
||||
FAR const struct usbhost_epdesc_s *epdesc,
|
||||
FAR usbhost_ep_t *ep);
|
||||
|
||||
/* Control/data transfer logic *************************************************/
|
||||
/* Control/data transfer logic **********************************************/
|
||||
|
||||
static void stm32_transfer_start(FAR struct stm32_usbhost_s *priv, int chidx);
|
||||
#if 0 /* Not used */
|
||||
@ -376,7 +377,7 @@ static int stm32_out_asynch(FAR struct stm32_usbhost_s *priv, int chidx,
|
||||
usbhost_asynch_t callback, FAR void *arg);
|
||||
#endif
|
||||
|
||||
/* Interrupt handling **********************************************************/
|
||||
/* Interrupt handling *******************************************************/
|
||||
/* Lower level interrupt handlers */
|
||||
|
||||
static void stm32_gint_wrpacket(FAR struct stm32_usbhost_s *priv,
|
||||
@ -412,7 +413,7 @@ static void stm32_gint_disable(void);
|
||||
static inline void stm32_hostinit_enable(void);
|
||||
static void stm32_txfe_enable(FAR struct stm32_usbhost_s *priv, int chidx);
|
||||
|
||||
/* USB host controller operations **********************************************/
|
||||
/* USB host controller operations *******************************************/
|
||||
|
||||
static int stm32_wait(FAR struct usbhost_connection_s *conn,
|
||||
FAR struct usbhost_hubport_s **hport);
|
||||
@ -457,7 +458,7 @@ static int stm32_connect(FAR struct usbhost_driver_s *drvr,
|
||||
static void stm32_disconnect(FAR struct usbhost_driver_s *drvr,
|
||||
FAR struct usbhost_hubport_s *hport);
|
||||
|
||||
/* Initialization **************************************************************/
|
||||
/* Initialization ***********************************************************/
|
||||
|
||||
static void stm32_portreset(FAR struct stm32_usbhost_s *priv);
|
||||
static void stm32_flush_txfifos(uint32_t txfnum);
|
||||
@ -487,10 +488,6 @@ static struct usbhost_connection_s g_usbconn =
|
||||
.enumerate = stm32_enumerate,
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
@ -625,7 +622,8 @@ static void stm32_putreg(uint32_t addr, uint32_t val)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static inline void stm32_modifyreg(uint32_t addr, uint32_t clrbits, uint32_t setbits)
|
||||
static inline void stm32_modifyreg(uint32_t addr, uint32_t clrbits,
|
||||
uint32_t setbits)
|
||||
{
|
||||
stm32_putreg(addr, (((stm32_getreg(addr)) & ~clrbits) | setbits));
|
||||
}
|
||||
@ -987,10 +985,10 @@ static void stm32_chan_halt(FAR struct stm32_usbhost_s *priv, int chidx,
|
||||
* Name: stm32_chan_waitsetup
|
||||
*
|
||||
* Description:
|
||||
* Set the request for the transfer complete event well BEFORE enabling the
|
||||
* transfer (as soon as we are absolutely committed to the to avoid transfer).
|
||||
* We do this to minimize race conditions. This logic would have to be expanded
|
||||
* if we want to have more than one packet in flight at a time!
|
||||
* Set the request for the transfer complete event well BEFORE enabling
|
||||
* the transfer (as soon as we are absolutely committed to the transfer).
|
||||
* We do this to minimize race conditions. This logic would have to be
|
||||
* expanded if we want to have more than one packet in flight at a time!
|
||||
*
|
||||
* Assumptions:
|
||||
* Called from a normal thread context BEFORE the transfer has been started.
|
||||
@ -1082,9 +1080,9 @@ static int stm32_chan_wait(FAR struct stm32_usbhost_s *priv,
|
||||
int ret;
|
||||
|
||||
/* Disable interrupts so that the following operations will be atomic. On
|
||||
* the OTG FS global interrupt needs to be disabled. However, here we disable
|
||||
* all interrupts to exploit that fact that interrupts will be re-enabled
|
||||
* while we wait.
|
||||
* the OTG FS global interrupt needs to be disabled. However, here we
|
||||
* disable all interrupts to exploit that fact that interrupts will be re-
|
||||
* enabled while we wait.
|
||||
*/
|
||||
|
||||
flags = enter_critical_section();
|
||||
@ -1256,8 +1254,8 @@ static int stm32_ctrlchan_alloc(FAR struct stm32_usbhost_s *priv,
|
||||
* allocated endpoint descriptor.
|
||||
*
|
||||
* Returned Values:
|
||||
* On success, zero (OK) is returned. On a failure, a negated errno value is
|
||||
* returned indicating the nature of the failure
|
||||
* On success, zero (OK) is returned. On a failure, a negated errno value
|
||||
* is returned indicating the nature of the failure
|
||||
*
|
||||
* Assumptions:
|
||||
* This function will *not* be called from an interrupt handler.
|
||||
@ -1305,7 +1303,7 @@ static int stm32_ctrlep_alloc(FAR struct stm32_usbhost_s *priv,
|
||||
return OK;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
/****************************************************************************
|
||||
* Name: stm32_xfrep_alloc
|
||||
*
|
||||
* Description:
|
||||
@ -1318,13 +1316,13 @@ static int stm32_ctrlep_alloc(FAR struct stm32_usbhost_s *priv,
|
||||
* allocated endpoint descriptor.
|
||||
*
|
||||
* Returned Values:
|
||||
* On success, zero (OK) is returned. On a failure, a negated errno value is
|
||||
* returned indicating the nature of the failure
|
||||
* On success, zero (OK) is returned. On a failure, a negated errno value
|
||||
* is returned indicating the nature of the failure
|
||||
*
|
||||
* Assumptions:
|
||||
* This function will *not* be called from an interrupt handler.
|
||||
*
|
||||
************************************************************************************/
|
||||
****************************************************************************/
|
||||
|
||||
static int stm32_xfrep_alloc(FAR struct stm32_usbhost_s *priv,
|
||||
FAR const struct usbhost_epdesc_s *epdesc,
|
||||
@ -2500,8 +2498,8 @@ static inline void stm32_gint_hcinisr(FAR struct stm32_usbhost_s *priv,
|
||||
}
|
||||
else if (chan->chreason == CHREASON_NAK)
|
||||
{
|
||||
/* Halt on NAK only happens on an INTR channel. Fetch the HCCHAR register
|
||||
* and check for an interrupt endpoint.
|
||||
/* Halt on NAK only happens on an INTR channel. Fetch the HCCHAR
|
||||
* register and check for an interrupt endpoint.
|
||||
*/
|
||||
|
||||
regval = stm32_getreg(STM32_OTG_HCCHAR(chidx));
|
||||
@ -3466,7 +3464,6 @@ static int stm32_gint_isr(int irq, FAR void *context)
|
||||
}
|
||||
|
||||
/* Otherwise, process each pending, unmasked GINT interrupts */
|
||||
|
||||
/* Handle the start of frame interrupt */
|
||||
|
||||
#ifdef CONFIG_STM32F7_OTG_SOFINTR
|
||||
|
Loading…
Reference in New Issue
Block a user