Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
817a3125
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
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看板
提交
817a3125
编写于
6月 22, 2015
作者:
J
Jiri Kosina
浏览文件
操作
浏览文件
下载
差异文件
Merge branches 'for-4.1/upstream-fixes', 'for-4.2/upstream' and 'for-4.2/logitech' into for-linus
Conflicts: drivers/hid/hid-logitech-hidpp.c
上级
7250dc3f
74a3e0c7
8a09b4fa
变更
18
展开全部
隐藏空白更改
内联
并排
Showing
18 changed file
with
589 addition
and
248 deletion
+589
-248
Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
+4
-4
drivers/hid/Makefile
drivers/hid/Makefile
+3
-3
drivers/hid/hid-core.c
drivers/hid/hid-core.c
+9
-22
drivers/hid/hid-cypress.c
drivers/hid/hid-cypress.c
+1
-5
drivers/hid/hid-ids.h
drivers/hid/hid-ids.h
+8
-20
drivers/hid/hid-input.c
drivers/hid/hid-input.c
+2
-1
drivers/hid/hid-lenovo.c
drivers/hid/hid-lenovo.c
+7
-2
drivers/hid/hid-lg.c
drivers/hid/hid-lg.c
+14
-10
drivers/hid/hid-lg4ff.c
drivers/hid/hid-lg4ff.c
+300
-158
drivers/hid/hid-lg4ff.h
drivers/hid/hid-lg4ff.h
+2
-2
drivers/hid/hid-logitech-hidpp.c
drivers/hid/hid-logitech-hidpp.c
+224
-3
drivers/hid/hid-microsoft.c
drivers/hid/hid-microsoft.c
+2
-0
drivers/hid/hid-prodikeys.c
drivers/hid/hid-prodikeys.c
+1
-2
drivers/hid/hid-rmi.c
drivers/hid/hid-rmi.c
+3
-3
drivers/hid/i2c-hid/i2c-hid.c
drivers/hid/i2c-hid/i2c-hid.c
+3
-3
drivers/hid/usbhid/hid-quirks.c
drivers/hid/usbhid/hid-quirks.c
+4
-0
drivers/usb/misc/ldusb.c
drivers/usb/misc/ldusb.c
+0
-10
include/linux/hid.h
include/linux/hid.h
+2
-0
未找到文件。
Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
浏览文件 @
817a3125
What: /sys/
module/hid_logitech/drivers/hid:logitech/<dev>/range.
What: /sys/
bus/hid/drivers/logitech/<dev>/range
Date: July 2011
KernelVersion: 3.2
Contact: Michal Malý <madcatxster@
gmail.com
>
Contact: Michal Malý <madcatxster@
devoid-pointer.net
>
Description: Display minimum, maximum and current range of the steering
wheel. Writing a value within min and max boundaries sets the
range of the wheel.
...
...
@@ -9,7 +9,7 @@ Description: Display minimum, maximum and current range of the steering
What: /sys/bus/hid/drivers/logitech/<dev>/alternate_modes
Date: Feb 2015
KernelVersion: 4.1
Contact: Michal Malý <madcatxster@
gmail.com
>
Contact: Michal Malý <madcatxster@
devoid-pointer.net
>
Description: Displays a set of alternate modes supported by a wheel. Each
mode is listed as follows:
Tag: Mode Name
...
...
@@ -45,7 +45,7 @@ Description: Displays a set of alternate modes supported by a wheel. Each
What: /sys/bus/hid/drivers/logitech/<dev>/real_id
Date: Feb 2015
KernelVersion: 4.1
Contact: Michal Malý <madcatxster@
gmail.com
>
Contact: Michal Malý <madcatxster@
devoid-pointer.net
>
Description: Displays the real model of the wheel regardless of any
alternate mode the wheel might be switched to.
It is a read-only value.
...
...
drivers/hid/Makefile
浏览文件 @
817a3125
...
...
@@ -24,7 +24,7 @@ obj-$(CONFIG_HID_A4TECH) += hid-a4tech.o
obj-$(CONFIG_HID_ACRUX)
+=
hid-axff.o
obj-$(CONFIG_HID_APPLE)
+=
hid-apple.o
obj-$(CONFIG_HID_APPLEIR)
+=
hid-appleir.o
obj-$(CONFIG_HID_AUREAL)
+=
hid-aureal.o
obj-$(CONFIG_HID_AUREAL)
+=
hid-aureal.o
obj-$(CONFIG_HID_BELKIN)
+=
hid-belkin.o
obj-$(CONFIG_HID_BETOP_FF)
+=
hid-betopff.o
obj-$(CONFIG_HID_CHERRY)
+=
hid-cherry.o
...
...
@@ -46,12 +46,12 @@ obj-$(CONFIG_HID_ICADE) += hid-icade.o
obj-$(CONFIG_HID_KENSINGTON)
+=
hid-kensington.o
obj-$(CONFIG_HID_KEYTOUCH)
+=
hid-keytouch.o
obj-$(CONFIG_HID_KYE)
+=
hid-kye.o
obj-$(CONFIG_HID_LCPOWER)
+=
hid-lcpower.o
obj-$(CONFIG_HID_LCPOWER)
+=
hid-lcpower.o
obj-$(CONFIG_HID_LENOVO)
+=
hid-lenovo.o
obj-$(CONFIG_HID_LOGITECH)
+=
hid-logitech.o
obj-$(CONFIG_HID_LOGITECH_DJ)
+=
hid-logitech-dj.o
obj-$(CONFIG_HID_LOGITECH_HIDPP)
+=
hid-logitech-hidpp.o
obj-$(CONFIG_HID_MAGICMOUSE)
+=
hid-magicmouse.o
obj-$(CONFIG_HID_MAGICMOUSE)
+=
hid-magicmouse.o
obj-$(CONFIG_HID_MICROSOFT)
+=
hid-microsoft.o
obj-$(CONFIG_HID_MONTEREY)
+=
hid-monterey.o
obj-$(CONFIG_HID_MULTITOUCH)
+=
hid-multitouch.o
...
...
drivers/hid/hid-core.c
浏览文件 @
817a3125
...
...
@@ -706,7 +706,8 @@ static void hid_scan_collection(struct hid_parser *parser, unsigned type)
if
(
hid
->
vendor
==
USB_VENDOR_ID_MICROSOFT
&&
(
hid
->
product
==
USB_DEVICE_ID_MS_TYPE_COVER_3
||
hid
->
product
==
USB_DEVICE_ID_MS_TYPE_COVER_3_JP
)
&&
hid
->
product
==
USB_DEVICE_ID_MS_TYPE_COVER_3_JP
||
hid
->
product
==
USB_DEVICE_ID_MS_POWER_COVER
)
&&
hid
->
group
==
HID_GROUP_MULTITOUCH
)
hid
->
group
=
HID_GROUP_GENERIC
;
...
...
@@ -1061,13 +1062,13 @@ static u32 s32ton(__s32 value, unsigned n)
* Search linux-kernel and linux-usb-devel archives for "hid-core extract".
*/
static
__u32
extract
(
const
struct
hid_device
*
hid
,
__u8
*
report
,
__u32
hid_field_
extract
(
const
struct
hid_device
*
hid
,
__u8
*
report
,
unsigned
offset
,
unsigned
n
)
{
u64
x
;
if
(
n
>
32
)
hid_warn
(
hid
,
"extract() called with n (%d) > 32! (%s)
\n
"
,
hid_warn
(
hid
,
"
hid_field_
extract() called with n (%d) > 32! (%s)
\n
"
,
n
,
current
->
comm
);
report
+=
offset
>>
3
;
/* adjust byte index */
...
...
@@ -1076,6 +1077,7 @@ static __u32 extract(const struct hid_device *hid, __u8 *report,
x
=
(
x
>>
offset
)
&
((
1ULL
<<
n
)
-
1
);
/* extract bit field */
return
(
u32
)
x
;
}
EXPORT_SYMBOL_GPL
(
hid_field_extract
);
/*
* "implement" : set bits in a little endian bit stream.
...
...
@@ -1221,9 +1223,9 @@ static void hid_input_field(struct hid_device *hid, struct hid_field *field,
for
(
n
=
0
;
n
<
count
;
n
++
)
{
value
[
n
]
=
min
<
0
?
snto32
(
extract
(
hid
,
data
,
offset
+
n
*
size
,
size
)
,
size
)
:
extract
(
hid
,
data
,
offset
+
n
*
size
,
size
);
snto32
(
hid_field_extract
(
hid
,
data
,
offset
+
n
*
size
,
size
)
,
size
)
:
hid_field_
extract
(
hid
,
data
,
offset
+
n
*
size
,
size
);
/* Ignore report if ErrorRollOver */
if
(
!
(
field
->
flags
&
HID_MAIN_ITEM_VARIABLE
)
&&
...
...
@@ -1901,6 +1903,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_MICROSOFT
,
USB_DEVICE_ID_MS_OFFICE_KB
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_MICROSOFT
,
USB_DEVICE_ID_MS_TYPE_COVER_3
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_MICROSOFT
,
USB_DEVICE_ID_MS_TYPE_COVER_3_JP
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_MICROSOFT
,
USB_DEVICE_ID_MS_POWER_COVER
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_MONTEREY
,
USB_DEVICE_ID_GENIUS_KB29E
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_MSI
,
USB_DEVICE_ID_MSI_GT683R_LED_PANEL
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_NTRIG
,
USB_DEVICE_ID_NTRIG_TOUCH_SCREEN
)
},
...
...
@@ -2265,14 +2268,6 @@ static const struct hid_device_id hid_ignore_list[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GENERAL_TOUCH
,
0x0001
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GENERAL_TOUCH
,
0x0002
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GENERAL_TOUCH
,
0x0004
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GLAB
,
USB_DEVICE_ID_4_PHIDGETSERVO_30
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GLAB
,
USB_DEVICE_ID_1_PHIDGETSERVO_30
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GLAB
,
USB_DEVICE_ID_0_0_4_IF_KIT
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GLAB
,
USB_DEVICE_ID_0_16_16_IF_KIT
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GLAB
,
USB_DEVICE_ID_8_8_8_IF_KIT
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GLAB
,
USB_DEVICE_ID_0_8_7_IF_KIT
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GLAB
,
USB_DEVICE_ID_0_8_8_IF_KIT
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GLAB
,
USB_DEVICE_ID_PHIDGET_MOTORCONTROL
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GOTOP
,
USB_DEVICE_ID_SUPER_Q2
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GOTOP
,
USB_DEVICE_ID_GOGOPEN
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GOTOP
,
USB_DEVICE_ID_PENPOWER
)
},
...
...
@@ -2399,14 +2394,6 @@ static const struct hid_device_id hid_ignore_list[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_SYNAPTICS
,
USB_DEVICE_ID_SYNAPTICS_WTP
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_SYNAPTICS
,
USB_DEVICE_ID_SYNAPTICS_DPAD
)
},
#endif
{
HID_USB_DEVICE
(
USB_VENDOR_ID_VERNIER
,
USB_DEVICE_ID_VERNIER_LABPRO
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_VERNIER
,
USB_DEVICE_ID_VERNIER_GOTEMP
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_VERNIER
,
USB_DEVICE_ID_VERNIER_SKIP
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_VERNIER
,
USB_DEVICE_ID_VERNIER_CYCLOPS
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_VERNIER
,
USB_DEVICE_ID_VERNIER_LCSPEC
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_WISEGROUP
,
USB_DEVICE_ID_4_PHIDGETSERVO_20
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_WISEGROUP
,
USB_DEVICE_ID_1_PHIDGETSERVO_20
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_WISEGROUP
,
USB_DEVICE_ID_8_8_4_IF_KIT
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_YEALINK
,
USB_DEVICE_ID_YEALINK_P1K_P4K_B2K
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_RISO_KAGAKU
,
USB_DEVICE_ID_RI_KA_WEBMAIL
)
},
{
}
...
...
drivers/hid/hid-cypress.c
浏览文件 @
817a3125
...
...
@@ -41,13 +41,9 @@ static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
for
(
i
=
0
;
i
<
*
rsize
-
4
;
i
++
)
if
(
rdesc
[
i
]
==
0x29
&&
rdesc
[
i
+
2
]
==
0x19
)
{
__u8
tmp
;
rdesc
[
i
]
=
0x19
;
rdesc
[
i
+
2
]
=
0x29
;
tmp
=
rdesc
[
i
+
3
];
rdesc
[
i
+
3
]
=
rdesc
[
i
+
1
];
rdesc
[
i
+
1
]
=
tmp
;
swap
(
rdesc
[
i
+
3
],
rdesc
[
i
+
1
]);
}
return
rdesc
;
}
...
...
drivers/hid/hid-ids.h
浏览文件 @
817a3125
...
...
@@ -364,16 +364,6 @@
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_010A 0x010a
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
#define USB_VENDOR_ID_GLAB 0x06c2
#define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038
#define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039
#define USB_DEVICE_ID_0_0_4_IF_KIT 0x0040
#define USB_DEVICE_ID_0_16_16_IF_KIT 0x0044
#define USB_DEVICE_ID_8_8_8_IF_KIT 0x0045
#define USB_DEVICE_ID_0_8_7_IF_KIT 0x0051
#define USB_DEVICE_ID_0_8_8_IF_KIT 0x0053
#define USB_DEVICE_ID_PHIDGET_MOTORCONTROL 0x0058
#define USB_VENDOR_ID_GOODTOUCH 0x1aad
#define USB_DEVICE_ID_GOODTOUCH_000f 0x000f
...
...
@@ -674,6 +664,7 @@
#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
#define USB_DEVICE_ID_MS_TYPE_COVER_3 0x07dc
#define USB_DEVICE_ID_MS_TYPE_COVER_3_JP 0x07dd
#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
#define USB_VENDOR_ID_MOJO 0x8282
#define USB_DEVICE_ID_RETRO_ADAPTER 0x3201
...
...
@@ -959,13 +950,6 @@
#define USB_DEVICE_ID_VELLEMAN_K8061_FIRST 0x8061
#define USB_DEVICE_ID_VELLEMAN_K8061_LAST 0x8068
#define USB_VENDOR_ID_VERNIER 0x08f7
#define USB_DEVICE_ID_VERNIER_LABPRO 0x0001
#define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002
#define USB_DEVICE_ID_VERNIER_SKIP 0x0003
#define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004
#define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006
#define USB_VENDOR_ID_VTL 0x0306
#define USB_DEVICE_ID_VTL_MULTITOUCH_FF3F 0xff3f
...
...
@@ -984,9 +968,6 @@
#define USB_VENDOR_ID_WISEGROUP 0x0925
#define USB_DEVICE_ID_SMARTJOY_PLUS 0x0005
#define USB_DEVICE_ID_1_PHIDGETSERVO_20 0x8101
#define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104
#define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201
#define USB_DEVICE_ID_SUPER_JOY_BOX_3 0x8888
#define USB_DEVICE_ID_QUAD_USB_JOYPAD 0x8800
#define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866
...
...
@@ -1040,4 +1021,11 @@
#define USB_VENDOR_ID_RISO_KAGAKU 0x1294
/* Riso Kagaku Corp. */
#define USB_DEVICE_ID_RI_KA_WEBMAIL 0x1320
/* Webmail Notifier */
#define USB_VENDOR_ID_MULTIPLE_1781 0x1781
#define USB_DEVICE_ID_RAPHNET_4NES4SNES_OLD 0x0a8d
#define USB_VENDOR_ID_DRACAL_RAPHNET 0x289b
#define USB_DEVICE_ID_RAPHNET_2NES2SNES 0x0002
#define USB_DEVICE_ID_RAPHNET_4NES4SNES 0x0003
#endif
drivers/hid/hid-input.c
浏览文件 @
817a3125
...
...
@@ -1157,7 +1157,8 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
return
;
/* report the usage code as scancode if the key status has changed */
if
(
usage
->
type
==
EV_KEY
&&
!!
test_bit
(
usage
->
code
,
input
->
key
)
!=
value
)
if
(
usage
->
type
==
EV_KEY
&&
(
!
test_bit
(
usage
->
code
,
input
->
key
))
==
value
)
input_event
(
input
,
EV_MSC
,
MSC_SCAN
,
usage
->
hid
);
input_event
(
input
,
usage
->
type
,
usage
->
code
,
value
);
...
...
drivers/hid/hid-lenovo.c
浏览文件 @
817a3125
...
...
@@ -599,7 +599,8 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
GFP_KERNEL
);
if
(
data_pointer
==
NULL
)
{
hid_err
(
hdev
,
"Could not allocate memory for driver data
\n
"
);
return
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
err
;
}
// set same default values as windows driver
...
...
@@ -610,7 +611,8 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
name_micmute
=
devm_kzalloc
(
&
hdev
->
dev
,
name_sz
,
GFP_KERNEL
);
if
(
name_mute
==
NULL
||
name_micmute
==
NULL
)
{
hid_err
(
hdev
,
"Could not allocate memory for led data
\n
"
);
return
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
err
;
}
snprintf
(
name_mute
,
name_sz
,
"%s:amber:mute"
,
dev_name
(
dev
));
snprintf
(
name_micmute
,
name_sz
,
"%s:amber:micmute"
,
dev_name
(
dev
));
...
...
@@ -634,6 +636,9 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
lenovo_features_set_tpkbd
(
hdev
);
return
0
;
err:
sysfs_remove_group
(
&
hdev
->
dev
.
kobj
,
&
lenovo_attr_group_tpkbd
);
return
ret
;
}
static
int
lenovo_probe_cptkbd
(
struct
hid_device
*
hdev
)
...
...
drivers/hid/hid-lg.c
浏览文件 @
817a3125
...
...
@@ -700,7 +700,8 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
/* insert a little delay of 10 jiffies ~ 40ms */
wait_queue_head_t
wait
;
init_waitqueue_head
(
&
wait
);
wait_event_interruptible_timeout
(
wait
,
0
,
10
);
wait_event_interruptible_timeout
(
wait
,
0
,
msecs_to_jiffies
(
40
));
/* Select random Address */
buf
[
1
]
=
0xB2
;
...
...
@@ -712,13 +713,16 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
}
if
(
drv_data
->
quirks
&
LG_FF
)
lgff_init
(
hdev
);
if
(
drv_data
->
quirks
&
LG_FF2
)
lg2ff_init
(
hdev
);
if
(
drv_data
->
quirks
&
LG_FF3
)
lg3ff_init
(
hdev
);
if
(
drv_data
->
quirks
&
LG_FF4
)
lg4ff_init
(
hdev
);
ret
=
lgff_init
(
hdev
);
else
if
(
drv_data
->
quirks
&
LG_FF2
)
ret
=
lg2ff_init
(
hdev
);
else
if
(
drv_data
->
quirks
&
LG_FF3
)
ret
=
lg3ff_init
(
hdev
);
else
if
(
drv_data
->
quirks
&
LG_FF4
)
ret
=
lg4ff_init
(
hdev
);
if
(
ret
)
goto
err_free
;
return
0
;
err_free:
...
...
@@ -731,8 +735,8 @@ static void lg_remove(struct hid_device *hdev)
struct
lg_drv_data
*
drv_data
=
hid_get_drvdata
(
hdev
);
if
(
drv_data
->
quirks
&
LG_FF4
)
lg4ff_deinit
(
hdev
);
hid_hw_stop
(
hdev
);
else
hid_hw_stop
(
hdev
);
kfree
(
drv_data
);
}
...
...
drivers/hid/hid-lg4ff.c
浏览文件 @
817a3125
此差异已折叠。
点击以展开。
drivers/hid/hid-lg4ff.h
浏览文件 @
817a3125
...
...
@@ -5,12 +5,12 @@
extern
int
lg4ff_no_autoswitch
;
/* From hid-lg.c */
int
lg4ff_adjust_input_event
(
struct
hid_device
*
hid
,
struct
hid_field
*
field
,
struct
hid_usage
*
usage
,
__
s32
value
,
struct
lg_drv_data
*
drv_data
);
struct
hid_usage
*
usage
,
s32
value
,
struct
lg_drv_data
*
drv_data
);
int
lg4ff_init
(
struct
hid_device
*
hdev
);
int
lg4ff_deinit
(
struct
hid_device
*
hdev
);
#else
static
inline
int
lg4ff_adjust_input_event
(
struct
hid_device
*
hid
,
struct
hid_field
*
field
,
struct
hid_usage
*
usage
,
__
s32
value
,
struct
lg_drv_data
*
drv_data
)
{
return
0
;
}
struct
hid_usage
*
usage
,
s32
value
,
struct
lg_drv_data
*
drv_data
)
{
return
0
;
}
static
inline
int
lg4ff_init
(
struct
hid_device
*
hdev
)
{
return
-
1
;
}
static
inline
int
lg4ff_deinit
(
struct
hid_device
*
hdev
)
{
return
-
1
;
}
#endif
...
...
drivers/hid/hid-logitech-hidpp.c
浏览文件 @
817a3125
...
...
@@ -40,8 +40,9 @@ MODULE_PARM_DESC(disable_raw_mode,
#define HIDPP_REPORT_LONG_LENGTH 20
#define HIDPP_QUIRK_CLASS_WTP BIT(0)
#define HIDPP_QUIRK_CLASS_M560 BIT(1)
/* bits
1
..20 are reserved for classes */
/* bits
2
..20 are reserved for classes */
#define HIDPP_QUIRK_DELAYED_INIT BIT(21)
#define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS BIT(22)
...
...
@@ -930,6 +931,207 @@ static int wtp_connect(struct hid_device *hdev, bool connected)
true
,
true
);
}
/* ------------------------------------------------------------------------- */
/* Logitech M560 devices */
/* ------------------------------------------------------------------------- */
/*
* Logitech M560 protocol overview
*
* The Logitech M560 mouse, is designed for windows 8. When the middle and/or
* the sides buttons are pressed, it sends some keyboard keys events
* instead of buttons ones.
* To complicate things further, the middle button keys sequence
* is different from the odd press and the even press.
*
* forward button -> Super_R
* backward button -> Super_L+'d' (press only)
* middle button -> 1st time: Alt_L+SuperL+XF86TouchpadOff (press only)
* 2nd time: left-click (press only)
* NB: press-only means that when the button is pressed, the
* KeyPress/ButtonPress and KeyRelease/ButtonRelease events are generated
* together sequentially; instead when the button is released, no event is
* generated !
*
* With the command
* 10<xx>0a 3500af03 (where <xx> is the mouse id),
* the mouse reacts differently:
* - it never sends a keyboard key event
* - for the three mouse button it sends:
* middle button press 11<xx>0a 3500af00...
* side 1 button (forward) press 11<xx>0a 3500b000...
* side 2 button (backward) press 11<xx>0a 3500ae00...
* middle/side1/side2 button release 11<xx>0a 35000000...
*/
static
const
u8
m560_config_parameter
[]
=
{
0x00
,
0xaf
,
0x03
};
struct
m560_private_data
{
struct
input_dev
*
input
;
};
/* how buttons are mapped in the report */
#define M560_MOUSE_BTN_LEFT 0x01
#define M560_MOUSE_BTN_RIGHT 0x02
#define M560_MOUSE_BTN_WHEEL_LEFT 0x08
#define M560_MOUSE_BTN_WHEEL_RIGHT 0x10
#define M560_SUB_ID 0x0a
#define M560_BUTTON_MODE_REGISTER 0x35
static
int
m560_send_config_command
(
struct
hid_device
*
hdev
,
bool
connected
)
{
struct
hidpp_report
response
;
struct
hidpp_device
*
hidpp_dev
;
hidpp_dev
=
hid_get_drvdata
(
hdev
);
if
(
!
connected
)
return
-
ENODEV
;
return
hidpp_send_rap_command_sync
(
hidpp_dev
,
REPORT_ID_HIDPP_SHORT
,
M560_SUB_ID
,
M560_BUTTON_MODE_REGISTER
,
(
u8
*
)
m560_config_parameter
,
sizeof
(
m560_config_parameter
),
&
response
);
}
static
int
m560_allocate
(
struct
hid_device
*
hdev
)
{
struct
hidpp_device
*
hidpp
=
hid_get_drvdata
(
hdev
);
struct
m560_private_data
*
d
;
d
=
devm_kzalloc
(
&
hdev
->
dev
,
sizeof
(
struct
m560_private_data
),
GFP_KERNEL
);
if
(
!
d
)
return
-
ENOMEM
;
hidpp
->
private_data
=
d
;
return
0
;
};
static
int
m560_raw_event
(
struct
hid_device
*
hdev
,
u8
*
data
,
int
size
)
{
struct
hidpp_device
*
hidpp
=
hid_get_drvdata
(
hdev
);
struct
m560_private_data
*
mydata
=
hidpp
->
private_data
;
/* sanity check */
if
(
!
mydata
||
!
mydata
->
input
)
{
hid_err
(
hdev
,
"error in parameter
\n
"
);
return
-
EINVAL
;
}
if
(
size
<
7
)
{
hid_err
(
hdev
,
"error in report
\n
"
);
return
0
;
}
if
(
data
[
0
]
==
REPORT_ID_HIDPP_LONG
&&
data
[
2
]
==
M560_SUB_ID
&&
data
[
6
]
==
0x00
)
{
/*
* m560 mouse report for middle, forward and backward button
*
* data[0] = 0x11
* data[1] = device-id
* data[2] = 0x0a
* data[5] = 0xaf -> middle
* 0xb0 -> forward
* 0xae -> backward
* 0x00 -> release all
* data[6] = 0x00
*/
switch
(
data
[
5
])
{
case
0xaf
:
input_report_key
(
mydata
->
input
,
BTN_MIDDLE
,
1
);
break
;
case
0xb0
:
input_report_key
(
mydata
->
input
,
BTN_FORWARD
,
1
);
break
;
case
0xae
:
input_report_key
(
mydata
->
input
,
BTN_BACK
,
1
);
break
;
case
0x00
:
input_report_key
(
mydata
->
input
,
BTN_BACK
,
0
);
input_report_key
(
mydata
->
input
,
BTN_FORWARD
,
0
);
input_report_key
(
mydata
->
input
,
BTN_MIDDLE
,
0
);
break
;
default:
hid_err
(
hdev
,
"error in report
\n
"
);
return
0
;
}
input_sync
(
mydata
->
input
);
}
else
if
(
data
[
0
]
==
0x02
)
{
/*
* Logitech M560 mouse report
*
* data[0] = type (0x02)
* data[1..2] = buttons
* data[3..5] = xy
* data[6] = wheel
*/
int
v
;
input_report_key
(
mydata
->
input
,
BTN_LEFT
,
!!
(
data
[
1
]
&
M560_MOUSE_BTN_LEFT
));
input_report_key
(
mydata
->
input
,
BTN_RIGHT
,
!!
(
data
[
1
]
&
M560_MOUSE_BTN_RIGHT
));
if
(
data
[
1
]
&
M560_MOUSE_BTN_WHEEL_LEFT
)
input_report_rel
(
mydata
->
input
,
REL_HWHEEL
,
-
1
);
else
if
(
data
[
1
]
&
M560_MOUSE_BTN_WHEEL_RIGHT
)
input_report_rel
(
mydata
->
input
,
REL_HWHEEL
,
1
);
v
=
hid_snto32
(
hid_field_extract
(
hdev
,
data
+
3
,
0
,
12
),
12
);
input_report_rel
(
mydata
->
input
,
REL_X
,
v
);
v
=
hid_snto32
(
hid_field_extract
(
hdev
,
data
+
3
,
12
,
12
),
12
);
input_report_rel
(
mydata
->
input
,
REL_Y
,
v
);
v
=
hid_snto32
(
data
[
6
],
8
);
input_report_rel
(
mydata
->
input
,
REL_WHEEL
,
v
);
input_sync
(
mydata
->
input
);
}
return
1
;
}
static
void
m560_populate_input
(
struct
hidpp_device
*
hidpp
,
struct
input_dev
*
input_dev
,
bool
origin_is_hid_core
)
{
struct
m560_private_data
*
mydata
=
hidpp
->
private_data
;
mydata
->
input
=
input_dev
;
__set_bit
(
EV_KEY
,
mydata
->
input
->
evbit
);
__set_bit
(
BTN_MIDDLE
,
mydata
->
input
->
keybit
);
__set_bit
(
BTN_RIGHT
,
mydata
->
input
->
keybit
);
__set_bit
(
BTN_LEFT
,
mydata
->
input
->
keybit
);
__set_bit
(
BTN_BACK
,
mydata
->
input
->
keybit
);
__set_bit
(
BTN_FORWARD
,
mydata
->
input
->
keybit
);
__set_bit
(
EV_REL
,
mydata
->
input
->
evbit
);
__set_bit
(
REL_X
,
mydata
->
input
->
relbit
);
__set_bit
(
REL_Y
,
mydata
->
input
->
relbit
);
__set_bit
(
REL_WHEEL
,
mydata
->
input
->
relbit
);
__set_bit
(
REL_HWHEEL
,
mydata
->
input
->
relbit
);
}
static
int
m560_input_mapping
(
struct
hid_device
*
hdev
,
struct
hid_input
*
hi
,
struct
hid_field
*
field
,
struct
hid_usage
*
usage
,
unsigned
long
**
bit
,
int
*
max
)
{
return
-
1
;
}
/* -------------------------------------------------------------------------- */
/* Generic HID++ devices */
/* -------------------------------------------------------------------------- */
...
...
@@ -942,6 +1144,9 @@ static int hidpp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
if
(
hidpp
->
quirks
&
HIDPP_QUIRK_CLASS_WTP
)
return
wtp_input_mapping
(
hdev
,
hi
,
field
,
usage
,
bit
,
max
);
else
if
(
hidpp
->
quirks
&
HIDPP_QUIRK_CLASS_M560
&&
field
->
application
!=
HID_GD_MOUSE
)
return
m560_input_mapping
(
hdev
,
hi
,
field
,
usage
,
bit
,
max
);
return
0
;
}
...
...
@@ -951,6 +1156,8 @@ static void hidpp_populate_input(struct hidpp_device *hidpp,
{
if
(
hidpp
->
quirks
&
HIDPP_QUIRK_CLASS_WTP
)
wtp_populate_input
(
hidpp
,
input
,
origin_is_hid_core
);
else
if
(
hidpp
->
quirks
&
HIDPP_QUIRK_CLASS_M560
)
m560_populate_input
(
hidpp
,
input
,
origin_is_hid_core
);
}
static
void
hidpp_input_configured
(
struct
hid_device
*
hdev
,
...
...
@@ -1038,6 +1245,8 @@ static int hidpp_raw_event(struct hid_device *hdev, struct hid_report *report,
if
(
hidpp
->
quirks
&
HIDPP_QUIRK_CLASS_WTP
)
return
wtp_raw_event
(
hdev
,
data
,
size
);
else
if
(
hidpp
->
quirks
&
HIDPP_QUIRK_CLASS_M560
)
return
m560_raw_event
(
hdev
,
data
,
size
);
return
0
;
}
...
...
@@ -1115,6 +1324,10 @@ static void hidpp_connect_event(struct hidpp_device *hidpp)
ret
=
wtp_connect
(
hdev
,
connected
);
if
(
ret
)
return
;
}
else
if
(
hidpp
->
quirks
&
HIDPP_QUIRK_CLASS_M560
)
{
ret
=
m560_send_config_command
(
hdev
,
connected
);
if
(
ret
)
return
;
}
if
(
!
connected
||
hidpp
->
delayed_input
)
...
...
@@ -1190,7 +1403,11 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
if
(
hidpp
->
quirks
&
HIDPP_QUIRK_CLASS_WTP
)
{
ret
=
wtp_allocate
(
hdev
,
id
);
if
(
ret
)
goto
wtp_allocate_fail
;
goto
allocate_fail
;
}
else
if
(
hidpp
->
quirks
&
HIDPP_QUIRK_CLASS_M560
)
{
ret
=
m560_allocate
(
hdev
);
if
(
ret
)
goto
allocate_fail
;
}
INIT_WORK
(
&
hidpp
->
work
,
delayed_work_cb
);
...
...
@@ -1253,7 +1470,7 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
hid_parse_fail:
cancel_work_sync
(
&
hidpp
->
work
);
mutex_destroy
(
&
hidpp
->
send_mutex
);
wtp_
allocate_fail:
allocate_fail:
hid_set_drvdata
(
hdev
,
NULL
);
return
ret
;
}
...
...
@@ -1281,6 +1498,10 @@ static const struct hid_device_id hidpp_devices[] = {
HID_BLUETOOTH_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_T651
),
.
driver_data
=
HIDPP_QUIRK_CLASS_WTP
},
{
/* Mouse logitech M560 */
HID_DEVICE
(
BUS_USB
,
HID_GROUP_LOGITECH_DJ_DEVICE
,
USB_VENDOR_ID_LOGITECH
,
0x402d
),
.
driver_data
=
HIDPP_QUIRK_DELAYED_INIT
|
HIDPP_QUIRK_CLASS_M560
},
{
HID_DEVICE
(
BUS_USB
,
HID_GROUP_LOGITECH_DJ_DEVICE
,
USB_VENDOR_ID_LOGITECH
,
HID_ANY_ID
)},
...
...
drivers/hid/hid-microsoft.c
浏览文件 @
817a3125
...
...
@@ -280,6 +280,8 @@ static const struct hid_device_id ms_devices[] = {
.
driver_data
=
MS_HIDINPUT
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_MICROSOFT
,
USB_DEVICE_ID_MS_TYPE_COVER_3_JP
),
.
driver_data
=
MS_HIDINPUT
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_MICROSOFT
,
USB_DEVICE_ID_MS_POWER_COVER
),
.
driver_data
=
MS_HIDINPUT
},
{
HID_BLUETOOTH_DEVICE
(
USB_VENDOR_ID_MICROSOFT
,
USB_DEVICE_ID_MS_PRESENTER_8K_BT
),
.
driver_data
=
MS_PRESENTER
},
...
...
drivers/hid/hid-prodikeys.c
浏览文件 @
817a3125
...
...
@@ -395,11 +395,10 @@ static int pcmidi_handle_report4(struct pcmidi_snd *pm, u8 *data)
/* break keys */
for
(
bit_index
=
0
;
bit_index
<
24
;
bit_index
++
)
{
key
=
pm
->
last_key
[
bit_index
];
if
(
!
((
0x01
<<
bit_index
)
&
bit_mask
))
{
input_event
(
pm
->
input_ep82
,
EV_KEY
,
pm
->
last_key
[
bit_index
],
0
);
pm
->
last_key
[
bit_index
]
=
0
;
pm
->
last_key
[
bit_index
]
=
0
;
}
}
...
...
drivers/hid/hid-rmi.c
浏览文件 @
817a3125
...
...
@@ -29,9 +29,9 @@
#define RMI_SET_RMI_MODE_REPORT_ID 0x0f
/* Feature Report */
/* flags */
#define RMI_READ_REQUEST_PENDING
BIT(0)
#define RMI_READ_DATA_PENDING
BIT(1)
#define RMI_STARTED
BIT(2)
#define RMI_READ_REQUEST_PENDING
0
#define RMI_READ_DATA_PENDING
1
#define RMI_STARTED
2
/* device flags */
#define RMI_DEVICE BIT(0)
...
...
drivers/hid/i2c-hid/i2c-hid.c
浏览文件 @
817a3125
...
...
@@ -42,9 +42,9 @@
#include <linux/i2c/i2c-hid.h>
/* flags */
#define I2C_HID_STARTED
(1 << 0)
#define I2C_HID_RESET_PENDING
(1 << 1)
#define I2C_HID_READ_PENDING
(1 << 2)
#define I2C_HID_STARTED
0
#define I2C_HID_RESET_PENDING
1
#define I2C_HID_READ_PENDING
2
#define I2C_HID_PWR_ON 0x00
#define I2C_HID_PWR_SLEEP 0x01
...
...
drivers/hid/usbhid/hid-quirks.c
浏览文件 @
817a3125
...
...
@@ -90,6 +90,7 @@ static const struct hid_blacklist {
{
USB_VENDOR_ID_MGE
,
USB_DEVICE_ID_MGE_UPS
,
HID_QUIRK_NOGET
},
{
USB_VENDOR_ID_MICROSOFT
,
USB_DEVICE_ID_MS_TYPE_COVER_3
,
HID_QUIRK_NO_INIT_REPORTS
},
{
USB_VENDOR_ID_MICROSOFT
,
USB_DEVICE_ID_MS_TYPE_COVER_3_JP
,
HID_QUIRK_NO_INIT_REPORTS
},
{
USB_VENDOR_ID_MICROSOFT
,
USB_DEVICE_ID_MS_POWER_COVER
,
HID_QUIRK_NO_INIT_REPORTS
},
{
USB_VENDOR_ID_MSI
,
USB_DEVICE_ID_MSI_GT683R_LED_PANEL
,
HID_QUIRK_NO_INIT_REPORTS
},
{
USB_VENDOR_ID_NEXIO
,
USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750
,
HID_QUIRK_NO_INIT_REPORTS
},
{
USB_VENDOR_ID_NOVATEK
,
USB_DEVICE_ID_NOVATEK_MOUSE
,
HID_QUIRK_NO_INIT_REPORTS
},
...
...
@@ -142,6 +143,9 @@ static const struct hid_blacklist {
{
USB_VENDOR_ID_SYNAPTICS
,
USB_DEVICE_ID_SYNAPTICS_QUAD_HD
,
HID_QUIRK_NO_INIT_REPORTS
},
{
USB_VENDOR_ID_SYNAPTICS
,
USB_DEVICE_ID_SYNAPTICS_TP_V103
,
HID_QUIRK_NO_INIT_REPORTS
},
{
USB_VENDOR_ID_HOLTEK_ALT
,
USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A096
,
HID_QUIRK_NO_INIT_INPUT_REPORTS
},
{
USB_VENDOR_ID_MULTIPLE_1781
,
USB_DEVICE_ID_RAPHNET_4NES4SNES_OLD
,
HID_QUIRK_MULTI_INPUT
},
{
USB_VENDOR_ID_DRACAL_RAPHNET
,
USB_DEVICE_ID_RAPHNET_2NES2SNES
,
HID_QUIRK_MULTI_INPUT
},
{
USB_VENDOR_ID_DRACAL_RAPHNET
,
USB_DEVICE_ID_RAPHNET_4NES4SNES
,
HID_QUIRK_MULTI_INPUT
},
{
0
,
0
}
};
...
...
drivers/usb/misc/ldusb.c
浏览文件 @
817a3125
...
...
@@ -69,12 +69,6 @@
#define USB_DEVICE_ID_LD_HYBRID 0x2090
/* USB Product ID of Automotive Hybrid */
#define USB_DEVICE_ID_LD_HEATCONTROL 0x20A0
/* USB Product ID of Heat control */
#define USB_VENDOR_ID_VERNIER 0x08f7
#define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002
#define USB_DEVICE_ID_VERNIER_SKIP 0x0003
#define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004
#define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006
#ifdef CONFIG_USB_DYNAMIC_MINORS
#define USB_LD_MINOR_BASE 0
#else
...
...
@@ -115,10 +109,6 @@ static const struct usb_device_id ld_usb_table[] = {
{
USB_DEVICE
(
USB_VENDOR_ID_LD
,
USB_DEVICE_ID_LD_MCT
)
},
{
USB_DEVICE
(
USB_VENDOR_ID_LD
,
USB_DEVICE_ID_LD_HYBRID
)
},
{
USB_DEVICE
(
USB_VENDOR_ID_LD
,
USB_DEVICE_ID_LD_HEATCONTROL
)
},
{
USB_DEVICE
(
USB_VENDOR_ID_VERNIER
,
USB_DEVICE_ID_VERNIER_GOTEMP
)
},
{
USB_DEVICE
(
USB_VENDOR_ID_VERNIER
,
USB_DEVICE_ID_VERNIER_SKIP
)
},
{
USB_DEVICE
(
USB_VENDOR_ID_VERNIER
,
USB_DEVICE_ID_VERNIER_CYCLOPS
)
},
{
USB_DEVICE
(
USB_VENDOR_ID_VERNIER
,
USB_DEVICE_ID_VERNIER_LCSPEC
)
},
{
}
/* Terminating entry */
};
MODULE_DEVICE_TABLE
(
usb
,
ld_usb_table
);
...
...
include/linux/hid.h
浏览文件 @
817a3125
...
...
@@ -815,6 +815,8 @@ void hid_disconnect(struct hid_device *hid);
const
struct
hid_device_id
*
hid_match_id
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
);
s32
hid_snto32
(
__u32
value
,
unsigned
n
);
__u32
hid_field_extract
(
const
struct
hid_device
*
hid
,
__u8
*
report
,
unsigned
offset
,
unsigned
n
);
/**
* hid_device_io_start - enable HID input during probe, remove
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录