1、虚拟键盘驱动
文件位置:kernel/drivers/input/keyboard/zebra_key.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/input.h>
#define DEVICE_NAME "zebra_key"
#define NR_SCANCODES 256
struct input_dev *key_input_dev;
static const unsigned short dc_kbd_keycode[NR_SCANCODES] = {
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_A, KEY_B,
KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L,
KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V,
KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6,
KEY_7, KEY_8, KEY_9, KEY_0, KEY_ENTER, KEY_ESC, KEY_BACKSPACE,
KEY_TAB, KEY_SPACE, KEY_MINUS, KEY_EQUAL, KEY_LEFTBRACE,
KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_BACKSLASH, KEY_SEMICOLON,
KEY_APOSTROPHE, KEY_GRAVE, KEY_COMMA, KEY_DOT, KEY_SLASH,
KEY_CAPSLOCK, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6,
KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_SYSRQ,
KEY_SCROLLLOCK, KEY_PAUSE, KEY_INSERT, KEY_HOME, KEY_PAGEUP,
KEY_DELETE, KEY_END, KEY_PAGEDOWN, KEY_RIGHT, KEY_LEFT, KEY_DOWN,
KEY_UP, KEY_NUMLOCK, KEY_KPSLASH, KEY_KPASTERISK, KEY_KPMINUS,
KEY_KPPLUS, KEY_KPENTER, KEY_KP1, KEY_KP2, KEY_KP3, KEY_KP4, KEY_KP5,
KEY_KP6, KEY_KP7, KEY_KP8, KEY_KP9, KEY_KP0, KEY_KPDOT, KEY_102ND,
KEY_COMPOSE, KEY_POWER, KEY_KPEQUAL, KEY_F13, KEY_F14, KEY_F15,
KEY_F16, KEY_F17, KEY_F18, KEY_F19, KEY_F20, KEY_F21, KEY_F22,
KEY_F23, KEY_F24, KEY_OPEN, KEY_HELP, KEY_PROPS, KEY_FRONT, KEY_STOP,
KEY_AGAIN, KEY_UNDO, KEY_CUT, KEY_COPY, KEY_PASTE, KEY_FIND, KEY_MUTE,
KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_KPCOMMA, KEY_RESERVED, KEY_RO, KEY_KATAKANAHIRAGANA , KEY_YEN,
KEY_HENKAN, KEY_MUHENKAN, KEY_KPJPCOMMA, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_HANGEUL, KEY_HANJA, KEY_KATAKANA, KEY_HIRAGANA,
KEY_ZENKAKUHANKAKU, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
KEY_RESERVED, KEY_RESERVED, KEY_LEFTCTRL, KEY_LEFTSHIFT, KEY_LEFTALT,
KEY_LEFTMETA, KEY_RIGHTCTRL, KEY_RIGHTSHIFT, KEY_RIGHTALT,
KEY_RIGHTMETA, KEY_PLAYPAUSE, KEY_STOPCD, KEY_PREVIOUSSONG,
KEY_NEXTSONG, KEY_EJECTCD, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE,
KEY_WWW, KEY_BACK, KEY_FORWARD, KEY_STOP, KEY_FIND, KEY_SCROLLUP,
KEY_SCROLLDOWN, KEY_EDIT, KEY_SLEEP, KEY_SCREENLOCK, KEY_REFRESH,
KEY_CALC, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED
};
int __init zebra_key_int(void)
{
int ret;
int i;
key_input_dev = input_allocate_device();
if (key_input_dev == NULL){
printk("input_allocate_device fail\n");
return -ENOMEM;
}
key_input_dev->name = DEVICE_NAME;
set_bit(EV_KEY, key_input_dev->evbit);
set_bit(EV_REP, key_input_dev->evbit); //支持重复按功能
for (i = 0; i < NR_SCANCODES; i++) {
set_bit(dc_kbd_keycode[i], key_input_dev->keybit);
}
/*注册输入设备,在/dev/input/eventX*/
ret = input_register_device(key_input_dev);
if (ret){
printk("input_register_device fail\n");
return ret;
}
return 0;
}
void __exit zebra_key_exit(void)
{
input_unregister_device(key_input_dev);
input_free_device(key_input_dev);
}
module_init(zebra_key_int);
module_exit(zebra_key_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FlyZebra <flycnzebra@gmail.com>");
MODULE_DESCRIPTION("Keyboard driver");
MODULE_ALIAS("platform:zebra-key");
1、虚拟触摸驱动
文件位置:kernel/drivers/input/touchscreen/zebra_ts.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/input.h>
#define SCREEN_MAX_X 1080
#define SCREEN_MAX_Y 1920
#define PRESS_MAX 0xFF
struct input_dev *ts_input_dev;
int __init zebra_ts_init(void)
{
int ret;
ts_input_dev = input_allocate_device();
if (ts_input_dev == NULL){
printk("input_allocate_device fail\n");
return -ENOMEM;
}
ts_input_dev->name = "zebra_ts";
set_bit(ABS_MT_TOUCH_MAJOR, ts_input_dev->absbit);
set_bit(ABS_MT_POSITION_X, ts_input_dev->absbit);
set_bit(ABS_MT_POSITION_Y, ts_input_dev->absbit);
set_bit(ABS_MT_WIDTH_MAJOR, ts_input_dev->absbit);
set_bit(BTN_TOUCH, ts_input_dev->keybit);
set_bit(EV_ABS, ts_input_dev->evbit);
set_bit(EV_KEY, ts_input_dev->evbit);
set_bit(INPUT_PROP_DIRECT, ts_input_dev->propbit);
input_set_abs_params(ts_input_dev, ABS_X, 0, SCREEN_MAX_X, 0, 0);
input_set_abs_params(ts_input_dev, ABS_Y, 0, SCREEN_MAX_Y, 0, 0);
input_set_abs_params(ts_input_dev, ABS_MT_POSITION_X, 0, SCREEN_MAX_X, 0, 0);
input_set_abs_params(ts_input_dev, ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0);
input_set_abs_params(ts_input_dev, ABS_MT_TOUCH_MAJOR, 0, PRESS_MAX, 0, 0);
input_set_abs_params(ts_input_dev, ABS_MT_WIDTH_MAJOR, 0, 20, 0, 0);
input_set_abs_params(ts_input_dev, ABS_MT_TRACKING_ID, 0, 4, 0, 0);
ret = input_register_device(ts_input_dev);
if (ret){
printk("input_register_device fail\n");
return ret;
}
return 0;
}
void __exit zebra_ts_exit(void)
{
input_unregister_device(ts_input_dev);
input_free_device(ts_input_dev);
}
module_init(zebra_ts_init);
module_exit(zebra_ts_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FlyZebra <flycnzebra@gmail.com>");
MODULE_DESCRIPTION("Touchscreen driver");
MODULE_ALIAS("platform:zebra-ts");
3、内核编译配置
kernel/arch/arm64/configs/defconfig
+CONFIG_KEYBOARD_zebra=y
+CONFIG_TOUCHSCREEN_zebra=y
kernel/drivers/input/keyboard/Kconfig
+config KEYBOARD_zebra
+ tristate "zebra keyboard"
+ help
+ Say Y here if you use zebra keyboard driver.
kernel/drivers/input/keyboard/Makefile
+obj-$(CONFIG_KEYBOARD_zebra) += zebra_key.o
kernel/drivers/input/touchscreen/Kconfig
+config TOUCHSCREEN_zebra
+ tristate "zebra touchscreen"
+ help
+ Say Y here if you use zebra touchscreen driver.
kernel/drivers/input/touchscreen/Makefile
+obj-$(CONFIG_TOUCHSCREEN_zebra) += zebra_ts.o
4、测试
模拟后退键->BACK键
sendevent /dev/input/event0 1 158 1
sendevent /dev/input/event0 0 0 0
sendevent /dev/input/event0 1 158 0
sendevent /dev/input/event0 0 0 0
1-2行按键按下,3-4行按键弹起
模拟触摸,点击坐标(982,1129)
sendevent /dev/input/event1 3 53 982
sendevent /dev/input/event1 3 54 1129
sendevent /dev/input/event1 3 57 0
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 1 330 1
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 3 53 982
sendevent /dev/input/event1 3 54 1129
sendevent /dev/input/event1 3 57 0
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 1 330 0
sendevent /dev/input/event1 0 0
1-6行为触摸按下,7-12行触摸松开