summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2015-04-16 08:22:07 -0600
committerGregory Nutt <gnutt@nuttx.org>2015-04-16 09:11:51 -0600
commitcf8e567a7e3bd33faafb8793222289eb482543e3 (patch)
treeda9ed78c7438431bba03c431f2cb3ba688c3b933
parent6482d98f73cddf04753ddea49d7eb4fc7d7936e4 (diff)
downloadpx4-nuttx-cf8e567a7e3bd33faafb8793222289eb482543e3.tar.gz
px4-nuttx-cf8e567a7e3bd33faafb8793222289eb482543e3.tar.bz2
px4-nuttx-cf8e567a7e3bd33faafb8793222289eb482543e3.zip
Add hooks to CDC/ACM driver to support RX flow control
-rw-r--r--nuttx/drivers/usbdev/cdcacm.c79
1 files changed, 58 insertions, 21 deletions
diff --git a/nuttx/drivers/usbdev/cdcacm.c b/nuttx/drivers/usbdev/cdcacm.c
index 445eba932..1a69d5721 100644
--- a/nuttx/drivers/usbdev/cdcacm.c
+++ b/nuttx/drivers/usbdev/cdcacm.c
@@ -203,6 +203,11 @@ static int cdcuart_attach(FAR struct uart_dev_s *dev);
static void cdcuart_detach(FAR struct uart_dev_s *dev);
static int cdcuart_ioctl(FAR struct file *filep,int cmd,unsigned long arg);
static void cdcuart_rxint(FAR struct uart_dev_s *dev, bool enable);
+#ifdef CONFIG_SERIAL_IFLOWCONTROL
+static bool cdcuart_rxflowcontrol(FAR struct uart_dev_s *dev,
+ unsigned int nbuffered, bool upper);
+#endif
+
static void cdcuart_txint(FAR struct uart_dev_s *dev, bool enable);
static bool cdcuart_txempty(FAR struct uart_dev_s *dev);
@@ -213,16 +218,16 @@ static bool cdcuart_txempty(FAR struct uart_dev_s *dev);
static const struct usbdevclass_driverops_s g_driverops =
{
- cdcacm_bind, /* bind */
- cdcacm_unbind, /* unbind */
- cdcacm_setup, /* setup */
- cdcacm_disconnect, /* disconnect */
+ cdcacm_bind, /* bind */
+ cdcacm_unbind, /* unbind */
+ cdcacm_setup, /* setup */
+ cdcacm_disconnect, /* disconnect */
#ifdef CONFIG_SERIAL_REMOVABLE
- cdcacm_suspend, /* suspend */
- cdcacm_resume, /* resume */
+ cdcacm_suspend, /* suspend */
+ cdcacm_resume, /* resume */
#else
- NULL, /* suspend */
- NULL, /* resume */
+ NULL, /* suspend */
+ NULL, /* resume */
#endif
};
@@ -230,21 +235,21 @@ static const struct usbdevclass_driverops_s g_driverops =
static const struct uart_ops_s g_uartops =
{
- cdcuart_setup, /* setup */
- cdcuart_shutdown, /* shutdown */
- cdcuart_attach, /* attach */
- cdcuart_detach, /* detach */
- cdcuart_ioctl, /* ioctl */
- NULL, /* receive */
- cdcuart_rxint, /* rxinit */
- NULL, /* rxavailable */
+ cdcuart_setup, /* setup */
+ cdcuart_shutdown, /* shutdown */
+ cdcuart_attach, /* attach */
+ cdcuart_detach, /* detach */
+ cdcuart_ioctl, /* ioctl */
+ NULL, /* receive */
+ cdcuart_rxint, /* rxinit */
+ NULL, /* rxavailable */
#ifdef CONFIG_SERIAL_IFLOWCONTROL
- NULL, /* rxflowcontrol */
+ cdcuart_rxflowcontrol, /* rxflowcontrol */
#endif
- NULL, /* send */
- cdcuart_txint, /* txinit */
- NULL, /* txready */
- cdcuart_txempty /* txempty */
+ NULL, /* send */
+ cdcuart_txint, /* txinit */
+ NULL, /* txready */
+ cdcuart_txempty /* txempty */
};
/****************************************************************************
@@ -2118,6 +2123,38 @@ static void cdcuart_rxint(FAR struct uart_dev_s *dev, bool enable)
}
/****************************************************************************
+ * Name: cdcuart_rxflowcontrol
+ *
+ * Description:
+ * Called when Rx buffer is full (or exceeds configured watermark levels
+ * if CONFIG_SERIAL_IFLOWCONTROL_WATERMARKS is defined).
+ * Return true if UART activated RX flow control to block more incoming
+ * data
+ *
+ * Input parameters:
+ * dev - UART device instance
+ * nbuffered - the number of characters currently buffered
+ * (if CONFIG_SERIAL_IFLOWCONTROL_WATERMARKS is
+ * not defined the value will be 0 for an empty buffer or the
+ * defined buffer size for a full buffer)
+ * upper - true indicates the upper watermark was crossed where
+ * false indicates the lower watermark has been crossed
+ *
+ * Returned Value:
+ * true if RX flow control activated.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_SERIAL_IFLOWCONTROL
+static bool cdcuart_rxflowcontrol(FAR struct uart_dev_s *dev,
+ unsigned int nbuffered, bool upper)
+{
+#warning Missing logic
+ return false;
+}
+#endif
+
+/****************************************************************************
* Name: cdcuart_txint
*
* Description: