aboutsummaryrefslogtreecommitdiff
path: root/lib/libusb
diff options
context:
space:
mode:
authorThomas Huth <thuth@linux.vnet.ibm.com>2015-03-16 10:41:16 +0100
committerAlexey Kardashevskiy <aik@ozlabs.ru>2015-03-23 11:43:35 +1100
commit2ece1754f765a6fdf39fe7ee00307d935739480e (patch)
treeba7a74f1bbd54722fa9a3f9665bca8dee6c0c7ff /lib/libusb
parentf2fb1c617317b2bff697726ed90a2a1cc87f43fe (diff)
downloadSLOF-2ece1754f765a6fdf39fe7ee00307d935739480e.zip
SLOF-2ece1754f765a6fdf39fe7ee00307d935739480e.tar.gz
SLOF-2ece1754f765a6fdf39fe7ee00307d935739480e.tar.bz2
Fix "key?" Forth word when using USB keyboards
The "key?" Forth word did not work when being used for polling keyboard events from USB keyboards since the usb_key_available() function never triggered any USB transfers. Fix it by also refactoring usb_read_keyb() a little bit so that both functions now use the same code for checking for new keyboard events. Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Diffstat (limited to 'lib/libusb')
-rw-r--r--lib/libusb/usb-hid.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/lib/libusb/usb-hid.c b/lib/libusb/usb-hid.c
index 28022d0..f0cab8a 100644
--- a/lib/libusb/usb-hid.c
+++ b/lib/libusb/usb-hid.c
@@ -416,9 +416,26 @@ int usb_hid_kbd_exit(struct usb_dev *dev)
return true;
}
+static int usb_poll_key(void *vdev)
+{
+ struct usb_dev *dev = vdev;
+ uint8_t key[8];
+ int rc;
+
+ memset(key, 0, 8);
+ rc = usb_poll_intr(dev->intr, key);
+ if (rc)
+ check_key_code(key);
+ return rc;
+}
+
unsigned char usb_key_available(void *dev)
{
- if (dev && r_ptr != w_ptr)
+ if (!dev)
+ return false;
+
+ usb_poll_key(dev);
+ if (r_ptr != w_ptr)
return true;
else
return false;
@@ -426,16 +443,11 @@ unsigned char usb_key_available(void *dev)
unsigned char usb_read_keyb(void *vdev)
{
- struct usb_dev *dev = vdev;
- uint8_t key[8];
-
- if (!dev)
+ if (!vdev)
return false;
- memset(key, 0, 8);
- while (usb_poll_intr(dev->intr, key)) {
- check_key_code(key);
- memset(key, 0, 8);
+ while (usb_poll_key(vdev)) {
+ /* loop for all pending keys */
}
return read_key();
}