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