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>