Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
56f3e1c0
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 1 年 前同步成功
通知
158
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
56f3e1c0
编写于
4月 13, 2010
作者:
D
Dmitry Torokhov
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-linus' into next
上级
0d0fb0f9
38101475
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
176 addition
and
93 deletion
+176
-93
Documentation/input/multi-touch-protocol.txt
Documentation/input/multi-touch-protocol.txt
+17
-6
drivers/input/input.c
drivers/input/input.c
+8
-1
drivers/input/keyboard/matrix_keypad.c
drivers/input/keyboard/matrix_keypad.c
+3
-1
drivers/input/mouse/alps.c
drivers/input/mouse/alps.c
+1
-0
drivers/input/mouse/bcm5974.c
drivers/input/mouse/bcm5974.c
+0
-1
drivers/input/serio/i8042.c
drivers/input/serio/i8042.c
+1
-1
drivers/input/sparse-keymap.c
drivers/input/sparse-keymap.c
+33
-19
drivers/input/tablet/wacom_sys.c
drivers/input/tablet/wacom_sys.c
+7
-5
drivers/input/tablet/wacom_wac.c
drivers/input/tablet/wacom_wac.c
+104
-59
include/linux/input/matrix_keypad.h
include/linux/input/matrix_keypad.h
+2
-0
未找到文件。
Documentation/input/multi-touch-protocol.txt
浏览文件 @
56f3e1c0
...
...
@@ -68,6 +68,22 @@ like:
SYN_MT_REPORT
SYN_REPORT
Here is the sequence after lifting one of the fingers:
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
SYN_MT_REPORT
SYN_REPORT
And here is the sequence after lifting the remaining finger:
SYN_MT_REPORT
SYN_REPORT
If the driver reports one of BTN_TOUCH or ABS_PRESSURE in addition to the
ABS_MT events, the last SYN_MT_REPORT event may be omitted. Otherwise, the
last SYN_REPORT will be dropped by the input core, resulting in no
zero-finger event reaching userland.
Event Semantics
---------------
...
...
@@ -217,11 +233,6 @@ where examples can be found.
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] The multi-touch X driver is currently in the prototyping stage. At the
time of writing (April 2009), the MT protocol is not yet merged, and the
prototype implements finger matching, basic mouse support and two-finger
scrolling. The project aims at improving the quality of current multi-touch
functionality available in the Synaptics X driver, and in addition
implement more advanced gestures.
[3] Multitouch X driver project: http://bitmath.org/code/multitouch/.
[4] See the section on event computation.
[5] See the section on finger tracking.
drivers/input/input.c
浏览文件 @
56f3e1c0
...
...
@@ -660,7 +660,14 @@ static int input_default_setkeycode(struct input_dev *dev,
int
input_get_keycode
(
struct
input_dev
*
dev
,
unsigned
int
scancode
,
unsigned
int
*
keycode
)
{
return
dev
->
getkeycode
(
dev
,
scancode
,
keycode
);
unsigned
long
flags
;
int
retval
;
spin_lock_irqsave
(
&
dev
->
event_lock
,
flags
);
retval
=
dev
->
getkeycode
(
dev
,
scancode
,
keycode
);
spin_unlock_irqrestore
(
&
dev
->
event_lock
,
flags
);
return
retval
;
}
EXPORT_SYMBOL
(
input_get_keycode
);
...
...
drivers/input/keyboard/matrix_keypad.c
浏览文件 @
56f3e1c0
...
...
@@ -374,7 +374,9 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
input_dev
->
name
=
pdev
->
name
;
input_dev
->
id
.
bustype
=
BUS_HOST
;
input_dev
->
dev
.
parent
=
&
pdev
->
dev
;
input_dev
->
evbit
[
0
]
=
BIT_MASK
(
EV_KEY
)
|
BIT_MASK
(
EV_REP
);
input_dev
->
evbit
[
0
]
=
BIT_MASK
(
EV_KEY
);
if
(
!
pdata
->
no_autorepeat
)
input_dev
->
evbit
[
0
]
|=
BIT_MASK
(
EV_REP
);
input_dev
->
open
=
matrix_keypad_start
;
input_dev
->
close
=
matrix_keypad_stop
;
...
...
drivers/input/mouse/alps.c
浏览文件 @
56f3e1c0
...
...
@@ -64,6 +64,7 @@ static const struct alps_model_info alps_model_data[] = {
{
{
0x62
,
0x02
,
0x14
},
0xcf
,
0xcf
,
ALPS_PASS
|
ALPS_DUALPOINT
|
ALPS_PS2_INTERLEAVED
},
{
{
0x73
,
0x02
,
0x50
},
0xcf
,
0xcf
,
ALPS_FOUR_BUTTONS
},
/* Dell Vostro 1400 */
{
{
0x73
,
0x02
,
0x64
},
0xf8
,
0xf8
,
0
},
/* HP Pavilion dm3 */
{
{
0x52
,
0x01
,
0x14
},
0xff
,
0xff
,
ALPS_PASS
|
ALPS_DUALPOINT
|
ALPS_PS2_INTERLEAVED
},
/* Toshiba Tecra A11-11L */
};
...
...
drivers/input/mouse/bcm5974.c
浏览文件 @
56f3e1c0
...
...
@@ -803,7 +803,6 @@ static struct usb_driver bcm5974_driver = {
.
disconnect
=
bcm5974_disconnect
,
.
suspend
=
bcm5974_suspend
,
.
resume
=
bcm5974_resume
,
.
reset_resume
=
bcm5974_resume
,
.
id_table
=
bcm5974_table
,
.
supports_autosuspend
=
1
,
};
...
...
drivers/input/serio/i8042.c
浏览文件 @
56f3e1c0
...
...
@@ -39,7 +39,7 @@ MODULE_PARM_DESC(noaux, "Do not probe or use AUX (mouse) port.");
static
bool
i8042_nomux
;
module_param_named
(
nomux
,
i8042_nomux
,
bool
,
0
);
MODULE_PARM_DESC
(
nomux
,
"Do not check whether an active multiplexing con
rt
oller is present."
);
MODULE_PARM_DESC
(
nomux
,
"Do not check whether an active multiplexing con
tr
oller is present."
);
static
bool
i8042_unlock
;
module_param_named
(
unlock
,
i8042_unlock
,
bool
,
0
);
...
...
drivers/input/sparse-keymap.c
浏览文件 @
56f3e1c0
...
...
@@ -68,12 +68,14 @@ static int sparse_keymap_getkeycode(struct input_dev *dev,
unsigned
int
scancode
,
unsigned
int
*
keycode
)
{
const
struct
key_entry
*
key
=
sparse_keymap_entry_from_scancode
(
dev
,
scancode
);
const
struct
key_entry
*
key
;
if
(
key
&&
key
->
type
==
KE_KEY
)
{
*
keycode
=
key
->
keycode
;
return
0
;
if
(
dev
->
keycode
)
{
key
=
sparse_keymap_entry_from_scancode
(
dev
,
scancode
);
if
(
key
&&
key
->
type
==
KE_KEY
)
{
*
keycode
=
key
->
keycode
;
return
0
;
}
}
return
-
EINVAL
;
...
...
@@ -86,17 +88,16 @@ static int sparse_keymap_setkeycode(struct input_dev *dev,
struct
key_entry
*
key
;
int
old_keycode
;
if
(
keycode
<
0
||
keycode
>
KEY_MAX
)
return
-
EINVAL
;
key
=
sparse_keymap_entry_from_scancode
(
dev
,
scancode
);
if
(
key
&&
key
->
type
==
KE_KEY
)
{
old_keycode
=
key
->
keycode
;
key
->
keycode
=
keycode
;
set_bit
(
keycode
,
dev
->
keybit
);
if
(
!
sparse_keymap_entry_from_keycode
(
dev
,
old_keycode
))
clear_bit
(
old_keycode
,
dev
->
keybit
);
return
0
;
if
(
dev
->
keycode
)
{
key
=
sparse_keymap_entry_from_scancode
(
dev
,
scancode
);
if
(
key
&&
key
->
type
==
KE_KEY
)
{
old_keycode
=
key
->
keycode
;
key
->
keycode
=
keycode
;
set_bit
(
keycode
,
dev
->
keybit
);
if
(
!
sparse_keymap_entry_from_keycode
(
dev
,
old_keycode
))
clear_bit
(
old_keycode
,
dev
->
keybit
);
return
0
;
}
}
return
-
EINVAL
;
...
...
@@ -164,7 +165,7 @@ int sparse_keymap_setup(struct input_dev *dev,
return
0
;
err_out:
kfree
(
key
map
);
kfree
(
map
);
return
error
;
}
...
...
@@ -176,14 +177,27 @@ EXPORT_SYMBOL(sparse_keymap_setup);
*
* This function is used to free memory allocated by sparse keymap
* in an input device that was set up by sparse_keymap_setup().
* NOTE: It is safe to cal this function while input device is
* still registered (however the drivers should care not to try to
* use freed keymap and thus have to shut off interrups/polling
* before freeing the keymap).
*/
void
sparse_keymap_free
(
struct
input_dev
*
dev
)
{
unsigned
long
flags
;
/*
* Take event lock to prevent racing with input_get_keycode()
* and input_set_keycode() if we are called while input device
* is still registered.
*/
spin_lock_irqsave
(
&
dev
->
event_lock
,
flags
);
kfree
(
dev
->
keycode
);
dev
->
keycode
=
NULL
;
dev
->
keycodemax
=
0
;
dev
->
getkeycode
=
NULL
;
dev
->
setkeycode
=
NULL
;
spin_unlock_irqrestore
(
&
dev
->
event_lock
,
flags
)
;
}
EXPORT_SYMBOL
(
sparse_keymap_free
);
...
...
drivers/input/tablet/wacom_sys.c
浏览文件 @
56f3e1c0
...
...
@@ -673,13 +673,15 @@ static int wacom_resume(struct usb_interface *intf)
int
rv
;
mutex_lock
(
&
wacom
->
lock
);
if
(
wacom
->
open
)
{
/* switch to wacom mode first */
wacom_query_tablet_data
(
intf
,
features
);
if
(
wacom
->
open
)
rv
=
usb_submit_urb
(
wacom
->
irq
,
GFP_NOIO
);
/* switch to wacom mode if needed */
if
(
!
wacom_retrieve_hid_descriptor
(
intf
,
features
))
wacom_query_tablet_data
(
intf
,
features
);
}
else
else
rv
=
0
;
mutex_unlock
(
&
wacom
->
lock
);
return
rv
;
...
...
drivers/input/tablet/wacom_wac.c
浏览文件 @
56f3e1c0
...
...
@@ -155,19 +155,19 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
{
struct
wacom_features
*
features
=
&
wacom
->
features
;
unsigned
char
*
data
=
wacom
->
data
;
int
x
,
y
,
prox
;
int
rw
=
0
;
int
retval
=
0
;
int
x
,
y
,
rw
;
static
int
penData
=
0
;
if
(
data
[
0
]
!=
WACOM_REPORT_PENABLED
)
{
dbg
(
"wacom_graphire_irq: received unknown report #%d"
,
data
[
0
]);
goto
exit
;
return
0
;
}
prox
=
data
[
1
]
&
0x80
;
if
(
prox
||
wacom
->
id
[
0
])
{
if
(
prox
)
{
switch
((
data
[
1
]
>>
5
)
&
3
)
{
if
(
data
[
1
]
&
0x80
)
{
/* in prox and not a pad data */
penData
=
1
;
switch
((
data
[
1
]
>>
5
)
&
3
)
{
case
0
:
/* Pen */
wacom
->
tool
[
0
]
=
BTN_TOOL_PEN
;
...
...
@@ -181,13 +181,23 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
case
2
:
/* Mouse with wheel */
wacom_report_key
(
wcombo
,
BTN_MIDDLE
,
data
[
1
]
&
0x04
);
if
(
features
->
type
==
WACOM_G4
||
features
->
type
==
WACOM_MO
)
{
rw
=
data
[
7
]
&
0x04
?
(
data
[
7
]
&
0x03
)
-
4
:
(
data
[
7
]
&
0x03
);
wacom_report_rel
(
wcombo
,
REL_WHEEL
,
-
rw
);
}
else
wacom_report_rel
(
wcombo
,
REL_WHEEL
,
-
(
signed
char
)
data
[
6
]);
/* fall through */
case
3
:
/* Mouse without wheel */
wacom
->
tool
[
0
]
=
BTN_TOOL_MOUSE
;
wacom
->
id
[
0
]
=
CURSOR_DEVICE_ID
;
wacom_report_key
(
wcombo
,
BTN_LEFT
,
data
[
1
]
&
0x01
);
wacom_report_key
(
wcombo
,
BTN_RIGHT
,
data
[
1
]
&
0x02
);
if
(
features
->
type
==
WACOM_G4
||
features
->
type
==
WACOM_MO
)
wacom_report_abs
(
wcombo
,
ABS_DISTANCE
,
data
[
6
]
&
0x3f
);
else
wacom_report_abs
(
wcombo
,
ABS_DISTANCE
,
data
[
7
]
&
0x3f
);
break
;
}
}
x
=
wacom_le16_to_cpu
(
&
data
[
2
]);
y
=
wacom_le16_to_cpu
(
&
data
[
4
]);
...
...
@@ -198,32 +208,36 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
wacom_report_key
(
wcombo
,
BTN_TOUCH
,
data
[
1
]
&
0x01
);
wacom_report_key
(
wcombo
,
BTN_STYLUS
,
data
[
1
]
&
0x02
);
wacom_report_key
(
wcombo
,
BTN_STYLUS2
,
data
[
1
]
&
0x04
);
}
else
{
wacom_report_key
(
wcombo
,
BTN_LEFT
,
data
[
1
]
&
0x01
);
wacom_report_key
(
wcombo
,
BTN_RIGHT
,
data
[
1
]
&
0x02
);
if
(
features
->
type
==
WACOM_G4
||
features
->
type
==
WACOM_MO
)
{
wacom_report_abs
(
wcombo
,
ABS_DISTANCE
,
data
[
6
]
&
0x3f
);
rw
=
(
signed
)(
data
[
7
]
&
0x04
)
-
(
data
[
7
]
&
0x03
);
}
else
{
wacom_report_abs
(
wcombo
,
ABS_DISTANCE
,
data
[
7
]
&
0x3f
);
rw
=
-
(
signed
)
data
[
6
];
}
wacom_report_rel
(
wcombo
,
REL_WHEEL
,
rw
);
}
if
(
!
prox
)
wacom
->
id
[
0
]
=
0
;
wacom_report_abs
(
wcombo
,
ABS_MISC
,
wacom
->
id
[
0
]);
/* report tool id */
wacom_report_key
(
wcombo
,
wacom
->
tool
[
0
],
prox
);
wacom_input_sync
(
wcombo
);
/* sync last event */
wacom_report_key
(
wcombo
,
wacom
->
tool
[
0
],
1
);
}
else
if
(
wacom
->
id
[
0
])
{
wacom_report_abs
(
wcombo
,
ABS_X
,
0
);
wacom_report_abs
(
wcombo
,
ABS_Y
,
0
);
if
(
wacom
->
tool
[
0
]
==
BTN_TOOL_MOUSE
)
{
wacom_report_key
(
wcombo
,
BTN_LEFT
,
0
);
wacom_report_key
(
wcombo
,
BTN_RIGHT
,
0
);
wacom_report_abs
(
wcombo
,
ABS_DISTANCE
,
0
);
}
else
{
wacom_report_abs
(
wcombo
,
ABS_PRESSURE
,
0
);
wacom_report_key
(
wcombo
,
BTN_TOUCH
,
0
);
wacom_report_key
(
wcombo
,
BTN_STYLUS
,
0
);
wacom_report_key
(
wcombo
,
BTN_STYLUS2
,
0
);
}
wacom
->
id
[
0
]
=
0
;
wacom_report_abs
(
wcombo
,
ABS_MISC
,
0
);
/* reset tool id */
wacom_report_key
(
wcombo
,
wacom
->
tool
[
0
],
0
);
}
/* send pad data */
switch
(
features
->
type
)
{
case
WACOM_G4
:
prox
=
data
[
7
]
&
0xf8
;
if
(
prox
||
wacom
->
id
[
1
])
{
if
(
data
[
7
]
&
0xf8
)
{
if
(
penData
)
{
wacom_input_sync
(
wcombo
);
/* sync last event */
if
(
!
wacom
->
id
[
0
])
penData
=
0
;
}
wacom
->
id
[
1
]
=
PAD_DEVICE_ID
;
wacom_report_key
(
wcombo
,
BTN_0
,
(
data
[
7
]
&
0x40
));
wacom_report_key
(
wcombo
,
BTN_4
,
(
data
[
7
]
&
0x80
));
...
...
@@ -231,16 +245,29 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
wacom_report_rel
(
wcombo
,
REL_WHEEL
,
rw
);
wacom_report_key
(
wcombo
,
BTN_TOOL_FINGER
,
0xf0
);
wacom_report_abs
(
wcombo
,
ABS_MISC
,
wacom
->
id
[
1
]);
if
(
!
prox
)
wacom
->
id
[
1
]
=
0
;
wacom_report_abs
(
wcombo
,
ABS_MISC
,
wacom
->
id
[
1
]);
wacom_input_event
(
wcombo
,
EV_MSC
,
MSC_SERIAL
,
0xf0
);
}
else
if
(
wacom
->
id
[
1
])
{
if
(
penData
)
{
wacom_input_sync
(
wcombo
);
/* sync last event */
if
(
!
wacom
->
id
[
0
])
penData
=
0
;
}
wacom
->
id
[
1
]
=
0
;
wacom_report_key
(
wcombo
,
BTN_0
,
(
data
[
7
]
&
0x40
));
wacom_report_key
(
wcombo
,
BTN_4
,
(
data
[
7
]
&
0x80
));
wacom_report_rel
(
wcombo
,
REL_WHEEL
,
0
);
wacom_report_key
(
wcombo
,
BTN_TOOL_FINGER
,
0
);
wacom_report_abs
(
wcombo
,
ABS_MISC
,
0
);
wacom_input_event
(
wcombo
,
EV_MSC
,
MSC_SERIAL
,
0xf0
);
}
retval
=
1
;
break
;
case
WACOM_MO
:
prox
=
(
data
[
7
]
&
0xf8
)
||
data
[
8
];
if
(
prox
||
wacom
->
id
[
1
])
{
if
((
data
[
7
]
&
0xf8
)
||
(
data
[
8
]
&
0xff
))
{
if
(
penData
)
{
wacom_input_sync
(
wcombo
);
/* sync last event */
if
(
!
wacom
->
id
[
0
])
penData
=
0
;
}
wacom
->
id
[
1
]
=
PAD_DEVICE_ID
;
wacom_report_key
(
wcombo
,
BTN_0
,
(
data
[
7
]
&
0x08
));
wacom_report_key
(
wcombo
,
BTN_1
,
(
data
[
7
]
&
0x20
));
...
...
@@ -248,16 +275,27 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
wacom_report_key
(
wcombo
,
BTN_5
,
(
data
[
7
]
&
0x40
));
wacom_report_abs
(
wcombo
,
ABS_WHEEL
,
(
data
[
8
]
&
0x7f
));
wacom_report_key
(
wcombo
,
BTN_TOOL_FINGER
,
0xf0
);
if
(
!
prox
)
wacom
->
id
[
1
]
=
0
;
wacom_report_abs
(
wcombo
,
ABS_MISC
,
wacom
->
id
[
1
]);
wacom_input_event
(
wcombo
,
EV_MSC
,
MSC_SERIAL
,
0xf0
);
}
else
if
(
wacom
->
id
[
1
])
{
if
(
penData
)
{
wacom_input_sync
(
wcombo
);
/* sync last event */
if
(
!
wacom
->
id
[
0
])
penData
=
0
;
}
wacom
->
id
[
1
]
=
0
;
wacom_report_key
(
wcombo
,
BTN_0
,
(
data
[
7
]
&
0x08
));
wacom_report_key
(
wcombo
,
BTN_1
,
(
data
[
7
]
&
0x20
));
wacom_report_key
(
wcombo
,
BTN_4
,
(
data
[
7
]
&
0x10
));
wacom_report_key
(
wcombo
,
BTN_5
,
(
data
[
7
]
&
0x40
));
wacom_report_abs
(
wcombo
,
ABS_WHEEL
,
(
data
[
8
]
&
0x7f
));
wacom_report_key
(
wcombo
,
BTN_TOOL_FINGER
,
0
);
wacom_report_abs
(
wcombo
,
ABS_MISC
,
0
);
wacom_input_event
(
wcombo
,
EV_MSC
,
MSC_SERIAL
,
0xf0
);
}
retval
=
1
;
break
;
}
exit:
return
retval
;
return
1
;
}
static
int
wacom_intuos_inout
(
struct
wacom_wac
*
wacom
,
void
*
wcombo
)
...
...
@@ -598,9 +636,9 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo)
static
void
wacom_tpc_finger_in
(
struct
wacom_wac
*
wacom
,
void
*
wcombo
,
char
*
data
,
int
idx
)
{
wacom_report_abs
(
wcombo
,
ABS_X
,
data
[
2
+
idx
*
2
]
|
((
data
[
3
+
idx
*
2
]
&
0x7f
)
<<
8
));
(
data
[
2
+
idx
*
2
]
&
0xff
)
|
((
data
[
3
+
idx
*
2
]
&
0x7f
)
<<
8
));
wacom_report_abs
(
wcombo
,
ABS_Y
,
data
[
6
+
idx
*
2
]
|
((
data
[
7
+
idx
*
2
]
&
0x7f
)
<<
8
));
(
data
[
6
+
idx
*
2
]
&
0xff
)
|
((
data
[
7
+
idx
*
2
]
&
0x7f
)
<<
8
));
wacom_report_abs
(
wcombo
,
ABS_MISC
,
wacom
->
id
[
0
]);
wacom_report_key
(
wcombo
,
wacom
->
tool
[
idx
],
1
);
if
(
idx
)
...
...
@@ -744,24 +782,31 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
touchInProx
=
0
;
if
(
!
wacom
->
id
[
0
])
{
/* first in prox */
/* Going into proximity select tool */
wacom
->
tool
[
0
]
=
(
data
[
1
]
&
0x0c
)
?
BTN_TOOL_RUBBER
:
BTN_TOOL_PEN
;
if
(
wacom
->
tool
[
0
]
==
BTN_TOOL_PEN
)
wacom
->
id
[
0
]
=
STYLUS_DEVICE_ID
;
else
wacom
->
id
[
0
]
=
ERASER_DEVICE_ID
;
}
wacom_report_key
(
wcombo
,
BTN_STYLUS
,
data
[
1
]
&
0x02
);
wacom_report_key
(
wcombo
,
BTN_STYLUS2
,
data
[
1
]
&
0x10
);
wacom_report_abs
(
wcombo
,
ABS_X
,
wacom_le16_to_cpu
(
&
data
[
2
]));
wacom_report_abs
(
wcombo
,
ABS_Y
,
wacom_le16_to_cpu
(
&
data
[
4
]));
pressure
=
((
data
[
7
]
&
0x01
)
<<
8
)
|
data
[
6
];
if
(
pressure
<
0
)
pressure
=
features
->
pressure_max
+
pressure
+
1
;
wacom_report_abs
(
wcombo
,
ABS_PRESSURE
,
pressure
);
wacom_report_key
(
wcombo
,
BTN_TOUCH
,
data
[
1
]
&
0x05
);
if
(
!
prox
)
{
/* out-prox */
if
(
prox
)
{
/* in prox */
if
(
!
wacom
->
id
[
0
])
{
/* Going into proximity select tool */
wacom
->
tool
[
0
]
=
(
data
[
1
]
&
0x0c
)
?
BTN_TOOL_RUBBER
:
BTN_TOOL_PEN
;
if
(
wacom
->
tool
[
0
]
==
BTN_TOOL_PEN
)
wacom
->
id
[
0
]
=
STYLUS_DEVICE_ID
;
else
wacom
->
id
[
0
]
=
ERASER_DEVICE_ID
;
}
wacom_report_key
(
wcombo
,
BTN_STYLUS
,
data
[
1
]
&
0x02
);
wacom_report_key
(
wcombo
,
BTN_STYLUS2
,
data
[
1
]
&
0x10
);
wacom_report_abs
(
wcombo
,
ABS_X
,
wacom_le16_to_cpu
(
&
data
[
2
]));
wacom_report_abs
(
wcombo
,
ABS_Y
,
wacom_le16_to_cpu
(
&
data
[
4
]));
pressure
=
((
data
[
7
]
&
0x01
)
<<
8
)
|
data
[
6
];
if
(
pressure
<
0
)
pressure
=
features
->
pressure_max
+
pressure
+
1
;
wacom_report_abs
(
wcombo
,
ABS_PRESSURE
,
pressure
);
wacom_report_key
(
wcombo
,
BTN_TOUCH
,
data
[
1
]
&
0x05
);
}
else
{
wacom_report_abs
(
wcombo
,
ABS_X
,
0
);
wacom_report_abs
(
wcombo
,
ABS_Y
,
0
);
wacom_report_abs
(
wcombo
,
ABS_PRESSURE
,
0
);
wacom_report_key
(
wcombo
,
BTN_STYLUS
,
0
);
wacom_report_key
(
wcombo
,
BTN_STYLUS2
,
0
);
wacom_report_key
(
wcombo
,
BTN_TOUCH
,
0
);
wacom
->
id
[
0
]
=
0
;
/* pen is out so touch can be enabled now */
touchInProx
=
1
;
...
...
include/linux/input/matrix_keypad.h
浏览文件 @
56f3e1c0
...
...
@@ -44,6 +44,7 @@ struct matrix_keymap_data {
* @active_low: gpio polarity
* @wakeup: controls whether the device should be set up as wakeup
* source
* @no_autorepeat: disable key autorepeat
*
* This structure represents platform-specific data that use used by
* matrix_keypad driver to perform proper initialization.
...
...
@@ -64,6 +65,7 @@ struct matrix_keypad_platform_data {
bool
active_low
;
bool
wakeup
;
bool
no_autorepeat
;
};
/**
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录