diff options
author | Thomas Huth <thuth@linux.vnet.ibm.com> | 2015-03-16 10:41:16 +0100 |
---|---|---|
committer | Alexey Kardashevskiy <aik@ozlabs.ru> | 2015-03-23 11:43:35 +1100 |
commit | 2ece1754f765a6fdf39fe7ee00307d935739480e (patch) | |
tree | ba7a74f1bbd54722fa9a3f9665bca8dee6c0c7ff /lib/libusb | |
parent | f2fb1c617317b2bff697726ed90a2a1cc87f43fe (diff) | |
download | SLOF-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.c | 30 |
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(); } |