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>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
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
[-- Attachment #2 --]
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);
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20140513084008.GA71115>
