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