Android虚拟键盘和虚拟触摸驱动

 

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行触摸松开

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值