From 0e6621387a1b415e377fca1b60d70d25366e1680 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sat, 10 Aug 2013 19:21:39 -0600 Subject: Added FIONREAD and FIONWRITE to CDC/ACM driver. From Lorenz Meier --- nuttx/ChangeLog | 3 +++ nuttx/drivers/usbdev/cdcacm.c | 46 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index 7fc5d0a04..b6c9bcb89 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -5347,3 +5347,6 @@ added TERMIOS input / output processing support for UART and CDCACM serial ports. Implemented by Mike Smith, Andrew Tridgell and Lorenz Meier (2013-8-10). + * drivers/usbdev/cdcacm.c: Added FIONREAD and FIONWRITE to CDC/ACM + driver based on serial.c implementation. From Lorenz Meier + (2013-8-10). diff --git a/nuttx/drivers/usbdev/cdcacm.c b/nuttx/drivers/usbdev/cdcacm.c index 441ac907e..dcd5b9aa1 100644 --- a/nuttx/drivers/usbdev/cdcacm.c +++ b/nuttx/drivers/usbdev/cdcacm.c @@ -1937,6 +1937,52 @@ static int cdcuart_ioctl(FAR struct file *filep,int cmd,unsigned long arg) break; #endif + case FIONREAD: + { + int count; + irqstate_t state = irqsave(); + + /* Determine the number of bytes available in the buffer. */ + + if (serdev->recv.tail <= serdev->recv.head) + { + count = serdev->recv.head - serdev->recv.tail; + } + else + { + count = serdev->recv.size - (serdev->recv.tail - serdev->recv.head); + } + + irqrestore(state); + + *(int *)arg = count; + ret = 0; + } + break; + + case FIONWRITE: + { + int count; + irqstate_t state = irqsave(); + + /* Determine the number of bytes free in the buffer. */ + + if (serdev->xmit.head < serdev->xmit.tail) + { + count = serdev->xmit.tail - serdev->xmit.head - 1; + } + else + { + count = serdev->xmit.size - (serdev->xmit.head - serdev->xmit.tail) - 1; + } + + irqrestore(state); + + *(int *)arg = count; + ret = 0; + } + break; + default: ret = -ENOTTY; break; -- cgit v1.2.3