Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 May 2014 12:40:08 +0400
From:      Ruslan Bukin <br@bsdpad.com>
To:        Maxim Ignatenko <gelraen.ua@gmail.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Keyboard drivers, polling vs. non-polling mode
Message-ID:  <20140513084008.GA71115@machdep.com>
In-Reply-To: <CABWTX-YViLKRS62cuWcJh=Ma_n3TjU2EEaAcijBzSFXGqiuMDQ@mail.gmail.com>
References:  <CABWTX-YViLKRS62cuWcJh=Ma_n3TjU2EEaAcijBzSFXGqiuMDQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--X1bOJ3K7DJ5YkBrT
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline

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

--X1bOJ3K7DJ5YkBrT
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="patch.polling"

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);

--X1bOJ3K7DJ5YkBrT--




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20140513084008.GA71115>