summaryrefslogtreecommitdiff
path: root/nuttx/drivers/usbhost/usbhost_hidkbd.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-12-26 20:04:57 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-12-26 20:04:57 +0000
commitc034173c00669e4f09c5156a0057446cfef927e5 (patch)
treed4315b9b45a76609892f82fed62952c35ce86c64 /nuttx/drivers/usbhost/usbhost_hidkbd.c
parentef1e66396e1872543fa7c30e1535eecad6725bcb (diff)
downloadnuttx-c034173c00669e4f09c5156a0057446cfef927e5.tar.gz
nuttx-c034173c00669e4f09c5156a0057446cfef927e5.tar.bz2
nuttx-c034173c00669e4f09c5156a0057446cfef927e5.zip
Add UG_2965SWEG01 driver from Darcy Gong; fix logic error in how waiters are reawakened in the USB HID keyboard driver
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5462 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/drivers/usbhost/usbhost_hidkbd.c')
-rw-r--r--nuttx/drivers/usbhost/usbhost_hidkbd.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/nuttx/drivers/usbhost/usbhost_hidkbd.c b/nuttx/drivers/usbhost/usbhost_hidkbd.c
index e0c4680eb..5022793ca 100644
--- a/nuttx/drivers/usbhost/usbhost_hidkbd.c
+++ b/nuttx/drivers/usbhost/usbhost_hidkbd.c
@@ -1027,6 +1027,7 @@ static int usbhost_kbdpoll(int argc, char *argv[])
/* Loop here until the device is disconnected */
uvdbg("Entering poll loop\n");
+
while (!priv->disconnected)
{
/* Make sure that we have exclusive access to the private data
@@ -1169,10 +1170,10 @@ static int usbhost_kbdpoll(int argc, char *argv[])
#endif
}
- /* Did we just transition from no data available to data available? */
+ /* Is there data available? */
newstate = (priv->headndx == priv->tailndx);
- if (empty && !newstate)
+ if (!newstate)
{
/* Yes.. Is there a thread waiting for keyboard data now? */
@@ -1184,9 +1185,15 @@ static int usbhost_kbdpoll(int argc, char *argv[])
priv->waiting = false;
}
- /* And wake up any threads waiting for the POLLIN event */
+ /* Did we just transition from no data available to data
+ * available? If so, wake up any threads waiting for the
+ * POLLIN event.
+ */
- usbhost_pollnotify(priv);
+ if (empty)
+ {
+ usbhost_pollnotify(priv);
+ }
}
empty = newstate;
@@ -2146,6 +2153,7 @@ static ssize_t usbhost_read(FAR struct file *filep, FAR char *buffer, size_t len
/* Wait for data to be available */
uvdbg("Waiting...\n");
+
priv->waiting = true;
usbhost_givesem(&priv->exclsem);
usbhost_takesem(&priv->waitsem);