[PATCH 1/3] import acpi-fakekey tool

Keng-Yu Lin kengyu at canonical.com
Fri Jul 11 08:20:53 UTC 2014


This tool is imported from acpi-support v0.141.
The tool can find the correct input event node of
the keyboard and send a keycode to it. The keycode
value is specified as an parameter of the command.

Signed-off-by: Keng-Yu Lin <kengyu at canonical.com>
---
 debian/copyright             |  8 +++++
 debian/fwts.install          |  1 +
 debian/rules                 |  3 ++
 src/Makefile.am              |  3 +-
 src/utilities/Makefile.am    |  4 ++-
 src/utilities/acpi_fakekey.c | 77 ++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 94 insertions(+), 2 deletions(-)
 create mode 100644 src/utilities/acpi_fakekey.c

diff --git a/debian/copyright b/debian/copyright
index eaefaee..a3f1a9c 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -153,3 +153,11 @@ License: other
    United States government or any agency thereof requires an export license,
    other governmental approval, or letter of assurance, without first obtaining
    such license, approval or letter.
+
+Files: src/utilities/acpi_fakekey.c
+Copyright: 2004-2014, Canonical Ltd
+           2004, Matthew Garrett <mjg59 at srcf.ucam.org>
+           2004-2014, Thom May <thom at canonical.com>
+License: GPL-2
+ On Debian systems, the complete text of the GNU General Public
+ License can be found in `/usr/share/common-licenses/GPL-2'.
diff --git a/debian/fwts.install b/debian/fwts.install
index 2630f4e..8400417 100644
--- a/debian/fwts.install
+++ b/debian/fwts.install
@@ -4,3 +4,4 @@ usr/bin/fwts usr/bin
 usr/share/man/man1/fwts.1 usr/share/man/man1
 scripts/fwts-collect usr/bin
 usr/share/man/man1/fwts-collect.1 usr/share/man/man1
+usr/lib/fwts/acpi_fakekey usr/lib/fwts
diff --git a/debian/rules b/debian/rules
index 0887c38..5011334 100755
--- a/debian/rules
+++ b/debian/rules
@@ -21,6 +21,9 @@ override_dh_auto_install:
 override_dh_dkms:
 	dh_dkms -V $(VERSION)
 
+override_dh_auto_configure:
+	dh_auto_configure -- --libexecdir=/usr/lib/fwts
+
 override_dh_auto_test:
 ifneq ($(DEB_BUILD_ARCH),arm64)
 	dh_auto_test $@
diff --git a/src/Makefile.am b/src/Makefile.am
index ace23d6..eff1e31 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -11,7 +11,8 @@ AM_CPPFLAGS = \
 	-I$(top_srcdir)/src/acpica/source/include \
 	-I$(top_srcdir)/src/acpica/source/compiler \
 	-I$(top_srcdir)/efi_runtime \
-	-Wall -Werror -Wextra
+	-Wall -Werror -Wextra \
+	-DLIBEXECDIR='"$(libexecdir)"'
 
 bin_PROGRAMS = fwts
 
diff --git a/src/utilities/Makefile.am b/src/utilities/Makefile.am
index 01b534a..ecededa 100644
--- a/src/utilities/Makefile.am
+++ b/src/utilities/Makefile.am
@@ -1,6 +1,8 @@
 AM_CPPFLAGS = -Wall -Werror -Wextra -DDATAROOTDIR=\"$(datarootdir)\"
 
 bin_PROGRAMS = kernelscan
+libexec_PROGRAMS = acpi_fakekey
 kernelscan_SOURCES = kernelscan.c
 kernelscan_LDFLAGS = -lpcre
-
+acpi_fakekey_SOURCES = acpi_fakekey.c
+acpi_fakekey_CFLAGS = -w
diff --git a/src/utilities/acpi_fakekey.c b/src/utilities/acpi_fakekey.c
new file mode 100644
index 0000000..a2f3f85
--- /dev/null
+++ b/src/utilities/acpi_fakekey.c
@@ -0,0 +1,77 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <linux/input.h>
+
+#define TestBit(bit, array) (array[(bit) / 8] & (1 << ((bit) % 8)))
+
+int find_keyboard() {
+	int i, j;
+        int fd;
+        char filename[32];
+        char key_bitmask[(KEY_MAX + 7) / 8];
+
+        for (i=0; i<32; i++) {
+                snprintf(filename,sizeof(filename), "/dev/input/event%d", i);
+
+                fd = open(filename, O_RDWR);
+		if (fd < 0) {
+			perror("open");
+			exit(EXIT_FAILURE);
+		}
+
+                ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask);
+
+		/* We assume that anything that has an alphabetic key in the
+		   QWERTYUIOP range in it is the main keyboard. */
+		for (j = KEY_Q; j <= KEY_P; j++) {
+			if (TestBit(j, key_bitmask))
+				return fd;
+		}
+
+                close (fd);
+        }
+        return 0;
+}
+
+int main(int argc, char** argv) {
+	int fd;
+	int key;
+	struct input_event event;
+
+	if (argc == 2) {
+		key = atoi(argv[1]);
+	} else {
+		return 1;
+	}
+
+	fd = find_keyboard();
+
+	if (!fd) {
+		return 2;
+	}
+	event.type = EV_SYN;
+	event.code = SYN_REPORT;
+	event.value = 0;
+	write(fd, &event, sizeof event);
+
+	event.type = EV_KEY;
+	event.code = key;
+	event.value = 1;
+	write(fd, &event, sizeof event);
+
+	event.type = EV_KEY;
+	event.code = key;
+	event.value = 0;
+	write(fd, &event, sizeof event);
+
+	event.type = EV_SYN;
+	event.code = SYN_REPORT;
+	event.value = 0;
+	write(fd, &event, sizeof event);
+
+	return 0;
+}
+
-- 
1.9.1




More information about the fwts-devel mailing list