expo: Speed up polling the keyboard

The current algorithm spends 10ms or more looking for keyboard input.
Since we expect the frame rate to be 50 or more, it should be OK to only
check once.

Handle the timeout by recording the timestamp of the last key and timing
out the CLI entry after 10ms. This allows an 'Escape' key to work,
rather than it just waiting forever for a terminal sequence that starts
with escape.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2025-10-05 14:09:22 -06:00
parent 90e109789e
commit a5c5b3b2fb
2 changed files with 10 additions and 8 deletions

View File

@@ -16,6 +16,7 @@
#include <mapmem.h>
#include <menu.h>
#include <mouse.h>
#include <time.h>
#include <video.h>
#include <watchdog.h>
#include <linux/delay.h>
@@ -45,6 +46,7 @@ int expo_new(const char *name, void *priv, struct expo **expp)
INIT_LIST_HEAD(&exp->str_head);
exp->next_id = EXPOID_BASE_ID;
cli_ch_init(&exp->cch);
exp->last_key_ms = get_timer(0);
*expp = exp;
@@ -488,21 +490,19 @@ static int poll_keys(struct expo *exp)
ichar = cli_ch_process(&exp->cch, 0);
if (!ichar) {
int i;
for (i = 0; i < 10 && !ichar && !tstc(); i++) {
schedule();
mdelay(2);
ichar = cli_ch_process(&exp->cch, -ETIMEDOUT);
}
while (!ichar && tstc()) {
/* Check once for available input */
if (tstc()) {
ichar = getchar();
ichar = cli_ch_process(&exp->cch, ichar);
}
if (!ichar && get_timer(exp->last_key_ms) >= 10)
ichar = cli_ch_process(&exp->cch, -ETIMEDOUT);
}
key = 0;
if (ichar) {
exp->last_key_ms = get_timer(0);
key = bootmenu_conv_key(ichar);
if (key == BKEY_NONE || key >= BKEY_FIRST_EXTRA)
key = ichar;

View File

@@ -146,6 +146,7 @@ struct expo_theme {
* @scene_head: List of scenes
* @str_head: list of strings
* @cch: Keyboard context for input
* @last_key_ms: timestamp of the last key received
*/
struct expo {
char *name;
@@ -173,6 +174,7 @@ struct expo {
struct list_head scene_head;
struct list_head str_head;
struct cli_ch_state cch;
ulong last_key_ms;
};
/**