1*2b3f6d66SOleksandr Tymoshenko /*- 2*2b3f6d66SOleksandr Tymoshenko * Copyright (c) 2014 Jakub Wojciech Klama <jceel@FreeBSD.org> 3*2b3f6d66SOleksandr Tymoshenko * All rights reserved. 4*2b3f6d66SOleksandr Tymoshenko * 5*2b3f6d66SOleksandr Tymoshenko * Redistribution and use in source and binary forms, with or without 6*2b3f6d66SOleksandr Tymoshenko * modification, are permitted provided that the following conditions 7*2b3f6d66SOleksandr Tymoshenko * are met: 8*2b3f6d66SOleksandr Tymoshenko * 1. Redistributions of source code must retain the above copyright 9*2b3f6d66SOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer. 10*2b3f6d66SOleksandr Tymoshenko * 2. Redistributions in binary form must reproduce the above copyright 11*2b3f6d66SOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer in the 12*2b3f6d66SOleksandr Tymoshenko * documentation and/or other materials provided with the distribution. 13*2b3f6d66SOleksandr Tymoshenko * 14*2b3f6d66SOleksandr Tymoshenko * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*2b3f6d66SOleksandr Tymoshenko * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*2b3f6d66SOleksandr Tymoshenko * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*2b3f6d66SOleksandr Tymoshenko * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*2b3f6d66SOleksandr Tymoshenko * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*2b3f6d66SOleksandr Tymoshenko * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*2b3f6d66SOleksandr Tymoshenko * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*2b3f6d66SOleksandr Tymoshenko * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*2b3f6d66SOleksandr Tymoshenko * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*2b3f6d66SOleksandr Tymoshenko * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*2b3f6d66SOleksandr Tymoshenko * SUCH DAMAGE. 25*2b3f6d66SOleksandr Tymoshenko * 26*2b3f6d66SOleksandr Tymoshenko * $FreeBSD$ 27*2b3f6d66SOleksandr Tymoshenko */ 28*2b3f6d66SOleksandr Tymoshenko 29*2b3f6d66SOleksandr Tymoshenko #ifndef _DEV_EVDEV_EVDEV_H 30*2b3f6d66SOleksandr Tymoshenko #define _DEV_EVDEV_EVDEV_H 31*2b3f6d66SOleksandr Tymoshenko 32*2b3f6d66SOleksandr Tymoshenko #include <sys/types.h> 33*2b3f6d66SOleksandr Tymoshenko #include <sys/kbio.h> 34*2b3f6d66SOleksandr Tymoshenko #include <dev/evdev/input.h> 35*2b3f6d66SOleksandr Tymoshenko #include <dev/kbd/kbdreg.h> 36*2b3f6d66SOleksandr Tymoshenko 37*2b3f6d66SOleksandr Tymoshenko #define NAMELEN 80 38*2b3f6d66SOleksandr Tymoshenko 39*2b3f6d66SOleksandr Tymoshenko struct evdev_dev; 40*2b3f6d66SOleksandr Tymoshenko 41*2b3f6d66SOleksandr Tymoshenko typedef int (evdev_open_t)(struct evdev_dev *, void *); 42*2b3f6d66SOleksandr Tymoshenko typedef void (evdev_close_t)(struct evdev_dev *, void *); 43*2b3f6d66SOleksandr Tymoshenko typedef void (evdev_event_t)(struct evdev_dev *, void *, uint16_t, 44*2b3f6d66SOleksandr Tymoshenko uint16_t, int32_t); 45*2b3f6d66SOleksandr Tymoshenko typedef void (evdev_keycode_t)(struct evdev_dev *, void *, 46*2b3f6d66SOleksandr Tymoshenko struct input_keymap_entry *); 47*2b3f6d66SOleksandr Tymoshenko 48*2b3f6d66SOleksandr Tymoshenko /* 49*2b3f6d66SOleksandr Tymoshenko * Keyboard and mouse events recipient mask. 50*2b3f6d66SOleksandr Tymoshenko * evdev_rcpt_mask variable should be respected by keyboard and mouse drivers 51*2b3f6d66SOleksandr Tymoshenko * that are able to send events through both evdev and sysmouse/kbdmux 52*2b3f6d66SOleksandr Tymoshenko * interfaces so user can choose prefered one to not receive one event twice. 53*2b3f6d66SOleksandr Tymoshenko */ 54*2b3f6d66SOleksandr Tymoshenko #define EVDEV_RCPT_SYSMOUSE (1<<0) 55*2b3f6d66SOleksandr Tymoshenko #define EVDEV_RCPT_KBDMUX (1<<1) 56*2b3f6d66SOleksandr Tymoshenko #define EVDEV_RCPT_HW_MOUSE (1<<2) 57*2b3f6d66SOleksandr Tymoshenko #define EVDEV_RCPT_HW_KBD (1<<3) 58*2b3f6d66SOleksandr Tymoshenko extern int evdev_rcpt_mask; 59*2b3f6d66SOleksandr Tymoshenko 60*2b3f6d66SOleksandr Tymoshenko #define ABS_MT_FIRST ABS_MT_TOUCH_MAJOR 61*2b3f6d66SOleksandr Tymoshenko #define ABS_MT_LAST ABS_MT_TOOL_Y 62*2b3f6d66SOleksandr Tymoshenko #define ABS_IS_MT(x) ((x) >= ABS_MT_FIRST && (x) <= ABS_MT_LAST) 63*2b3f6d66SOleksandr Tymoshenko #define ABS_MT_INDEX(x) ((x) - ABS_MT_FIRST) 64*2b3f6d66SOleksandr Tymoshenko #define MT_CNT (ABS_MT_INDEX(ABS_MT_LAST) + 1) 65*2b3f6d66SOleksandr Tymoshenko /* Multitouch protocol type A */ 66*2b3f6d66SOleksandr Tymoshenko #define MAX_MT_REPORTS 5 67*2b3f6d66SOleksandr Tymoshenko /* Multitouch protocol type B interface */ 68*2b3f6d66SOleksandr Tymoshenko #define MAX_MT_SLOTS 16 69*2b3f6d66SOleksandr Tymoshenko 70*2b3f6d66SOleksandr Tymoshenko #define EVDEV_FLAG_SOFTREPEAT 0x00 /* use evdev to repeat keys */ 71*2b3f6d66SOleksandr Tymoshenko #define EVDEV_FLAG_MT_STCOMPAT 0x01 /* autogenerate ST-compatible events 72*2b3f6d66SOleksandr Tymoshenko * for MT protocol type B reports */ 73*2b3f6d66SOleksandr Tymoshenko #define EVDEV_FLAG_MAX 0x1F 74*2b3f6d66SOleksandr Tymoshenko #define EVDEV_FLAG_CNT (EVDEV_FLAG_MAX + 1) 75*2b3f6d66SOleksandr Tymoshenko 76*2b3f6d66SOleksandr Tymoshenko struct evdev_methods 77*2b3f6d66SOleksandr Tymoshenko { 78*2b3f6d66SOleksandr Tymoshenko evdev_open_t *ev_open; 79*2b3f6d66SOleksandr Tymoshenko evdev_close_t *ev_close; 80*2b3f6d66SOleksandr Tymoshenko evdev_event_t *ev_event; 81*2b3f6d66SOleksandr Tymoshenko evdev_keycode_t *ev_get_keycode; 82*2b3f6d66SOleksandr Tymoshenko evdev_keycode_t *ev_set_keycode; 83*2b3f6d66SOleksandr Tymoshenko }; 84*2b3f6d66SOleksandr Tymoshenko 85*2b3f6d66SOleksandr Tymoshenko /* Input device interface: */ 86*2b3f6d66SOleksandr Tymoshenko struct evdev_dev *evdev_alloc(void); 87*2b3f6d66SOleksandr Tymoshenko void evdev_free(struct evdev_dev *); 88*2b3f6d66SOleksandr Tymoshenko void evdev_set_name(struct evdev_dev *, const char *); 89*2b3f6d66SOleksandr Tymoshenko void evdev_set_id(struct evdev_dev *, uint16_t, uint16_t, uint16_t, uint16_t); 90*2b3f6d66SOleksandr Tymoshenko void evdev_set_phys(struct evdev_dev *, const char *); 91*2b3f6d66SOleksandr Tymoshenko void evdev_set_serial(struct evdev_dev *, const char *); 92*2b3f6d66SOleksandr Tymoshenko void evdev_set_methods(struct evdev_dev *, void *, struct evdev_methods *); 93*2b3f6d66SOleksandr Tymoshenko int evdev_register(struct evdev_dev *); 94*2b3f6d66SOleksandr Tymoshenko int evdev_unregister(struct evdev_dev *); 95*2b3f6d66SOleksandr Tymoshenko int evdev_push_event(struct evdev_dev *, uint16_t, uint16_t, int32_t); 96*2b3f6d66SOleksandr Tymoshenko int evdev_sync(struct evdev_dev *); 97*2b3f6d66SOleksandr Tymoshenko int evdev_mt_sync(struct evdev_dev *); 98*2b3f6d66SOleksandr Tymoshenko void evdev_support_prop(struct evdev_dev *, uint16_t); 99*2b3f6d66SOleksandr Tymoshenko void evdev_support_event(struct evdev_dev *, uint16_t); 100*2b3f6d66SOleksandr Tymoshenko void evdev_support_key(struct evdev_dev *, uint16_t); 101*2b3f6d66SOleksandr Tymoshenko void evdev_support_rel(struct evdev_dev *, uint16_t); 102*2b3f6d66SOleksandr Tymoshenko void evdev_support_abs(struct evdev_dev *, uint16_t, int32_t, int32_t, int32_t, 103*2b3f6d66SOleksandr Tymoshenko int32_t, int32_t, int32_t); 104*2b3f6d66SOleksandr Tymoshenko void evdev_support_msc(struct evdev_dev *, uint16_t); 105*2b3f6d66SOleksandr Tymoshenko void evdev_support_led(struct evdev_dev *, uint16_t); 106*2b3f6d66SOleksandr Tymoshenko void evdev_support_snd(struct evdev_dev *, uint16_t); 107*2b3f6d66SOleksandr Tymoshenko void evdev_support_sw(struct evdev_dev *, uint16_t); 108*2b3f6d66SOleksandr Tymoshenko void evdev_set_repeat_params(struct evdev_dev *, uint16_t, int); 109*2b3f6d66SOleksandr Tymoshenko int evdev_set_report_size(struct evdev_dev *, size_t); 110*2b3f6d66SOleksandr Tymoshenko void evdev_set_flag(struct evdev_dev *, uint16_t); 111*2b3f6d66SOleksandr Tymoshenko 112*2b3f6d66SOleksandr Tymoshenko /* Multitouch related functions: */ 113*2b3f6d66SOleksandr Tymoshenko int32_t evdev_get_mt_slot_by_tracking_id(struct evdev_dev *, int32_t); 114*2b3f6d66SOleksandr Tymoshenko void evdev_support_nfingers(struct evdev_dev *, int32_t); 115*2b3f6d66SOleksandr Tymoshenko void evdev_support_mt_compat(struct evdev_dev *); 116*2b3f6d66SOleksandr Tymoshenko void evdev_push_nfingers(struct evdev_dev *, int32_t); 117*2b3f6d66SOleksandr Tymoshenko void evdev_push_mt_compat(struct evdev_dev *); 118*2b3f6d66SOleksandr Tymoshenko 119*2b3f6d66SOleksandr Tymoshenko /* Utility functions: */ 120*2b3f6d66SOleksandr Tymoshenko uint16_t evdev_hid2key(int); 121*2b3f6d66SOleksandr Tymoshenko void evdev_support_all_known_keys(struct evdev_dev *); 122*2b3f6d66SOleksandr Tymoshenko uint16_t evdev_scancode2key(int *, int); 123*2b3f6d66SOleksandr Tymoshenko void evdev_push_mouse_btn(struct evdev_dev *, int); 124*2b3f6d66SOleksandr Tymoshenko void evdev_push_leds(struct evdev_dev *, int); 125*2b3f6d66SOleksandr Tymoshenko void evdev_push_repeats(struct evdev_dev *, keyboard_t *); 126*2b3f6d66SOleksandr Tymoshenko evdev_event_t evdev_ev_kbd_event; 127*2b3f6d66SOleksandr Tymoshenko 128*2b3f6d66SOleksandr Tymoshenko #endif /* _DEV_EVDEV_EVDEV_H */ 129