Keyboard drivers, polling vs. non-polling mode
Ruslan Bukin
br at bsdpad.com
Tue May 13 08:42:07 UTC 2014
On Sun, May 11, 2014 at 11:33:42PM +0100, Maxim Ignatenko wrote:
> Hello,
>
> I'm trying trying to get keyboard working in DDB on HP Chromebook 11 (ARM).
> br@ said that it doesn't work there because polling mode is not implemented yet.
> Where can I read about the difference between polling and non-polling
> modes (and about keyboard drivers in general)?
> sys/dev/kbd/kbdreg.h describes some structures and method signatures,
> but I have no clue what is the expected behaviour of those methods.
>
> My current guess is that in polling mode keyboard driver just queues
> up all the input coming from keyboard and then gives it to consumer
> upon request, while in non-polling mode it invokes some callback
> instead of queueing. But I cannot find any documentation to confirm or
> disprove that.
>
Chrome Embedded Controller (EC) provides interrupt (KB_GPIO_INT pin, active low)
reporting that there are pending data and you need to read the data using
ec_command(..). After all data was read, pin comes to 1 (not active).
We have no interrupts in KDB, so you have to check pin status manually and
if status == 0 (active) then read new data.
Probably you can start with patch attached (I did't tested).
-Ruslan
-------------- next part --------------
Index: sys/arm/samsung/exynos/chrome_kb.c
===================================================================
--- sys/arm/samsung/exynos/chrome_kb.c (revision 265947)
+++ sys/arm/samsung/exynos/chrome_kb.c (working copy)
@@ -131,6 +131,8 @@
int rows;
int cols;
device_t dev;
+ device_t gpio_dev;
+
struct thread *sc_poll_thread;
uint8_t *scan_local;
@@ -331,6 +333,7 @@
uint16_t key;
int oldbit;
int newbit;
+ int status;
sc = kbd->kb_data;
@@ -347,7 +350,11 @@
};
if (sc->sc_flags & CKB_FLAG_POLLING) {
- /* TODO */
+ GPIO_PIN_GET(sc->gpio_dev, KB_GPIO_INT, &status);
+ if (status == 0) {
+ ec_command(EC_CMD_MKBP_STATE, sc->scan, sc->cols,
+ sc->scan, sc->cols);
+ }
};
for (i = 0; i < sc->cols; i++) {
@@ -710,6 +717,12 @@
if ((error = parse_dts(sc)) != 0)
return error;
+ sc->gpio_dev = devclass_get_device(devclass_find("gpio"), 0);
+ if (sc->gpio_dev == NULL) {
+ device_printf(sc->dev, "cant find gpio_dev\n");
+ return (1);
+ }
+
#if 0
device_printf(sc->dev, "Keyboard matrix [%dx%d]\n",
sc->cols, sc->rows);
More information about the freebsd-hackers
mailing list