diff options
author | Che-Liang Chiou <clchiou@chromium.org> | 2011-07-21 17:46:52 +0800 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2011-08-29 10:59:05 -0700 |
commit | 63abb13013bd8d64abfe3ba480793dd2258f1e8f (patch) | |
tree | 71d587079a90d0f5680d16ea9b616857f4dbd426 /lib | |
parent | 60e3081050349faaf34989323535dbd19bb0d17f (diff) |
CHROMIUIM: fix VbExKeyboardRead() not returning Escape character
Another bug that was found when testing this patch: The keyboard driver
does not seem to return arrow keys.
BUG=chromium-os:17931
TEST=vbexport_test key
Tested keys:
Escape, Tab, Ctrl-D, Ctrl-U, Enter, Space
No responding keys:
Up, Down, Left, Right
Change-Id: I3aa551bd0edf62e6b9eb7b067136140a7d197b8e
Reviewed-on: http://gerrit.chromium.org/gerrit/4483
Tested-by: Che-Liang Chiou <clchiou@chromium.org>
Reviewed-by: Tom Wai-Hong Tam <waihong@chromium.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/vbexport/keyboard.c | 51 |
1 files changed, 33 insertions, 18 deletions
diff --git a/lib/vbexport/keyboard.c b/lib/vbexport/keyboard.c index 03fafad0f6a..b6ccd5adcc9 100644 --- a/lib/vbexport/keyboard.c +++ b/lib/vbexport/keyboard.c @@ -19,27 +19,42 @@ uint32_t VbExKeyboardRead(void) { - int c; + int c = 0; + /* No input available. */ if (!tstc()) - return 0; - - c = getc(); - - /* Special handle for up/down/left/right arrow keys. */ - if (c == CSI_0) { - if (getc() == CSI_1) { - c = getc(); - switch (c) { - case 'A': return VB_KEY_UP; - case 'B': return VB_KEY_DOWN; - case 'C': return VB_KEY_RIGHT; - case 'D': return VB_KEY_LEFT; - } - } - /* Filter out any speical key we don't recognize. */ - return 0; + goto out; + + /* Read a non-Escape character or a standalone Escape character. */ + if ((c = getc()) != CSI_0 || !tstc()) + goto out; + + /* Filter out non- Escape-[ sequence. */ + if (getc() != CSI_1) { + c = 0; + goto out; + } + + /* Special values for arrow up/down/left/right. */ + switch (getc()) { + case 'A': + c = VB_KEY_UP; + break; + case 'B': + c = VB_KEY_DOWN; + break; + case 'C': + c = VB_KEY_RIGHT; + break; + case 'D': + c = VB_KEY_LEFT; + break; + default: + /* Filter out speical keys that we do not recognize. */ + c = 0; + break; } +out: return c; } |