--- /dev/null
+The double-pressing plaguing the Motorola Milestone 2 is a software-bug, as
+Motorola forgot to enable the generic android gpio debounce code in their
+keyboard-driver.
+
+When looking at the Motorola Milestone 2 kernel, which is available at
+https://opensource.motorola.com/sf/projects/milestone (Milestone-2 2.2.16,
+kernel.tar.gz), the following code can be found in the file
+arch/arm/mach-omap2/board-sholes-keypad.c:
+[CODE]
+static struct gpio_event_matrix_info sholes_keypad_matrix_info = {
+ .info.func = gpio_event_matrix_func,
+ .keymap = sholes_p3_keymap,
+ .output_gpios = sholes_col_gpios,
+ .input_gpios = sholes_row_gpios,
+ .noutputs = ARRAY_SIZE(sholes_col_gpios),
+ .ninputs = ARRAY_SIZE(sholes_row_gpios),
+ .settle_time.tv.nsec = 40 * NSEC_PER_USEC,
+ .poll_time.tv.nsec = 20 * NSEC_PER_MSEC,
+ .flags = GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_REMOVE_PHANTOM_KEYS |
+ GPIOKPF_PRINT_UNMAPPED_KEYS /*| GPIOKPF_PRINT_MAPPED_KEYS*/
+};
+[/CODE]
+
+But the header defining this struct (include/linux/gpio_event.h) adds another
+very interesting member:
+[CODE]
+struct gpio_event_matrix_info {
+ ...
+ ktime_t debounce_delay;
+ ...
+};
+[/CODE]
+
+This debounce_delay is 0 as it is never initialized, and so the debouncing code
+in drivers/input/misc/gpio_matrix.c does nothing. The easy fix for this problem
+would be to recompile the kernel and set this member to the value used in other
+android handsets (5ms). But "thanks" to the locked bootloader this is
+impossible.
+
+So the only solution to this is an ugly hack, which searches for the structure
+in memory and sets debounce_delay to an useful value. I have written a
+kernel-module which does just that. It's code can be found at:
+http://git.zerfleddert.de/cgi-bin/gitweb.cgi/ms2-fixes
+(And this is its README file)
+
+As I assume not everybody wants to go through the pain of setting up a
+toolchain which can be used to compile modules for the motorola kernel, I have
+also uploaded a precompiled version of the module at
+http://rmdir.de/~michael/ms2-fixes/debounce.ko
+
+This version should work at least on MS2 2.2.16 and MS2 2.4.24 (which I am
+using), as I have built it against the 2.2.16 kernel sources (which are the
+only ones I can find)
+
+To use this module, you need a rooted phone. Copy the module to /tmp and run
+"insmod /tmp/debounce.ko".
+After that, you should see the following output in "dmesg":
+[CODE]
+<6>[ 1226.493377] Searching for gpio-event...
+<6>[ 1226.493804] Found it!
+<6>[ 1226.494079] And there is a sholes-keypad connected...
+<6>[ 1226.494842] settle_time: 40000
+<6>[ 1226.495117] poll_time: 20000000
+<6>[ 1226.495391] debounce_delay: 0
+<6>[ 1226.495635] Activating debounce!
+<6>[ 1226.496917] debounce_delay: 5000000
+[/CODE]
+
+Please test this module and see if it fixes your keyboard problems. (I have
+only slight double-presses, which are not really reproducible (but I had none
+since activating the debouncing)). I would be happy to hear that it works for
+other people, too.
+
+Thanks Motorola for making our lives so easy with a locked bootloader!
+
+Michael Gernoth <michael@gernoth.net>