Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input-mt into next
This commit is contained in:
Коммит
5c461b913a
|
@ -1,6 +1,6 @@
|
|||
Multi-touch (MT) Protocol
|
||||
-------------------------
|
||||
Copyright (C) 2009 Henrik Rydberg <rydberg@euromail.se>
|
||||
Copyright (C) 2009-2010 Henrik Rydberg <rydberg@euromail.se>
|
||||
|
||||
|
||||
Introduction
|
||||
|
@ -169,12 +169,16 @@ described by adding the MINOR parameters, such that MAJOR and MINOR are the
|
|||
major and minor axis of an ellipse. Finally, the orientation of the oval
|
||||
shape can be describe with the ORIENTATION parameter.
|
||||
|
||||
For type A devices, further specification of the touch shape is possible
|
||||
via ABS_MT_BLOB_ID.
|
||||
|
||||
The ABS_MT_TOOL_TYPE may be used to specify whether the touching tool is a
|
||||
contact or a pen or something else. Devices with more granular information
|
||||
may specify general shapes as blobs, i.e., as a sequence of rectangular
|
||||
shapes grouped together by an ABS_MT_BLOB_ID. Finally, for the few devices
|
||||
that currently support it, the ABS_MT_TRACKING_ID event may be used to
|
||||
report contact tracking from hardware [5].
|
||||
finger or a pen or something else. Finally, the ABS_MT_TRACKING_ID event
|
||||
may be used to track identified contacts over time [5].
|
||||
|
||||
In the type B protocol, ABS_MT_TOOL_TYPE and ABS_MT_TRACKING_ID are
|
||||
implicitly handled by input core; drivers should instead call
|
||||
input_mt_report_slot_state().
|
||||
|
||||
|
||||
Event Semantics
|
||||
|
@ -247,21 +251,24 @@ ABS_MT_TOOL_TYPE
|
|||
The type of approaching tool. A lot of kernel drivers cannot distinguish
|
||||
between different tool types, such as a finger or a pen. In such cases, the
|
||||
event should be omitted. The protocol currently supports MT_TOOL_FINGER and
|
||||
MT_TOOL_PEN [2].
|
||||
MT_TOOL_PEN [2]. For type B devices, this event is handled by input core;
|
||||
drivers should instead use input_mt_report_slot_state().
|
||||
|
||||
ABS_MT_BLOB_ID
|
||||
|
||||
The BLOB_ID groups several packets together into one arbitrarily shaped
|
||||
contact. This is a low-level anonymous grouping for type A devices, and
|
||||
contact. The sequence of points forms a polygon which defines the shape of
|
||||
the contact. This is a low-level anonymous grouping for type A devices, and
|
||||
should not be confused with the high-level trackingID [5]. Most type A
|
||||
devices do not have blob capability, so drivers can safely omit this event.
|
||||
|
||||
ABS_MT_TRACKING_ID
|
||||
|
||||
The TRACKING_ID identifies an initiated contact throughout its life cycle
|
||||
[5]. This event is mandatory for type B devices. The value range of the
|
||||
TRACKING_ID should be large enough to ensure unique identification of a
|
||||
contact maintained over an extended period of time.
|
||||
[5]. The value range of the TRACKING_ID should be large enough to ensure
|
||||
unique identification of a contact maintained over an extended period of
|
||||
time. For type B devices, this event is handled by input core; drivers
|
||||
should instead use input_mt_report_slot_state().
|
||||
|
||||
|
||||
Event Computation
|
||||
|
@ -308,18 +315,19 @@ and with ORIENTATION, one can detect twisting of fingers.
|
|||
Notes
|
||||
-----
|
||||
|
||||
In order to stay compatible with existing applications, the data
|
||||
reported in a finger packet must not be recognized as single-touch
|
||||
events. In addition, all finger data must bypass input filtering,
|
||||
since subsequent events of the same type refer to different fingers.
|
||||
In order to stay compatible with existing applications, the data reported
|
||||
in a finger packet must not be recognized as single-touch events.
|
||||
|
||||
The first kernel driver to utilize the MT protocol is the bcm5974 driver,
|
||||
where examples can be found.
|
||||
For type A devices, all finger data bypasses input filtering, since
|
||||
subsequent events of the same type refer to different fingers.
|
||||
|
||||
For example usage of the type A protocol, see the bcm5974 driver. For
|
||||
example usage of the type B protocol, see the hid-egalax driver.
|
||||
|
||||
[1] With the extension ABS_MT_APPROACH_X and ABS_MT_APPROACH_Y, the
|
||||
difference between the contact position and the approaching tool position
|
||||
could be used to derive tilt.
|
||||
[2] The list can of course be extended.
|
||||
[3] Multitouch X driver project: http://bitmath.org/code/multitouch/.
|
||||
[3] The mtdev project: http://bitmath.org/code/mtdev/.
|
||||
[4] See the section on event computation.
|
||||
[5] See the section on finger tracking.
|
||||
|
|
|
@ -1302,6 +1302,7 @@ static const struct hid_device_id hid_blacklist[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH2) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH3) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH4) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
|
||||
|
|
|
@ -242,6 +242,8 @@ static const struct hid_device_id egalax_devices[] = {
|
|||
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH2) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
|
||||
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH3) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
|
||||
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH4) },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(hid, egalax_devices);
|
||||
|
|
|
@ -198,6 +198,7 @@
|
|||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1 0x720c
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH2 0x72a1
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH3 0x480e
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH4 0x726b
|
||||
|
||||
#define USB_VENDOR_ID_ELECOM 0x056e
|
||||
#define USB_DEVICE_ID_ELECOM_BM084 0x0061
|
||||
|
|
|
@ -678,6 +678,10 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
|
|||
#define EVIOC_MASK_SIZE(nr) ((nr) & ~(_IOC_SIZEMASK << _IOC_SIZESHIFT))
|
||||
switch (EVIOC_MASK_SIZE(cmd)) {
|
||||
|
||||
case EVIOCGPROP(0):
|
||||
return bits_to_user(dev->propbit, INPUT_PROP_MAX,
|
||||
size, p, compat_mode);
|
||||
|
||||
case EVIOCGKEY(0):
|
||||
return bits_to_user(dev->key, KEY_MAX, size, p, compat_mode);
|
||||
|
||||
|
|
|
@ -1110,6 +1110,8 @@ static int input_devices_seq_show(struct seq_file *seq, void *v)
|
|||
seq_printf(seq, "%s ", handle->name);
|
||||
seq_putc(seq, '\n');
|
||||
|
||||
input_seq_print_bitmap(seq, "PROP", dev->propbit, INPUT_PROP_MAX);
|
||||
|
||||
input_seq_print_bitmap(seq, "EV", dev->evbit, EV_MAX);
|
||||
if (test_bit(EV_KEY, dev->evbit))
|
||||
input_seq_print_bitmap(seq, "KEY", dev->keybit, KEY_MAX);
|
||||
|
@ -1333,11 +1335,26 @@ static ssize_t input_dev_show_modalias(struct device *dev,
|
|||
}
|
||||
static DEVICE_ATTR(modalias, S_IRUGO, input_dev_show_modalias, NULL);
|
||||
|
||||
static int input_print_bitmap(char *buf, int buf_size, unsigned long *bitmap,
|
||||
int max, int add_cr);
|
||||
|
||||
static ssize_t input_dev_show_properties(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct input_dev *input_dev = to_input_dev(dev);
|
||||
int len = input_print_bitmap(buf, PAGE_SIZE, input_dev->propbit,
|
||||
INPUT_PROP_MAX, true);
|
||||
return min_t(int, len, PAGE_SIZE);
|
||||
}
|
||||
static DEVICE_ATTR(properties, S_IRUGO, input_dev_show_properties, NULL);
|
||||
|
||||
static struct attribute *input_dev_attrs[] = {
|
||||
&dev_attr_name.attr,
|
||||
&dev_attr_phys.attr,
|
||||
&dev_attr_uniq.attr,
|
||||
&dev_attr_modalias.attr,
|
||||
&dev_attr_properties.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@ -1471,7 +1488,7 @@ static int input_add_uevent_bm_var(struct kobj_uevent_env *env,
|
|||
{
|
||||
int len;
|
||||
|
||||
if (add_uevent_var(env, "%s=", name))
|
||||
if (add_uevent_var(env, "%s", name))
|
||||
return -ENOMEM;
|
||||
|
||||
len = input_print_bitmap(&env->buf[env->buflen - 1],
|
||||
|
@ -1537,6 +1554,8 @@ static int input_dev_uevent(struct device *device, struct kobj_uevent_env *env)
|
|||
if (dev->uniq)
|
||||
INPUT_ADD_HOTPLUG_VAR("UNIQ=\"%s\"", dev->uniq);
|
||||
|
||||
INPUT_ADD_HOTPLUG_BM_VAR("PROP=", dev->propbit, INPUT_PROP_MAX);
|
||||
|
||||
INPUT_ADD_HOTPLUG_BM_VAR("EV=", dev->evbit, EV_MAX);
|
||||
if (test_bit(EV_KEY, dev->evbit))
|
||||
INPUT_ADD_HOTPLUG_BM_VAR("KEY=", dev->keybit, KEY_MAX);
|
||||
|
|
|
@ -680,6 +680,10 @@ static long uinput_ioctl_handler(struct file *file, unsigned int cmd,
|
|||
retval = uinput_set_bit(arg, swbit, SW_MAX);
|
||||
break;
|
||||
|
||||
case UI_SET_PROPBIT:
|
||||
retval = uinput_set_bit(arg, propbit, INPUT_PROP_MAX);
|
||||
break;
|
||||
|
||||
case UI_SET_PHYS:
|
||||
if (udev->state == UIST_CREATED) {
|
||||
retval = -EINVAL;
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input/mt.h>
|
||||
#include <linux/serio.h>
|
||||
#include <linux/libps2.h>
|
||||
#include <linux/slab.h>
|
||||
|
@ -279,6 +279,25 @@ static void synaptics_set_rate(struct psmouse *psmouse, unsigned int rate)
|
|||
synaptics_mode_cmd(psmouse, priv->mode);
|
||||
}
|
||||
|
||||
static int synaptics_set_advanced_gesture_mode(struct psmouse *psmouse)
|
||||
{
|
||||
static unsigned char param = 0xc8;
|
||||
struct synaptics_data *priv = psmouse->private;
|
||||
|
||||
if (!SYN_CAP_ADV_GESTURE(priv->ext_cap_0c))
|
||||
return 0;
|
||||
|
||||
if (psmouse_sliced_command(psmouse, SYN_QUE_MODEL))
|
||||
return -1;
|
||||
if (ps2_command(&psmouse->ps2dev, ¶m, PSMOUSE_CMD_SETRATE))
|
||||
return -1;
|
||||
|
||||
/* Advanced gesture mode also sends multi finger data */
|
||||
priv->capabilities |= BIT(1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* Synaptics pass-through PS/2 port support
|
||||
****************************************************************************/
|
||||
|
@ -380,7 +399,9 @@ static void synaptics_pt_create(struct psmouse *psmouse)
|
|||
* Functions to interpret the absolute mode packets
|
||||
****************************************************************************/
|
||||
|
||||
static void synaptics_parse_hw_state(unsigned char buf[], struct synaptics_data *priv, struct synaptics_hw_state *hw)
|
||||
static int synaptics_parse_hw_state(const unsigned char buf[],
|
||||
struct synaptics_data *priv,
|
||||
struct synaptics_hw_state *hw)
|
||||
{
|
||||
memset(hw, 0, sizeof(struct synaptics_hw_state));
|
||||
|
||||
|
@ -397,6 +418,14 @@ static void synaptics_parse_hw_state(unsigned char buf[], struct synaptics_data
|
|||
((buf[0] & 0x04) >> 1) |
|
||||
((buf[3] & 0x04) >> 2));
|
||||
|
||||
if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) && hw->w == 2) {
|
||||
/* Gesture packet: (x, y, z) at half resolution */
|
||||
priv->mt.x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1;
|
||||
priv->mt.y = (((buf[4] & 0xf0) << 4) | buf[2]) << 1;
|
||||
priv->mt.z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
hw->left = (buf[0] & 0x01) ? 1 : 0;
|
||||
hw->right = (buf[0] & 0x02) ? 1 : 0;
|
||||
|
||||
|
@ -452,6 +481,36 @@ static void synaptics_parse_hw_state(unsigned char buf[], struct synaptics_data
|
|||
hw->left = (buf[0] & 0x01) ? 1 : 0;
|
||||
hw->right = (buf[0] & 0x02) ? 1 : 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void set_slot(struct input_dev *dev, int slot, bool active, int x, int y)
|
||||
{
|
||||
input_mt_slot(dev, slot);
|
||||
input_mt_report_slot_state(dev, MT_TOOL_FINGER, active);
|
||||
if (active) {
|
||||
input_report_abs(dev, ABS_MT_POSITION_X, x);
|
||||
input_report_abs(dev, ABS_MT_POSITION_Y,
|
||||
YMAX_NOMINAL + YMIN_NOMINAL - y);
|
||||
}
|
||||
}
|
||||
|
||||
static void synaptics_report_semi_mt_data(struct input_dev *dev,
|
||||
const struct synaptics_hw_state *a,
|
||||
const struct synaptics_hw_state *b,
|
||||
int num_fingers)
|
||||
{
|
||||
if (num_fingers >= 2) {
|
||||
set_slot(dev, 0, true, min(a->x, b->x), min(a->y, b->y));
|
||||
set_slot(dev, 1, true, max(a->x, b->x), max(a->y, b->y));
|
||||
} else if (num_fingers == 1) {
|
||||
set_slot(dev, 0, true, a->x, a->y);
|
||||
set_slot(dev, 1, false, 0, 0);
|
||||
} else {
|
||||
set_slot(dev, 0, false, 0, 0);
|
||||
set_slot(dev, 1, false, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -466,7 +525,8 @@ static void synaptics_process_packet(struct psmouse *psmouse)
|
|||
int finger_width;
|
||||
int i;
|
||||
|
||||
synaptics_parse_hw_state(psmouse->packet, priv, &hw);
|
||||
if (synaptics_parse_hw_state(psmouse->packet, priv, &hw))
|
||||
return;
|
||||
|
||||
if (hw.scroll) {
|
||||
priv->scroll += hw.scroll;
|
||||
|
@ -488,7 +548,7 @@ static void synaptics_process_packet(struct psmouse *psmouse)
|
|||
return;
|
||||
}
|
||||
|
||||
if (hw.z > 0) {
|
||||
if (hw.z > 0 && hw.x > 1) {
|
||||
num_fingers = 1;
|
||||
finger_width = 5;
|
||||
if (SYN_CAP_EXTENDED(priv->capabilities)) {
|
||||
|
@ -512,6 +572,9 @@ static void synaptics_process_packet(struct psmouse *psmouse)
|
|||
finger_width = 0;
|
||||
}
|
||||
|
||||
if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c))
|
||||
synaptics_report_semi_mt_data(dev, &hw, &priv->mt, num_fingers);
|
||||
|
||||
/* Post events
|
||||
* BTN_TOUCH has to be first as mousedev relies on it when doing
|
||||
* absolute -> relative conversion
|
||||
|
@ -519,7 +582,7 @@ static void synaptics_process_packet(struct psmouse *psmouse)
|
|||
if (hw.z > 30) input_report_key(dev, BTN_TOUCH, 1);
|
||||
if (hw.z < 25) input_report_key(dev, BTN_TOUCH, 0);
|
||||
|
||||
if (hw.z > 0) {
|
||||
if (num_fingers > 0) {
|
||||
input_report_abs(dev, ABS_X, hw.x);
|
||||
input_report_abs(dev, ABS_Y, YMAX_NOMINAL + YMIN_NOMINAL - hw.y);
|
||||
}
|
||||
|
@ -622,6 +685,8 @@ static void set_input_params(struct input_dev *dev, struct synaptics_data *priv)
|
|||
{
|
||||
int i;
|
||||
|
||||
__set_bit(INPUT_PROP_POINTER, dev->propbit);
|
||||
|
||||
__set_bit(EV_ABS, dev->evbit);
|
||||
input_set_abs_params(dev, ABS_X,
|
||||
XMIN_NOMINAL, priv->x_max ?: XMAX_NOMINAL, 0, 0);
|
||||
|
@ -629,6 +694,15 @@ static void set_input_params(struct input_dev *dev, struct synaptics_data *priv)
|
|||
YMIN_NOMINAL, priv->y_max ?: YMAX_NOMINAL, 0, 0);
|
||||
input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0);
|
||||
|
||||
if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c)) {
|
||||
__set_bit(INPUT_PROP_SEMI_MT, dev->propbit);
|
||||
input_mt_init_slots(dev, 2);
|
||||
input_set_abs_params(dev, ABS_MT_POSITION_X, XMIN_NOMINAL,
|
||||
priv->x_max ?: XMAX_NOMINAL, 0, 0);
|
||||
input_set_abs_params(dev, ABS_MT_POSITION_Y, YMIN_NOMINAL,
|
||||
priv->y_max ?: YMAX_NOMINAL, 0, 0);
|
||||
}
|
||||
|
||||
if (SYN_CAP_PALMDETECT(priv->capabilities))
|
||||
input_set_abs_params(dev, ABS_TOOL_WIDTH, 0, 15, 0, 0);
|
||||
|
||||
|
@ -663,6 +737,7 @@ static void set_input_params(struct input_dev *dev, struct synaptics_data *priv)
|
|||
input_abs_set_res(dev, ABS_Y, priv->y_res);
|
||||
|
||||
if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
|
||||
__set_bit(INPUT_PROP_BUTTONPAD, dev->propbit);
|
||||
/* Clickpads report only left button */
|
||||
__clear_bit(BTN_RIGHT, dev->keybit);
|
||||
__clear_bit(BTN_MIDDLE, dev->keybit);
|
||||
|
@ -702,6 +777,11 @@ static int synaptics_reconnect(struct psmouse *psmouse)
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (synaptics_set_advanced_gesture_mode(psmouse)) {
|
||||
printk(KERN_ERR "Advanced gesture mode reconnect failed.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -799,6 +879,11 @@ int synaptics_init(struct psmouse *psmouse)
|
|||
goto init_fail;
|
||||
}
|
||||
|
||||
if (synaptics_set_advanced_gesture_mode(psmouse)) {
|
||||
printk(KERN_ERR "Advanced gesture mode init failed.\n");
|
||||
goto init_fail;
|
||||
}
|
||||
|
||||
priv->pkt_type = SYN_MODEL_NEWABS(priv->model_id) ? SYN_NEWABS : SYN_OLDABS;
|
||||
|
||||
printk(KERN_INFO "Synaptics Touchpad, model: %ld, fw: %ld.%ld, id: %#lx, caps: %#lx/%#lx/%#lx\n",
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
#define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16)
|
||||
#define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100100)
|
||||
#define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & 0x020000)
|
||||
#define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000)
|
||||
|
||||
/* synaptics modes query bits */
|
||||
#define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7))
|
||||
|
@ -112,6 +113,8 @@ struct synaptics_data {
|
|||
int scroll;
|
||||
|
||||
struct serio *pt_port; /* Pass-through serio port */
|
||||
|
||||
struct synaptics_hw_state mt; /* current gesture packet */
|
||||
};
|
||||
|
||||
void synaptics_module_init(void);
|
||||
|
|
|
@ -91,6 +91,7 @@ struct input_keymap_entry {
|
|||
#define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */
|
||||
#define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */
|
||||
#define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */
|
||||
#define EVIOCGPROP(len) _IOC(_IOC_READ, 'E', 0x09, len) /* get device properties */
|
||||
|
||||
#define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global key state */
|
||||
#define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */
|
||||
|
@ -107,6 +108,18 @@ struct input_keymap_entry {
|
|||
|
||||
#define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */
|
||||
|
||||
/*
|
||||
* Device properties and quirks
|
||||
*/
|
||||
|
||||
#define INPUT_PROP_POINTER 0x00 /* needs a pointer */
|
||||
#define INPUT_PROP_DIRECT 0x01 /* direct input devices */
|
||||
#define INPUT_PROP_BUTTONPAD 0x02 /* has button(s) under pad */
|
||||
#define INPUT_PROP_SEMI_MT 0x03 /* touch rectangle only */
|
||||
|
||||
#define INPUT_PROP_MAX 0x1f
|
||||
#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
|
||||
|
||||
/*
|
||||
* Event types
|
||||
*/
|
||||
|
@ -1090,6 +1103,7 @@ struct ff_effect {
|
|||
* @phys: physical path to the device in the system hierarchy
|
||||
* @uniq: unique identification code for the device (if device has it)
|
||||
* @id: id of the device (struct input_id)
|
||||
* @propbit: bitmap of device properties and quirks
|
||||
* @evbit: bitmap of types of events supported by the device (EV_KEY,
|
||||
* EV_REL, etc.)
|
||||
* @keybit: bitmap of keys/buttons this device has
|
||||
|
@ -1173,6 +1187,8 @@ struct input_dev {
|
|||
const char *uniq;
|
||||
struct input_id id;
|
||||
|
||||
unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];
|
||||
|
||||
unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
|
||||
unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
|
||||
unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
|
||||
|
|
|
@ -104,6 +104,7 @@ struct uinput_ff_erase {
|
|||
#define UI_SET_FFBIT _IOW(UINPUT_IOCTL_BASE, 107, int)
|
||||
#define UI_SET_PHYS _IOW(UINPUT_IOCTL_BASE, 108, char*)
|
||||
#define UI_SET_SWBIT _IOW(UINPUT_IOCTL_BASE, 109, int)
|
||||
#define UI_SET_PROPBIT _IOW(UINPUT_IOCTL_BASE, 110, int)
|
||||
|
||||
#define UI_BEGIN_FF_UPLOAD _IOWR(UINPUT_IOCTL_BASE, 200, struct uinput_ff_upload)
|
||||
#define UI_END_FF_UPLOAD _IOW(UINPUT_IOCTL_BASE, 201, struct uinput_ff_upload)
|
||||
|
|
Загрузка…
Ссылка в новой задаче