Merge remote-tracking branch 'origin/master' into ieee802154

This commit is contained in:
Gregory Nutt 2017-05-16 08:05:38 -06:00
commit 9fb2fed90e
17 changed files with 178 additions and 80 deletions

View File

@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/stm32/stm32_can.c
*
* Copyright (C) 2011, 2016 Gregory Nutt. All rights reserved.
* Copyright (C) 2011, 2016-2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Copyright (C) 2016 Omni Hoverboards Inc. All rights reserved.
@ -74,10 +74,6 @@
#define INAK_TIMEOUT 65535
/* Mailboxes ****************************************************************/
#define CAN_ALL_MAILBOXES (CAN_TSR_TME0 | CAN_TSR_TME1 | CAN_TSR_TME2)
/* Bit timing ***************************************************************/
#define CAN_BIT_QUANTA (CONFIG_CAN_TSEG1 + CONFIG_CAN_TSEG2 + 1)
@ -172,6 +168,12 @@ static int stm32can_bittiming(FAR struct stm32_can_s *priv);
static int stm32can_cellinit(FAR struct stm32_can_s *priv);
static int stm32can_filterinit(FAR struct stm32_can_s *priv);
/* TX mailbox status */
static bool stm32can_txmb0empty(uint32_t tsr_regval);
static bool stm32can_txmb1empty(uint32_t tsr_regval);
static bool stm32can_txmb2empty(uint32_t tsr_regval);
/****************************************************************************
* Private Data
****************************************************************************/
@ -1170,15 +1172,15 @@ static int stm32can_send(FAR struct can_dev_s *dev,
/* Select one empty transmit mailbox */
regval = stm32can_getreg(priv, STM32_CAN_TSR_OFFSET);
if ((regval & CAN_TSR_TME0) != 0 && (regval & CAN_TSR_RQCP0) == 0)
if (stm32can_txmb0empty(regval))
{
txmb = 0;
}
else if ((regval & CAN_TSR_TME1) != 0 && (regval & CAN_TSR_RQCP1) == 0)
else if (stm32can_txmb1empty(regval))
{
txmb = 1;
}
else if ((regval & CAN_TSR_TME2) != 0 && (regval & CAN_TSR_RQCP2) == 0)
else if (stm32can_txmb2empty(regval))
{
txmb = 2;
}
@ -1321,7 +1323,8 @@ static bool stm32can_txready(FAR struct can_dev_s *dev)
regval = stm32can_getreg(priv, STM32_CAN_TSR_OFFSET);
caninfo("CAN%d TSR: %08x\n", priv->port, regval);
return (regval & CAN_ALL_MAILBOXES) != 0;
return stm32can_txmb0empty(regval) || stm32can_txmb1empty(regval) ||
stm32can_txmb2empty(regval);
}
/****************************************************************************
@ -1352,7 +1355,8 @@ static bool stm32can_txempty(FAR struct can_dev_s *dev)
regval = stm32can_getreg(priv, STM32_CAN_TSR_OFFSET);
caninfo("CAN%d TSR: %08x\n", priv->port, regval);
return (regval & CAN_ALL_MAILBOXES) == CAN_ALL_MAILBOXES;
return stm32can_txmb0empty(regval) && stm32can_txmb1empty(regval) &&
stm32can_txmb2empty(regval);
}
/****************************************************************************
@ -1553,14 +1557,9 @@ static int stm32can_txinterrupt(int irq, FAR void *context, FAR void *arg)
stm32can_putreg(priv, STM32_CAN_TSR_OFFSET, CAN_TSR_RQCP0);
/* Check for errors */
/* Tell the upper half that the transfer is finished. */
if ((regval & CAN_TSR_TXOK0) != 0)
{
/* Tell the upper half that the tansfer is finished. */
(void)can_txdone(dev);
}
(void)can_txdone(dev);
}
/* Check for RQCP1: Request completed mailbox 1 */
@ -1573,14 +1572,9 @@ static int stm32can_txinterrupt(int irq, FAR void *context, FAR void *arg)
stm32can_putreg(priv, STM32_CAN_TSR_OFFSET, CAN_TSR_RQCP1);
/* Check for errors */
/* Tell the upper half that the transfer is finished. */
if ((regval & CAN_TSR_TXOK1) != 0)
{
/* Tell the upper half that the tansfer is finished. */
(void)can_txdone(dev);
}
(void)can_txdone(dev);
}
/* Check for RQCP2: Request completed mailbox 2 */
@ -1593,14 +1587,9 @@ static int stm32can_txinterrupt(int irq, FAR void *context, FAR void *arg)
stm32can_putreg(priv, STM32_CAN_TSR_OFFSET, CAN_TSR_RQCP2);
/* Check for errors */
/* Tell the upper half that the transfer is finished. */
if ((regval & CAN_TSR_TXOK2) != 0)
{
/* Tell the upper half that the tansfer is finished. */
(void)can_txdone(dev);
}
(void)can_txdone(dev);
}
return OK;
@ -2111,6 +2100,57 @@ static int stm32can_delstdfilter(FAR struct stm32_can_s *priv, int arg)
return -ENOTTY;
}
/****************************************************************************
* Name: stm32can_txmb0empty
*
* Input Parameter:
* tsr_regval - value of CAN transmit status register
*
* Returned Value:
* Returns true if mailbox 0 is empty and can be used for sending.
*
****************************************************************************/
static bool stm32can_txmb0empty(uint32_t tsr_regval)
{
return (tsr_regval & CAN_TSR_TME0) != 0 &&
(tsr_regval & CAN_TSR_RQCP0) == 0;
}
/****************************************************************************
* Name: stm32can_txmb1empty
*
* Input Parameter:
* tsr_regval - value of CAN transmit status register
*
* Returned Value:
* Returns true if mailbox 1 is empty and can be used for sending.
*
****************************************************************************/
static bool stm32can_txmb1empty(uint32_t tsr_regval)
{
return (tsr_regval & CAN_TSR_TME1) != 0 &&
(tsr_regval & CAN_TSR_RQCP1) == 0;
}
/****************************************************************************
* Name: stm32can_txmb2empty
*
* Input Parameter:
* tsr_regval - value of CAN transmit status register
*
* Returned Value:
* Returns true if mailbox 2 is empty and can be used for sending.
*
****************************************************************************/
static bool stm32can_txmb2empty(uint32_t tsr_regval)
{
return (tsr_regval & CAN_TSR_TME2) != 0 &&
(tsr_regval & CAN_TSR_RQCP2) == 0;
}
/****************************************************************************
* Public Functions
****************************************************************************/

View File

@ -653,6 +653,8 @@ static int null_enqueuebuffer(FAR struct audio_lowerhalf_s *dev,
FAR struct null_dev_s *priv = (FAR struct null_dev_s *)dev;
bool done;
DEBUGASSERT(priv && apb && priv->dev.upper);
audinfo("apb=%p curbyte=%d nbytes=%d\n", apb, apb->curbyte, apb->nbytes);
/* Say that we consumed all of the data */
@ -663,10 +665,6 @@ static int null_enqueuebuffer(FAR struct audio_lowerhalf_s *dev,
done = ((apb->flags & AUDIO_APB_FINAL) != 0);
/* And return the buffer to the upper level */
DEBUGASSERT(priv && apb && priv->dev.upper);
/* The buffer belongs to to an upper level. Just forward the event to
* the next level up.
*/

View File

@ -339,12 +339,13 @@ static int bch_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
bchlib_semtake(bch);
if (!bchr || bch->refs == MAX_OPENCNT)
{
ret = -EINVAL;
ret = -EINVAL;
}
else
{
bch->refs++;
*bchr = bch;
ret = OK;
}
bchlib_semgive(bch);

View File

@ -201,7 +201,7 @@ static inline int ajoy_takesem(sem_t *sem)
#if !defined(CONFIG_DISABLE_POLL) || !defined(CONFIG_DISABLE_SIGNALS)
static void ajoy_enable(FAR struct ajoy_upperhalf_s *priv)
{
FAR const struct ajoy_lowerhalf_s *lower = priv->au_lower;
FAR const struct ajoy_lowerhalf_s *lower;
FAR struct ajoy_open_s *opriv;
ajoy_buttonset_t press;
ajoy_buttonset_t release;
@ -210,8 +210,9 @@ static void ajoy_enable(FAR struct ajoy_upperhalf_s *priv)
int i;
#endif
DEBUGASSERT(priv && priv->au_lower);
DEBUGASSERT(priv);
lower = priv->au_lower;
DEBUGASSERT(lower);
/* This routine is called both task level and interrupt level, so
* interrupts must be disabled.
@ -295,7 +296,7 @@ static void ajoy_interrupt(FAR const struct ajoy_lowerhalf_s *lower,
static void ajoy_sample(FAR struct ajoy_upperhalf_s *priv)
{
FAR const struct ajoy_lowerhalf_s *lower = priv->au_lower;
FAR const struct ajoy_lowerhalf_s *lower;
FAR struct ajoy_open_s *opriv;
ajoy_buttonset_t sample;
#if !defined(CONFIG_DISABLE_POLL) || !defined(CONFIG_DISABLE_SIGNALS)
@ -308,8 +309,9 @@ static void ajoy_sample(FAR struct ajoy_upperhalf_s *priv)
int i;
#endif
DEBUGASSERT(priv && priv->au_lower);
DEBUGASSERT(priv);
lower = priv->au_lower;
DEBUGASSERT(lower);
/* This routine is called both task level and interrupt level, so
* interrupts must be disabled.

View File

@ -201,7 +201,7 @@ static inline int djoy_takesem(sem_t *sem)
#if !defined(CONFIG_DISABLE_POLL) || !defined(CONFIG_DISABLE_SIGNALS)
static void djoy_enable(FAR struct djoy_upperhalf_s *priv)
{
FAR const struct djoy_lowerhalf_s *lower = priv->du_lower;
FAR const struct djoy_lowerhalf_s *lower;
FAR struct djoy_open_s *opriv;
djoy_buttonset_t press;
djoy_buttonset_t release;
@ -210,8 +210,9 @@ static void djoy_enable(FAR struct djoy_upperhalf_s *priv)
int i;
#endif
DEBUGASSERT(priv && priv->du_lower);
DEBUGASSERT(priv);
lower = priv->du_lower;
DEBUGASSERT(lower);
/* This routine is called both task level and interrupt level, so
* interrupts must be disabled.
@ -295,7 +296,7 @@ static void djoy_interrupt(FAR const struct djoy_lowerhalf_s *lower,
static void djoy_sample(FAR struct djoy_upperhalf_s *priv)
{
FAR const struct djoy_lowerhalf_s *lower = priv->du_lower;
FAR const struct djoy_lowerhalf_s *lower;
FAR struct djoy_open_s *opriv;
djoy_buttonset_t sample;
#if !defined(CONFIG_DISABLE_POLL) || !defined(CONFIG_DISABLE_SIGNALS)
@ -308,8 +309,9 @@ static void djoy_sample(FAR struct djoy_upperhalf_s *priv)
int i;
#endif
DEBUGASSERT(priv && priv->du_lower);
DEBUGASSERT(priv);
lower = priv->du_lower;
DEBUGASSERT(lower);
/* This routine is called both task level and interrupt level, so
* interrupts must be disabled.

View File

@ -141,13 +141,16 @@ static int ubxmdm_ioctl(FAR struct file* filep,
unsigned long arg)
{
FAR struct inode* inode = filep->f_inode;
FAR struct ubxmdm_upper* upper = inode->i_private;
FAR struct ubxmdm_lower* lower = upper->lower;
FAR struct ubxmdm_upper* upper;
FAR struct ubxmdm_lower* lower;
int ret;
FAR struct ubxmdm_status* status;
m_info("cmd: %d arg: %ld\n", cmd, arg);
DEBUGASSERT(upper && lower);
upper = inode->i_private;
DEBUGASSERT(upper != NULL);
lower = upper->lower;
DEBUGASSERT(lower != NULL);
switch (cmd)
{
@ -320,8 +323,9 @@ void ubxmdm_unregister(FAR void *handle)
FAR struct ubxmdm_lower *lower;
upper = (FAR struct ubxmdm_upper*) handle;
DEBUGASSERT(upper != NULL);
lower = upper->lower;
DEBUGASSERT(upper && lower);
DEBUGASSERT(lower != NULL);
m_info("Unregistering: %s\n", upper->path);

View File

@ -318,11 +318,13 @@ static ssize_t pwm_write(FAR struct file *filep, FAR const char *buffer,
#ifdef CONFIG_PWM_PULSECOUNT
static int pwm_start(FAR struct pwm_upperhalf_s *upper, unsigned int oflags)
{
FAR struct pwm_lowerhalf_s *lower = upper->dev;
FAR struct pwm_lowerhalf_s *lower;
irqstate_t flags;
int ret = OK;
DEBUGASSERT(upper != NULL && lower->ops->start != NULL);
DEBUGASSERT(upper != NULL);
lower = upper->dev;
DEBUGASSERT(lower != NULL && lower->ops->start != NULL);
/* Verify that the PWM is not already running */
@ -385,10 +387,12 @@ static int pwm_start(FAR struct pwm_upperhalf_s *upper, unsigned int oflags)
#else
static int pwm_start(FAR struct pwm_upperhalf_s *upper, unsigned int oflags)
{
FAR struct pwm_lowerhalf_s *lower = upper->dev;
FAR struct pwm_lowerhalf_s *lower;
int ret = OK;
DEBUGASSERT(upper != NULL && lower->ops->start != NULL);
DEBUGASSERT(upper != NULL);
lower = upper->dev;
DEBUGASSERT(lower != NULL && lower->ops->start != NULL);
/* Verify that the PWM is not already running */

View File

@ -201,6 +201,7 @@ config MS58XX_I2C_FREQUENCY
config MS58XX_VDD
int "MEAS MS58XX VDD"
default 30
depends on MS58XX
config MPL115A
bool "Freescale MPL115A Barometer Sensor support"

View File

@ -201,10 +201,10 @@ static int hts221_do_transfer(FAR struct hts221_dev_s *priv,
break;
}
ret = up_i2creset(priv->i2c);
ret = I2C_RESET(priv->i2c);
if (ret < 0)
{
hts221_dbg("up_i2creset failed: %d\n", ret);
hts221_dbg("I2C_RESET failed: %d\n", ret);
return ret;
}
#endif
@ -892,7 +892,7 @@ static int hts221_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
{
FAR struct inode *inode = filep->f_inode;
FAR struct hts221_dev_s *priv = inode->i_private;
int32_t ret = 0;
int ret = OK;
while (sem_wait(&priv->devsem) != 0)
{
@ -932,7 +932,7 @@ static int hts221_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
break;
default:
ret = -EINVAL;
ret = -ENOTTY;
break;
}

View File

@ -131,9 +131,11 @@ static int lis2dh_get_reading(FAR struct lis2dh_dev_s *dev,
FAR struct lis2dh_vector_s *res, bool force_read);
static int lis2dh_powerdown(FAR struct lis2dh_dev_s *dev);
static int lis2dh_reboot(FAR struct lis2dh_dev_s *dev);
#ifndef CONFIG_DISABLE_POLL
static int lis2dh_poll(FAR struct file *filep,
FAR struct pollfd *fds, bool setup);
static void lis2dh_notify(FAR struct lis2dh_dev_s *priv);
#endif
static int lis2dh_int_handler(int irq, FAR void *context,
FAR void *arg);
static int lis2dh_setup(FAR struct lis2dh_dev_s *dev,
@ -1614,10 +1616,10 @@ static int lis2dh_access(FAR struct lis2dh_dev_s *dev, uint8_t subaddr,
{
/* Some error. Try to reset I2C bus and keep trying. */
#ifdef CONFIG_I2C_RESET
int ret = up_i2creset(dev->i2c);
int ret = I2C_RESET(dev->i2c);
if (ret < 0)
{
lis2dh_dbg("up_i2creset failed: %d\n", ret);
lis2dh_dbg("I2C_RESET failed: %d\n", ret);
return ret;
}
#endif

View File

@ -257,10 +257,10 @@ static int lps25h_do_transfer(FAR struct lps25h_dev_s *dev,
break;
}
ret = up_i2creset(dev->i2c);
ret = I2C_RESET(dev->i2c);
if (ret < 0)
{
lps25h_dbg("up_i2creset failed: %d\n", ret);
lps25h_dbg("I2C_RESET failed: %d\n", ret);
return ret;
}
#endif
@ -708,7 +708,7 @@ static int lps25h_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
{
FAR struct inode *inode = filep->f_inode;
FAR struct lps25h_dev_s *dev = inode->i_private;
int ret = 0;
int ret = OK;
while (sem_wait(&dev->devsem) != 0)
{
@ -742,7 +742,7 @@ static int lps25h_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
break;
default:
ret = -EINVAL;
ret = -ENOTTY;
break;
}

View File

@ -276,12 +276,15 @@ static ssize_t qe_write(FAR struct file *filep, FAR const char *buffer, size_t b
static int qe_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
{
FAR struct inode *inode = filep->f_inode;
FAR struct qe_upperhalf_s *upper = inode->i_private;
FAR struct qe_lowerhalf_s *lower = upper->lower;
FAR struct qe_upperhalf_s *upper;
FAR struct qe_lowerhalf_s *lower;
int ret;
sninfo("cmd: %d arg: %ld\n", cmd, arg);
DEBUGASSERT(upper && lower);
upper = inode->i_private;
DEBUGASSERT(upper != NULL);
lower = upper->lower;
DEBUGASSERT(lower != NULL);
/* Get exclusive access to the device structures */

View File

@ -254,12 +254,15 @@ static ssize_t timer_write(FAR struct file *filep, FAR const char *buffer,
static int timer_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
{
FAR struct inode *inode = filep->f_inode;
FAR struct timer_upperhalf_s *upper = inode->i_private;
FAR struct timer_lowerhalf_s *lower = upper->lower;
FAR struct timer_upperhalf_s *upper;
FAR struct timer_lowerhalf_s *lower;
int ret;
tmrinfo("cmd: %d arg: %ld\n", cmd, arg);
DEBUGASSERT(upper && lower);
upper = inode->i_private;
DEBUGASSERT(upper != NULL);
lower = upper->lower;
DEBUGASSERT(lower != NULL);
/* Handle built-in ioctl commands */

View File

@ -240,12 +240,15 @@ static ssize_t wdog_write(FAR struct file *filep, FAR const char *buffer, size_t
static int wdog_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
{
FAR struct inode *inode = filep->f_inode;
FAR struct watchdog_upperhalf_s *upper = inode->i_private;
FAR struct watchdog_lowerhalf_s *lower = upper->lower;
FAR struct watchdog_upperhalf_s *upper;
FAR struct watchdog_lowerhalf_s *lower;
int ret;
wdinfo("cmd: %d arg: %ld\n", cmd, arg);
DEBUGASSERT(upper && lower);
upper = inode->i_private;
DEBUGASSERT(upper != NULL);
lower = upper->lower;
DEBUGASSERT(lower != NULL);
/* Get exclusive access to the device structures */
@ -533,8 +536,9 @@ void watchdog_unregister(FAR void *handle)
/* Recover the pointer to the upper-half driver state */
upper = (FAR struct watchdog_upperhalf_s *)handle;
DEBUGASSERT(upper != NULL);
lower = upper->lower;
DEBUGASSERT(upper && lower);
DEBUGASSERT(lower != NULL);
wdinfo("Unregistering: %s\n", upper->path);

View File

@ -176,10 +176,10 @@ static int fusb301_getreg(FAR struct fusb301_dev_s *priv, uint8_t reg)
break;
}
ret = up_i2creset(priv->i2c);
ret = I2C_RESET(priv->i2c);
if (ret < 0)
{
fusb301_err("ERROR: up_i2creset failed: %d\n", ret);
fusb301_err("ERROR: I2C_RESET failed: %d\n", ret);
return ret;
}
#endif
@ -246,10 +246,10 @@ static int fusb301_putreg(FAR struct fusb301_dev_s *priv, uint8_t regaddr,
break;
}
ret = up_i2creset(priv->i2c);
ret = I2C_RESET(priv->i2c);
if (ret < 0)
{
fusb301_err("ERROR: up_i2creset failed: %d\n", ret);
fusb301_err("ERROR: I2C_RESET failed: %d\n", ret);
return ret;
}
#endif

View File

@ -314,10 +314,44 @@ found:
if ((tcp->flags & TCP_RST) != 0)
{
conn->tcpstateflags = TCP_CLOSED;
nwarn("WARNING: RESET - TCP state: TCP_CLOSED\n");
FAR struct tcp_conn_s *listener = NULL;
/* An RST received during the 3-way connection handshake requires
* little more clean-up.
*/
if ((conn->tcpstateflags & TCP_STATE_MASK) == TCP_SYN_RCVD)
{
conn->tcpstateflags = TCP_CLOSED;
nwarn("WARNING: RESET in TCP_SYN_RCVD\n");
/* Notify the listener for the connection of the reset event */
listener = tcp_findlistener(conn->lport);
/* We must free this TCP connection structure; this connection
* will never be established.
*/
tcp_free(conn);
}
else
{
conn->tcpstateflags = TCP_CLOSED;
nwarn("WARNING: RESET TCP state: TCP_CLOSED\n");
/* Notify this connection of the reset event */
listener = conn;
}
/* Perform the TCP_ABORT callback and drop the packet */
if (listener != NULL)
{
(void)tcp_callback(dev, listener, TCP_ABORT);
}
(void)tcp_callback(dev, conn, TCP_ABORT);
goto drop;
}

View File

@ -231,7 +231,7 @@ void tcp_timer(FAR struct net_driver_s *dev, FAR struct tcp_conn_s *conn,
FAR struct tcp_conn_s *listener;
conn->tcpstateflags = TCP_CLOSED;
ninfo("TCP state: TCP_CLOSED\n");
ninfo("TCP state: TCP_SYN_RCVD->TCP_CLOSED\n");
/* Find the listener for this connection. */