summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Mittelberg <bmbm@google.com>2021-04-13 22:49:42 +0000
committerCommit Bot <commit-bot@chromium.org>2021-05-10 22:34:46 +0000
commitfa985803d6bd7c76b8eddc49d1bab4434cc545f3 (patch)
treeff2645c8fdd0c8c36a68d89b3e4536f2bc538643
parent3a2f77758104a581ade2ecb406b8d099eada6a90 (diff)
downloadchrome-ec-fa985803d6bd7c76b8eddc49d1bab4434cc545f3.tar.gz
mkbp: Move key simulation to input devices
Today some platforms include MKBP_KEYBOARD because they use side buttons, switches or other events that share the same driver with MKBP keyboard. Those platforms don't enable KEYSCAN task. The CL is moving key emulation functionality to MKBP input devices, to make a clear separation between the real keyboard usage and emulation/buttons/switches/etc. All boards that were selecting `CONFIG_KEYBOARD_PROTOCOL_MKBP` without KEYSCAN task are now updated to select `CONFIG_MKBP_INPUT_DEVICES` BUG=b:170966461 BRANCH=main,firmware-dedede-13606.B,firmware-volteer-13672.B-main TEST=None Signed-off-by: Boris Mittelberg <bmbm@google.com> Change-Id: I515140ebf6e175f4b29991329f92266ffca232a8 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2824044
-rw-r--r--baseboard/kalista/baseboard.h2
-rw-r--r--baseboard/kukui/baseboard.h2
-rw-r--r--baseboard/trogdor/baseboard.h2
-rw-r--r--board/ambassador/board.h2
-rw-r--r--board/cheza/board.h2
-rw-r--r--board/coachz/board.h2
-rw-r--r--board/dooly/board.h2
-rw-r--r--board/endeavour/board.h2
-rw-r--r--board/fizz/board.h2
-rw-r--r--board/flapjack/board.h2
-rw-r--r--board/genesis/board.h2
-rw-r--r--board/homestar/board.h2
-rw-r--r--board/kakadu/board.h1
-rw-r--r--board/katsu/board.h1
-rw-r--r--board/kodama/board.h1
-rw-r--r--board/kukui/board.h1
-rw-r--r--board/lazor/board.h1
-rw-r--r--board/marzipan/board.h1
-rw-r--r--board/nocturne/board.h2
-rw-r--r--board/pompom/board.h1
-rw-r--r--board/poppy/board.h2
-rw-r--r--board/puff/board.h2
-rw-r--r--board/rainier/board.h2
-rw-r--r--board/scarlet/board.h3
-rw-r--r--board/trogdor/board.h1
-rw-r--r--common/keyboard_mkbp.c66
-rw-r--r--common/mkbp_input_devices.c67
27 files changed, 94 insertions, 82 deletions
diff --git a/baseboard/kalista/baseboard.h b/baseboard/kalista/baseboard.h
index 5cda6c310c..7579acd2d7 100644
--- a/baseboard/kalista/baseboard.h
+++ b/baseboard/kalista/baseboard.h
@@ -25,7 +25,7 @@
#define CONFIG_DEDICATED_RECOVERY_BUTTON
#define CONFIG_EMULATED_SYSRQ
#define CONFIG_LED_COMMON
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_USE_HOST_EVENT
#define CONFIG_DPTF
#define CONFIG_FLASH_SIZE_BYTES 0x80000
diff --git a/baseboard/kukui/baseboard.h b/baseboard/kukui/baseboard.h
index 9aa1362534..f4869ce943 100644
--- a/baseboard/kukui/baseboard.h
+++ b/baseboard/kukui/baseboard.h
@@ -239,8 +239,6 @@
#undef CONFIG_PSTORE
#define CONFIG_TASK_PROFILING
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
-#define CONFIG_MKBP_EVENT
#define CONFIG_MKBP_USE_GPIO
/*
diff --git a/baseboard/trogdor/baseboard.h b/baseboard/trogdor/baseboard.h
index 8e3dbe4b1e..570bf16f83 100644
--- a/baseboard/trogdor/baseboard.h
+++ b/baseboard/trogdor/baseboard.h
@@ -44,8 +44,6 @@
#define CONFIG_HOSTCMD_SPS
#define CONFIG_HOST_COMMAND_STATUS
#define CONFIG_HOSTCMD_SECTION_SORTED
-#define CONFIG_MKBP_EVENT
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
#define CONFIG_KEYBOARD_COL2_INVERTED
#define CONFIG_MKBP_USE_GPIO
diff --git a/board/ambassador/board.h b/board/ambassador/board.h
index d44a0ec681..52412b4bfe 100644
--- a/board/ambassador/board.h
+++ b/board/ambassador/board.h
@@ -34,7 +34,7 @@
#define CONFIG_CROS_BOARD_INFO
#define CONFIG_EMULATED_SYSRQ
#undef CONFIG_KEYBOARD_BOOT_KEYS
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_USE_HOST_EVENT
#undef CONFIG_KEYBOARD_RUNTIME_KEYS
#undef CONFIG_HIBERNATE
diff --git a/board/cheza/board.h b/board/cheza/board.h
index 45a1927c82..f30219aaf5 100644
--- a/board/cheza/board.h
+++ b/board/cheza/board.h
@@ -54,7 +54,7 @@
#define CONFIG_HOST_COMMAND_STATUS
#define CONFIG_HOSTCMD_SECTION_SORTED /* Host commands are sorted. */
#define CONFIG_MKBP_EVENT
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_USE_GPIO
#define CONFIG_BOARD_VERSION_GPIO
diff --git a/board/coachz/board.h b/board/coachz/board.h
index f60ce352d9..268dcb5b89 100644
--- a/board/coachz/board.h
+++ b/board/coachz/board.h
@@ -51,6 +51,8 @@
#define CONFIG_GMR_TABLET_MODE
#define CONFIG_FRONT_PROXIMITY_SWITCH
+#define CONFIG_MKBP_INPUT_DEVICES
+
#define CONFIG_DETACHABLE_BASE
#define CONFIG_BASE_ATTACHED_SWITCH
diff --git a/board/dooly/board.h b/board/dooly/board.h
index 6043ad6aeb..51259c006b 100644
--- a/board/dooly/board.h
+++ b/board/dooly/board.h
@@ -69,7 +69,7 @@
#define CONFIG_CROS_BOARD_INFO
#define CONFIG_EMULATED_SYSRQ
#undef CONFIG_KEYBOARD_BOOT_KEYS
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_USE_HOST_EVENT
#undef CONFIG_KEYBOARD_RUNTIME_KEYS
#undef CONFIG_HIBERNATE
diff --git a/board/endeavour/board.h b/board/endeavour/board.h
index a3d871604f..eca98dad6d 100644
--- a/board/endeavour/board.h
+++ b/board/endeavour/board.h
@@ -24,7 +24,7 @@
#define CONFIG_DEDICATED_RECOVERY_BUTTON
#define CONFIG_EMULATED_SYSRQ
#define CONFIG_LED_COMMON
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_USE_HOST_EVENT
#define CONFIG_DPTF
#define CONFIG_FLASH_SIZE_BYTES 0x80000
diff --git a/board/fizz/board.h b/board/fizz/board.h
index da48944973..160680edb6 100644
--- a/board/fizz/board.h
+++ b/board/fizz/board.h
@@ -25,7 +25,7 @@
#define CONFIG_DEDICATED_RECOVERY_BUTTON
#define CONFIG_EMULATED_SYSRQ
#define CONFIG_LED_COMMON
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_USE_HOST_EVENT
#define CONFIG_DPTF
#define CONFIG_FLASH_SIZE_BYTES 0x80000
diff --git a/board/flapjack/board.h b/board/flapjack/board.h
index 4d077ad21d..be9ec8b9b4 100644
--- a/board/flapjack/board.h
+++ b/board/flapjack/board.h
@@ -251,7 +251,7 @@
/* Enable Accel over SPI */
#define CONFIG_SPI_ACCEL_PORT 0 /* The first SPI master port (SPI2) */
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_EVENT
#define CONFIG_MKBP_USE_GPIO
/* Define the host events which are allowed to wakeup AP in S3. */
diff --git a/board/genesis/board.h b/board/genesis/board.h
index de82b84540..b380ac28f9 100644
--- a/board/genesis/board.h
+++ b/board/genesis/board.h
@@ -34,7 +34,7 @@
#define CONFIG_CROS_BOARD_INFO
#define CONFIG_EMULATED_SYSRQ
#undef CONFIG_KEYBOARD_BOOT_KEYS
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_USE_HOST_EVENT
#undef CONFIG_KEYBOARD_RUNTIME_KEYS
#undef CONFIG_HIBERNATE
diff --git a/board/homestar/board.h b/board/homestar/board.h
index 12bfb53879..4267d8bacb 100644
--- a/board/homestar/board.h
+++ b/board/homestar/board.h
@@ -71,6 +71,8 @@
#define GMR_TABLET_MODE_GPIO_L GPIO_LID_OPEN_EC
#define GPIO_SWITCHCAP_PG_INT_L GPIO_LN9310_INT
+#define CONFIG_MKBP_INPUT_DEVICES
+
#ifndef __ASSEMBLER__
#include "gpio_signal.h"
diff --git a/board/kakadu/board.h b/board/kakadu/board.h
index 2dd4ff2c5d..6cecfaed2b 100644
--- a/board/kakadu/board.h
+++ b/board/kakadu/board.h
@@ -65,6 +65,7 @@
EC_HOST_EVENT_MASK(EC_HOST_EVENT_MODE_CHANGE))
/* MKBP */
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_EVENT
#define CONFIG_MKBP_EVENT_WAKEUP_MASK \
(BIT(EC_MKBP_EVENT_SENSOR_FIFO) | BIT(EC_MKBP_EVENT_HOST_EVENT))
diff --git a/board/katsu/board.h b/board/katsu/board.h
index 44d6e9de59..bdc552a9c5 100644
--- a/board/katsu/board.h
+++ b/board/katsu/board.h
@@ -65,6 +65,7 @@
EC_HOST_EVENT_MASK(EC_HOST_EVENT_MODE_CHANGE))
/* MKBP */
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_EVENT
#define CONFIG_MKBP_EVENT_WAKEUP_MASK \
(BIT(EC_MKBP_EVENT_SENSOR_FIFO) | BIT(EC_MKBP_EVENT_HOST_EVENT))
diff --git a/board/kodama/board.h b/board/kodama/board.h
index 60bace8cc8..98e9b219ac 100644
--- a/board/kodama/board.h
+++ b/board/kodama/board.h
@@ -63,6 +63,7 @@
#define I2C_PORT_VIRTUAL_BATTERY I2C_PORT_BATTERY
/* Define the host events which are allowed to wakeup AP in S3. */
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_HOST_EVENT_WAKEUP_MASK \
(EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_OPEN) |\
EC_HOST_EVENT_MASK(EC_HOST_EVENT_POWER_BUTTON))
diff --git a/board/kukui/board.h b/board/kukui/board.h
index 28f0c80cf1..bbb66d4e41 100644
--- a/board/kukui/board.h
+++ b/board/kukui/board.h
@@ -94,6 +94,7 @@
EC_HOST_EVENT_MASK(EC_HOST_EVENT_MODE_CHANGE))
/* MKBP */
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_EVENT
#define CONFIG_MKBP_EVENT_WAKEUP_MASK \
(BIT(EC_MKBP_EVENT_SENSOR_FIFO) | BIT(EC_MKBP_EVENT_HOST_EVENT))
diff --git a/board/lazor/board.h b/board/lazor/board.h
index 3a1edee983..d4f4426d05 100644
--- a/board/lazor/board.h
+++ b/board/lazor/board.h
@@ -17,6 +17,7 @@
#define CONFIG_LN9310
/* Keyboard */
+#define CONFIG_KEYBOARD_PROTOCOL_MKBP
#define CONFIG_KEYBOARD_BOARD_CONFIG
#define CONFIG_PWM_KBLIGHT
diff --git a/board/marzipan/board.h b/board/marzipan/board.h
index bc070bc02f..54054456eb 100644
--- a/board/marzipan/board.h
+++ b/board/marzipan/board.h
@@ -14,6 +14,7 @@
#define CONFIG_FLASH_SIZE_BYTES (512 * 1024) /* 512KB internal spi flash */
/* Keyboard */
+#define CONFIG_KEYBOARD_PROTOCOL_MKBP
#define CONFIG_KEYBOARD_BOARD_CONFIG
#define CONFIG_PWM_KBLIGHT
diff --git a/board/nocturne/board.h b/board/nocturne/board.h
index 046b41d7db..a009cc118a 100644
--- a/board/nocturne/board.h
+++ b/board/nocturne/board.h
@@ -89,7 +89,7 @@
/* MKBP */
#define CONFIG_MKBP_EVENT
#define CONFIG_MKBP_EVENT_WAKEUP_MASK (1<<EC_MKBP_EVENT_SWITCH)
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_USE_GPIO_AND_HOST_EVENT
/* Sensors */
diff --git a/board/pompom/board.h b/board/pompom/board.h
index 8152d7f113..6cbe7a4d27 100644
--- a/board/pompom/board.h
+++ b/board/pompom/board.h
@@ -15,6 +15,7 @@
#define CONFIG_FLASH_SIZE_BYTES (512 * 1024) /* 512KB internal spi flash */
/* Keyboard */
+#define CONFIG_KEYBOARD_PROTOCOL_MKBP
#define CONFIG_KEYBOARD_BOARD_CONFIG
#define CONFIG_KEYBOARD_REFRESH_ROW3
#define CONFIG_PWM_KBLIGHT
diff --git a/board/poppy/board.h b/board/poppy/board.h
index 607108a8e5..7f0b3eb95a 100644
--- a/board/poppy/board.h
+++ b/board/poppy/board.h
@@ -120,7 +120,7 @@
#define CONFIG_TEMP_SENSOR_BD99992GW
#define CONFIG_THERMISTOR_NCP15WB
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_EVENT
#define CONFIG_MKBP_USE_HOST_EVENT
#define CONFIG_ACCELGYRO_BMI160
diff --git a/board/puff/board.h b/board/puff/board.h
index 10885d8449..11d6deaae3 100644
--- a/board/puff/board.h
+++ b/board/puff/board.h
@@ -34,7 +34,7 @@
#define CONFIG_CROS_BOARD_INFO
#define CONFIG_EMULATED_SYSRQ
#undef CONFIG_KEYBOARD_BOOT_KEYS
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_USE_HOST_EVENT
#undef CONFIG_KEYBOARD_RUNTIME_KEYS
#undef CONFIG_HIBERNATE
diff --git a/board/rainier/board.h b/board/rainier/board.h
index 20c0de975e..01a9950af9 100644
--- a/board/rainier/board.h
+++ b/board/rainier/board.h
@@ -131,7 +131,7 @@
/* Enable Accel over SPI */
#define CONFIG_SPI_ACCEL_PORT 0 /* The first SPI master port (SPI2) */
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_EVENT
#define CONFIG_MKBP_USE_GPIO
/* Define the host events which are allowed to wakeup AP in S3. */
diff --git a/board/scarlet/board.h b/board/scarlet/board.h
index 12d4d14c87..318ec0911d 100644
--- a/board/scarlet/board.h
+++ b/board/scarlet/board.h
@@ -181,7 +181,8 @@
/* Enable Accel over SPI */
#define CONFIG_SPI_ACCEL_PORT 0 /* The first SPI master port (SPI2) */
-#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_KEYBOARD_PROTOCOL_
+#define CONFIG_MKBP_INPUT_DEVICES
#define CONFIG_MKBP_EVENT
#define CONFIG_MKBP_USE_GPIO
/* Define the host events which are allowed to wakeup AP in S3. */
diff --git a/board/trogdor/board.h b/board/trogdor/board.h
index f41c5d2fe6..1fe7668d39 100644
--- a/board/trogdor/board.h
+++ b/board/trogdor/board.h
@@ -25,6 +25,7 @@
#define CONFIG_FLASH_SIZE_BYTES (512 * 1024) /* 512KB internal spi flash */
/* Keyboard */
+#define CONFIG_KEYBOARD_PROTOCOL_MKBP
#define CONFIG_KEYBOARD_BOARD_CONFIG
#define CONFIG_PWM_KBLIGHT
diff --git a/common/keyboard_mkbp.c b/common/keyboard_mkbp.c
index eabb4c5829..d8e9f8d909 100644
--- a/common/keyboard_mkbp.c
+++ b/common/keyboard_mkbp.c
@@ -31,9 +31,7 @@
#define BATTERY_KEY_ROW_MASK BIT(BATTERY_KEY_ROW)
#ifndef HAS_TASK_KEYSCAN
-/* Keys simulated-pressed */
-static uint8_t __bss_slow simulated_key[KEYBOARD_COLS_MAX];
-uint8_t keyboard_cols = KEYBOARD_COLS_MAX;
+#error "Task KEYSCAN has to be enabled for MKBP keyboard"
#endif /* !defined(HAS_TASK_KEYSCAN) */
/* Config for mkbp protocol; does not include fields from scan config */
@@ -98,67 +96,6 @@ void keyboard_send_battery_key(void)
void clear_typematic_key(void)
{ }
-#ifndef HAS_TASK_KEYSCAN
-/* For boards without a keyscan task, try and simulate keyboard presses. */
-static void simulate_key(int row, int col, int pressed)
-{
- if ((simulated_key[col] & BIT(row)) == ((pressed ? 1 : 0) << row))
- return; /* No change */
-
- simulated_key[col] &= ~BIT(row);
- if (pressed)
- simulated_key[col] |= BIT(row);
-
- mkbp_keyboard_add(simulated_key);
-}
-
-static int command_mkbp_keyboard_press(int argc, char **argv)
-{
- if (argc == 1) {
- int i, j;
-
- ccputs("Simulated keys:\n");
- for (i = 0; i < keyboard_cols; ++i) {
- if (simulated_key[i] == 0)
- continue;
- for (j = 0; j < KEYBOARD_ROWS; ++j)
- if (simulated_key[i] & BIT(j))
- ccprintf("\t%d %d\n", i, j);
- }
-
- } else if (argc == 3 || argc == 4) {
- int r, c, p;
- char *e;
-
- c = strtoi(argv[1], &e, 0);
- if (*e || c < 0 || c >= keyboard_cols)
- return EC_ERROR_PARAM1;
-
- r = strtoi(argv[2], &e, 0);
- if (*e || r < 0 || r >= KEYBOARD_ROWS)
- return EC_ERROR_PARAM2;
-
- if (argc == 3) {
- /* Simulate a press and release */
- simulate_key(r, c, 1);
- simulate_key(r, c, 0);
- } else {
- p = strtoi(argv[3], &e, 0);
- if (*e || p < 0 || p > 1)
- return EC_ERROR_PARAM3;
-
- simulate_key(r, c, p);
- }
- }
-
- return EC_SUCCESS;
-}
-DECLARE_CONSOLE_COMMAND(kbpress, command_mkbp_keyboard_press,
- "[col row [0 | 1]]",
- "Simulate keypress");
-#endif /* !defined(HAS_TASK_KEYSCAN) */
-
-#ifdef HAS_TASK_KEYSCAN
static void set_keyscan_config(const struct ec_mkbp_config *src,
struct ec_mkbp_protocol_config *dst,
uint32_t valid_mask, uint8_t new_flags)
@@ -285,4 +222,3 @@ host_command_mkbp_get_config(struct host_cmd_handler_args *args)
DECLARE_HOST_COMMAND(EC_CMD_MKBP_GET_CONFIG,
host_command_mkbp_get_config,
EC_VER_MASK(0));
-#endif /* HAS_TASK_KEYSCAN */
diff --git a/common/mkbp_input_devices.c b/common/mkbp_input_devices.c
index 56d2234775..e058c9d320 100644
--- a/common/mkbp_input_devices.c
+++ b/common/mkbp_input_devices.c
@@ -11,6 +11,7 @@
#include "hooks.h"
#include "host_command.h"
#include "keyboard_mkbp.h"
+#include "keyboard_scan.h"
#include "lid_switch.h"
#include "mkbp_event.h"
#include "mkbp_fifo.h"
@@ -176,3 +177,69 @@ static int sysrq_get_next_event(uint8_t *out)
}
DECLARE_EVENT_SOURCE(EC_MKBP_EVENT_SYSRQ, sysrq_get_next_event);
#endif
+
+/************************ Keyboard press simulation ************************/
+#ifndef HAS_TASK_KEYSCAN
+/* Keys simulated-pressed */
+static uint8_t __bss_slow simulated_key[KEYBOARD_COLS_MAX];
+uint8_t keyboard_cols = KEYBOARD_COLS_MAX;
+
+/* For boards without a keyscan task, try and simulate keyboard presses. */
+static void simulate_key(int row, int col, int pressed)
+{
+ if ((simulated_key[col] & BIT(row)) == ((pressed ? 1 : 0) << row))
+ return; /* No change */
+
+ simulated_key[col] &= ~BIT(row);
+ if (pressed)
+ simulated_key[col] |= BIT(row);
+
+ mkbp_fifo_add((uint8_t)EC_MKBP_EVENT_KEY_MATRIX, simulated_key);
+}
+
+static int command_mkbp_keyboard_press(int argc, char **argv)
+{
+ if (argc == 1) {
+ int i, j;
+
+ ccputs("Simulated keys:\n");
+ for (i = 0; i < keyboard_cols; ++i) {
+ if (simulated_key[i] == 0)
+ continue;
+ for (j = 0; j < KEYBOARD_ROWS; ++j)
+ if (simulated_key[i] & BIT(j))
+ ccprintf("\t%d %d\n", i, j);
+ }
+
+ } else if (argc == 3 || argc == 4) {
+ int r, c, p;
+ char *e;
+
+ c = strtoi(argv[1], &e, 0);
+ if (*e || c < 0 || c >= keyboard_cols)
+ return EC_ERROR_PARAM1;
+
+ r = strtoi(argv[2], &e, 0);
+ if (*e || r < 0 || r >= KEYBOARD_ROWS)
+ return EC_ERROR_PARAM2;
+
+ if (argc == 3) {
+ /* Simulate a press and release */
+ simulate_key(r, c, 1);
+ simulate_key(r, c, 0);
+ } else {
+ p = strtoi(argv[3], &e, 0);
+ if (*e || p < 0 || p > 1)
+ return EC_ERROR_PARAM3;
+
+ simulate_key(r, c, p);
+ }
+ }
+
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(kbpress, command_mkbp_keyboard_press,
+ "[col row [0 | 1]]",
+ "Simulate keypress");
+
+#endif /* !defined(HAS_TASK_KEYSCAN) */