Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
6341de05
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 1 年 前同步成功
通知
152
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,发现更多精彩内容 >>
提交
6341de05
编写于
6月 12, 2009
作者:
J
Jiri Kosina
浏览文件
操作
浏览文件
下载
差异文件
Merge branches 'upstream' and 'ntrig-multitouch' into for-linus
上级
8ebf9756
fa047e4f
57fd637a
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
841 addition
and
51 deletion
+841
-51
drivers/hid/Kconfig
drivers/hid/Kconfig
+77
-15
drivers/hid/Makefile
drivers/hid/Makefile
+6
-4
drivers/hid/hid-apple.c
drivers/hid/hid-apple.c
+0
-4
drivers/hid/hid-core.c
drivers/hid/hid-core.c
+2
-0
drivers/hid/hid-debug.c
drivers/hid/hid-debug.c
+21
-2
drivers/hid/hid-drff.c
drivers/hid/hid-drff.c
+8
-0
drivers/hid/hid-gaff.c
drivers/hid/hid-gaff.c
+8
-0
drivers/hid/hid-ids.h
drivers/hid/hid-ids.h
+2
-0
drivers/hid/hid-lgff.c
drivers/hid/hid-lgff.c
+8
-2
drivers/hid/hid-ntrig.c
drivers/hid/hid-ntrig.c
+211
-11
drivers/hid/hid-sjoy.c
drivers/hid/hid-sjoy.c
+180
-0
drivers/hid/hid-tmff.c
drivers/hid/hid-tmff.c
+12
-5
drivers/hid/hid-wacom.c
drivers/hid/hid-wacom.c
+259
-0
drivers/hid/hid-zpff.c
drivers/hid/hid-zpff.c
+7
-0
drivers/hid/hidraw.c
drivers/hid/hidraw.c
+1
-4
drivers/hid/usbhid/hid-core.c
drivers/hid/usbhid/hid-core.c
+3
-4
include/linux/hid.h
include/linux/hid.h
+36
-0
未找到文件。
drivers/hid/Kconfig
浏览文件 @
6341de05
...
@@ -116,9 +116,16 @@ config HID_CYPRESS
...
@@ -116,9 +116,16 @@ config HID_CYPRESS
---help---
---help---
Support for cypress mouse and barcode readers.
Support for cypress mouse and barcode readers.
config
DRAGONRISE_FF
config
HID_DRAGONRISE
tristate "DragonRise Inc.
force feedback support"
tristate "DragonRise Inc.
support" if EMBEDDED
depends on USB_HID
depends on USB_HID
default !EMBEDDED
---help---
Say Y here if you have DragonRise Inc.game controllers.
config DRAGONRISE_FF
bool "DragonRise Inc. force feedback support"
depends on HID_DRAGONRISE
select INPUT_FF_MEMLESS
select INPUT_FF_MEMLESS
---help---
---help---
Say Y here if you want to enable force feedback support for DragonRise Inc.
Say Y here if you want to enable force feedback support for DragonRise Inc.
...
@@ -160,7 +167,7 @@ config HID_LOGITECH
...
@@ -160,7 +167,7 @@ config HID_LOGITECH
Support for Logitech devices that are not fully compliant with HID standard.
Support for Logitech devices that are not fully compliant with HID standard.
config LOGITECH_FF
config LOGITECH_FF
bool "Logitech force feedback"
bool "Logitech force feedback
support
"
depends on HID_LOGITECH
depends on HID_LOGITECH
select INPUT_FF_MEMLESS
select INPUT_FF_MEMLESS
help
help
...
@@ -176,7 +183,7 @@ config LOGITECH_FF
...
@@ -176,7 +183,7 @@ config LOGITECH_FF
force feedback.
force feedback.
config LOGIRUMBLEPAD2_FF
config LOGIRUMBLEPAD2_FF
bool "Logitech Rumblepad 2 force feedback"
bool "Logitech Rumblepad 2 force feedback
support
"
depends on HID_LOGITECH
depends on HID_LOGITECH
select INPUT_FF_MEMLESS
select INPUT_FF_MEMLESS
help
help
...
@@ -211,11 +218,19 @@ config HID_PANTHERLORD
...
@@ -211,11 +218,19 @@ config HID_PANTHERLORD
---help---
---help---
Support for PantherLord/GreenAsia based device support.
Support for PantherLord/GreenAsia based device support.
config HID_PANTHERLORD
tristate "Pantherlord support" if EMBEDDED
depends on USB_HID
default !EMBEDDED
---help---
Say Y here if you have a PantherLord/GreenAsia based game controller
or adapter.
config PANTHERLORD_FF
config PANTHERLORD_FF
bool "Pantherlord force feedback support"
bool "Pantherlord force feedback support"
depends on HID_PANTHERLORD
depends on HID_PANTHERLORD
select INPUT_FF_MEMLESS
select INPUT_FF_MEMLESS
help
---help---
Say Y here if you have a PantherLord/GreenAsia based game controller
Say Y here if you have a PantherLord/GreenAsia based game controller
or adapter and want to enable force feedback support for it.
or adapter and want to enable force feedback support for it.
...
@@ -247,15 +262,38 @@ config HID_SUNPLUS
...
@@ -247,15 +262,38 @@ config HID_SUNPLUS
---help---
---help---
Support for Sunplus wireless desktop.
Support for Sunplus wireless desktop.
config
GREENASIA_FF
config
HID_GREENASIA
tristate "GreenAsia (Product ID 0x12)
force feedback support"
tristate "GreenAsia (Product ID 0x12)
support" if EMBEDDED
depends on USB_HID
depends on USB_HID
default !EMBEDDED
---help---
Say Y here if you have a GreenAsia (Product ID 0x12) based game
controller or adapter.
config GREENASIA_FF
bool "GreenAsia (Product ID 0x12) force feedback support"
depends on HID_GREENASIA
select INPUT_FF_MEMLESS
select INPUT_FF_MEMLESS
---help---
---help---
Say Y here if you have a GreenAsia (Product ID 0x12) based game controller
Say Y here if you have a GreenAsia (Product ID 0x12) based game controller
(like MANTA Warrior MM816 and SpeedLink Strike2 SL-6635) or adapter
(like MANTA Warrior MM816 and SpeedLink Strike2 SL-6635) or adapter
and want to enable force feedback support for it.
and want to enable force feedback support for it.
config HID_SMARTJOYPLUS
tristate "SmartJoy PLUS PS2/USB adapter support" if EMBEDDED
depends on USB_HID
default !EMBEDDED
---help---
Support for SmartJoy PLUS PS2/USB adapter.
config SMARTJOYPLUS_FF
bool "SmartJoy PLUS PS2/USB adapter force feedback support"
depends on HID_SMARTJOYPLUS
select INPUT_FF_MEMLESS
---help---
Say Y here if you have a SmartJoy PLUS PS2/USB adapter and want to
enable force feedback support for it.
config HID_TOPSEED
config HID_TOPSEED
tristate "TopSeed Cyberlink remote control support" if EMBEDDED
tristate "TopSeed Cyberlink remote control support" if EMBEDDED
depends on USB_HID
depends on USB_HID
...
@@ -263,21 +301,45 @@ config HID_TOPSEED
...
@@ -263,21 +301,45 @@ config HID_TOPSEED
---help---
---help---
Say Y if you have a TopSeed Cyberlink remote control.
Say Y if you have a TopSeed Cyberlink remote control.
config
THRUSTMASTER_FF
config
HID_THRUSTMASTER
tristate "ThrustMaster devices support"
tristate "ThrustMaster devices support"
if EMBEDDED
depends on USB_HID
depends on USB_HID
default !EMBEDDED
---help---
Say Y here if you have a THRUSTMASTER FireStore Dual Power 2 or
a THRUSTMASTER Ferrari GT Rumble Wheel.
config THRUSTMASTER_FF
bool "ThrustMaster devices force feedback support"
depends on HID_THRUSTMASTER
select INPUT_FF_MEMLESS
select INPUT_FF_MEMLESS
help
---help---
Say Y here if you have a THRUSTMASTER FireStore Dual Power 2 or
Say Y here if you have a THRUSTMASTER FireStore Dual Power 2 or
a THRUSTMASTER Ferrari GT Rumble Force or Force Feedback Wheel.
a THRUSTMASTER Ferrari GT Rumble Force or Force Feedback Wheel and
want to enable force feedback support for it.
config ZEROPLUS_FF
config HID_WACOM
tristate "Zeroplus based game controller support"
tristate "Wacom Bluetooth devices support" if EMBEDDED
depends on BT_HIDP
default !EMBEDDED
---help---
Support for Wacom Graphire Bluetooth tablet.
config HID_ZEROPLUS
tristate "Zeroplus based game controller support" if EMBEDDED
depends on USB_HID
depends on USB_HID
select INPUT_FF_MEMLESS
default !EMBEDDED
help
---help---
Say Y here if you have a Zeroplus based game controller.
Say Y here if you have a Zeroplus based game controller.
config ZEROPLUS_FF
bool "Zeroplus based game controller force feedback support"
depends on HID_ZEROPLUS
select INPUT_FF_MEMLESS
---help---
Say Y here if you have a Zeroplus based game controller and want
to have force feedback support for it.
endmenu
endmenu
endif # HID_SUPPORT
endif # HID_SUPPORT
drivers/hid/Makefile
浏览文件 @
6341de05
...
@@ -22,7 +22,7 @@ obj-$(CONFIG_HID_BELKIN) += hid-belkin.o
...
@@ -22,7 +22,7 @@ obj-$(CONFIG_HID_BELKIN) += hid-belkin.o
obj-$(CONFIG_HID_CHERRY)
+=
hid-cherry.o
obj-$(CONFIG_HID_CHERRY)
+=
hid-cherry.o
obj-$(CONFIG_HID_CHICONY)
+=
hid-chicony.o
obj-$(CONFIG_HID_CHICONY)
+=
hid-chicony.o
obj-$(CONFIG_HID_CYPRESS)
+=
hid-cypress.o
obj-$(CONFIG_HID_CYPRESS)
+=
hid-cypress.o
obj-$(CONFIG_
DRAGONRISE_FF
)
+=
hid-drff.o
obj-$(CONFIG_
HID_DRAGONRISE
)
+=
hid-drff.o
obj-$(CONFIG_HID_EZKEY)
+=
hid-ezkey.o
obj-$(CONFIG_HID_EZKEY)
+=
hid-ezkey.o
obj-$(CONFIG_HID_GYRATION)
+=
hid-gyration.o
obj-$(CONFIG_HID_GYRATION)
+=
hid-gyration.o
obj-$(CONFIG_HID_KENSINGTON)
+=
hid-kensington.o
obj-$(CONFIG_HID_KENSINGTON)
+=
hid-kensington.o
...
@@ -34,12 +34,14 @@ obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o
...
@@ -34,12 +34,14 @@ obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o
obj-$(CONFIG_HID_PANTHERLORD)
+=
hid-pl.o
obj-$(CONFIG_HID_PANTHERLORD)
+=
hid-pl.o
obj-$(CONFIG_HID_PETALYNX)
+=
hid-petalynx.o
obj-$(CONFIG_HID_PETALYNX)
+=
hid-petalynx.o
obj-$(CONFIG_HID_SAMSUNG)
+=
hid-samsung.o
obj-$(CONFIG_HID_SAMSUNG)
+=
hid-samsung.o
obj-$(CONFIG_HID_SMARTJOYPLUS)
+=
hid-sjoy.o
obj-$(CONFIG_HID_SONY)
+=
hid-sony.o
obj-$(CONFIG_HID_SONY)
+=
hid-sony.o
obj-$(CONFIG_HID_SUNPLUS)
+=
hid-sunplus.o
obj-$(CONFIG_HID_SUNPLUS)
+=
hid-sunplus.o
obj-$(CONFIG_
GREENASIA_FF
)
+=
hid-gaff.o
obj-$(CONFIG_
HID_GREENASIA
)
+=
hid-gaff.o
obj-$(CONFIG_
THRUSTMASTER_FF
)
+=
hid-tmff.o
obj-$(CONFIG_
HID_THRUSTMASTER
)
+=
hid-tmff.o
obj-$(CONFIG_HID_TOPSEED)
+=
hid-topseed.o
obj-$(CONFIG_HID_TOPSEED)
+=
hid-topseed.o
obj-$(CONFIG_ZEROPLUS_FF)
+=
hid-zpff.o
obj-$(CONFIG_HID_ZEROPLUS)
+=
hid-zpff.o
obj-$(CONFIG_HID_WACOM)
+=
hid-wacom.o
obj-$(CONFIG_USB_HID)
+=
usbhid/
obj-$(CONFIG_USB_HID)
+=
usbhid/
obj-$(CONFIG_USB_MOUSE)
+=
usbhid/
obj-$(CONFIG_USB_MOUSE)
+=
usbhid/
...
...
drivers/hid/hid-apple.c
浏览文件 @
6341de05
...
@@ -436,10 +436,6 @@ static const struct hid_device_id apple_devices[] = {
...
@@ -436,10 +436,6 @@ static const struct hid_device_id apple_devices[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_APPLE
,
USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY
),
{
HID_USB_DEVICE
(
USB_VENDOR_ID_APPLE
,
USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY
),
.
driver_data
=
APPLE_NUMLOCK_EMULATION
|
APPLE_HAS_FN
},
.
driver_data
=
APPLE_NUMLOCK_EMULATION
|
APPLE_HAS_FN
},
/* Apple wireless Mighty Mouse */
{
HID_BLUETOOTH_DEVICE
(
USB_VENDOR_ID_APPLE
,
0x030c
),
.
driver_data
=
APPLE_MIGHTYMOUSE
|
APPLE_INVERT_HWHEEL
},
{
}
{
}
};
};
MODULE_DEVICE_TABLE
(
hid
,
apple_devices
);
MODULE_DEVICE_TABLE
(
hid
,
apple_devices
);
...
...
drivers/hid/hid-core.c
浏览文件 @
6341de05
...
@@ -1312,6 +1312,8 @@ static const struct hid_device_id hid_blacklist[] = {
...
@@ -1312,6 +1312,8 @@ static const struct hid_device_id hid_blacklist[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_THRUSTMASTER
,
0xb651
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_THRUSTMASTER
,
0xb651
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_THRUSTMASTER
,
0xb654
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_THRUSTMASTER
,
0xb654
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_TOPSEED
,
USB_DEVICE_ID_TOPSEED_CYBERLINK
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_TOPSEED
,
USB_DEVICE_ID_TOPSEED_CYBERLINK
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_WISEGROUP
,
USB_DEVICE_ID_SMARTJOY_PLUS
)
},
{
HID_BLUETOOTH_DEVICE
(
USB_VENDOR_ID_WACOM
,
USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_ZEROPLUS
,
0x0005
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_ZEROPLUS
,
0x0005
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_ZEROPLUS
,
0x0030
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_ZEROPLUS
,
0x0030
)
},
...
...
drivers/hid/hid-debug.c
浏览文件 @
6341de05
...
@@ -137,6 +137,14 @@ static const struct hid_usage_entry hid_usage_table[] = {
...
@@ -137,6 +137,14 @@ static const struct hid_usage_entry hid_usage_table[] = {
{
0
,
0x44
,
"BarrelSwitch"
},
{
0
,
0x44
,
"BarrelSwitch"
},
{
0
,
0x45
,
"Eraser"
},
{
0
,
0x45
,
"Eraser"
},
{
0
,
0x46
,
"TabletPick"
},
{
0
,
0x46
,
"TabletPick"
},
{
0
,
0x47
,
"Confidence"
},
{
0
,
0x48
,
"Width"
},
{
0
,
0x49
,
"Height"
},
{
0
,
0x51
,
"ContactID"
},
{
0
,
0x52
,
"InputMode"
},
{
0
,
0x53
,
"DeviceIndex"
},
{
0
,
0x54
,
"ContactCount"
},
{
0
,
0x55
,
"ContactMaximumNumber"
},
{
15
,
0
,
"PhysicalInterfaceDevice"
},
{
15
,
0
,
"PhysicalInterfaceDevice"
},
{
0
,
0x00
,
"Undefined"
},
{
0
,
0x00
,
"Undefined"
},
{
0
,
0x01
,
"Physical_Interface_Device"
},
{
0
,
0x01
,
"Physical_Interface_Device"
},
...
@@ -514,9 +522,11 @@ static const char *events[EV_MAX + 1] = {
...
@@ -514,9 +522,11 @@ static const char *events[EV_MAX + 1] = {
[
EV_FF_STATUS
]
=
"ForceFeedbackStatus"
,
[
EV_FF_STATUS
]
=
"ForceFeedbackStatus"
,
};
};
static
const
char
*
syncs
[
2
]
=
{
static
const
char
*
syncs
[
3
]
=
{
[
SYN_REPORT
]
=
"Report"
,
[
SYN_CONFIG
]
=
"Config"
,
[
SYN_REPORT
]
=
"Report"
,
[
SYN_CONFIG
]
=
"Config"
,
[
SYN_MT_REPORT
]
=
"MT Report"
,
};
};
static
const
char
*
keys
[
KEY_MAX
+
1
]
=
{
static
const
char
*
keys
[
KEY_MAX
+
1
]
=
{
[
KEY_RESERVED
]
=
"Reserved"
,
[
KEY_ESC
]
=
"Esc"
,
[
KEY_RESERVED
]
=
"Reserved"
,
[
KEY_ESC
]
=
"Esc"
,
[
KEY_1
]
=
"1"
,
[
KEY_2
]
=
"2"
,
[
KEY_1
]
=
"1"
,
[
KEY_2
]
=
"2"
,
...
@@ -734,8 +744,17 @@ static const char *absolutes[ABS_MAX + 1] = {
...
@@ -734,8 +744,17 @@ static const char *absolutes[ABS_MAX + 1] = {
[
ABS_HAT2Y
]
=
"Hat2Y"
,
[
ABS_HAT3X
]
=
"Hat3X"
,
[
ABS_HAT2Y
]
=
"Hat2Y"
,
[
ABS_HAT3X
]
=
"Hat3X"
,
[
ABS_HAT3Y
]
=
"Hat 3Y"
,
[
ABS_PRESSURE
]
=
"Pressure"
,
[
ABS_HAT3Y
]
=
"Hat 3Y"
,
[
ABS_PRESSURE
]
=
"Pressure"
,
[
ABS_DISTANCE
]
=
"Distance"
,
[
ABS_TILT_X
]
=
"XTilt"
,
[
ABS_DISTANCE
]
=
"Distance"
,
[
ABS_TILT_X
]
=
"XTilt"
,
[
ABS_TILT_Y
]
=
"YTilt"
,
[
ABS_TOOL_WIDTH
]
=
"Tool
Width"
,
[
ABS_TILT_Y
]
=
"YTilt"
,
[
ABS_TOOL_WIDTH
]
=
"ToolWidth"
,
[
ABS_VOLUME
]
=
"Volume"
,
[
ABS_MISC
]
=
"Misc"
,
[
ABS_VOLUME
]
=
"Volume"
,
[
ABS_MISC
]
=
"Misc"
,
[
ABS_MT_TOUCH_MAJOR
]
=
"MTMajor"
,
[
ABS_MT_TOUCH_MINOR
]
=
"MTMinor"
,
[
ABS_MT_WIDTH_MAJOR
]
=
"MTMajorW"
,
[
ABS_MT_WIDTH_MINOR
]
=
"MTMinorW"
,
[
ABS_MT_ORIENTATION
]
=
"MTOrientation"
,
[
ABS_MT_POSITION_X
]
=
"MTPositionX"
,
[
ABS_MT_POSITION_Y
]
=
"MTPositionY"
,
[
ABS_MT_TOOL_TYPE
]
=
"MTToolType"
,
[
ABS_MT_BLOB_ID
]
=
"MTBlobID"
,
};
};
static
const
char
*
misc
[
MSC_MAX
+
1
]
=
{
static
const
char
*
misc
[
MSC_MAX
+
1
]
=
{
...
...
drivers/hid/hid-drff.c
浏览文件 @
6341de05
...
@@ -32,6 +32,8 @@
...
@@ -32,6 +32,8 @@
#include <linux/hid.h>
#include <linux/hid.h>
#include "hid-ids.h"
#include "hid-ids.h"
#ifdef CONFIG_DRAGONRISE_FF
#include "usbhid/usbhid.h"
#include "usbhid/usbhid.h"
struct
drff_device
{
struct
drff_device
{
...
@@ -135,6 +137,12 @@ static int drff_init(struct hid_device *hid)
...
@@ -135,6 +137,12 @@ static int drff_init(struct hid_device *hid)
return
0
;
return
0
;
}
}
#else
static
inline
int
drff_init
(
struct
hid_device
*
hid
)
{
return
0
;
}
#endif
static
int
dr_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
static
int
dr_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
{
{
...
...
drivers/hid/hid-gaff.c
浏览文件 @
6341de05
...
@@ -31,6 +31,8 @@
...
@@ -31,6 +31,8 @@
#include <linux/usb.h>
#include <linux/usb.h>
#include <linux/hid.h>
#include <linux/hid.h>
#include "hid-ids.h"
#include "hid-ids.h"
#ifdef CONFIG_GREENASIA_FF
#include "usbhid/usbhid.h"
#include "usbhid/usbhid.h"
struct
gaff_device
{
struct
gaff_device
{
...
@@ -130,6 +132,12 @@ static int gaff_init(struct hid_device *hid)
...
@@ -130,6 +132,12 @@ static int gaff_init(struct hid_device *hid)
return
0
;
return
0
;
}
}
#else
static
inline
int
gaff_init
(
struct
hid_device
*
hdev
)
{
return
0
;
}
#endif
static
int
ga_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
static
int
ga_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
{
{
...
...
drivers/hid/hid-ids.h
浏览文件 @
6341de05
...
@@ -414,8 +414,10 @@
...
@@ -414,8 +414,10 @@
#define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006
#define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006
#define USB_VENDOR_ID_WACOM 0x056a
#define USB_VENDOR_ID_WACOM 0x056a
#define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH 0x81
#define USB_VENDOR_ID_WISEGROUP 0x0925
#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_1_PHIDGETSERVO_20 0x8101
#define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104
#define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104
#define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201
#define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201
...
...
drivers/hid/hid-lgff.c
浏览文件 @
6341de05
...
@@ -50,6 +50,12 @@ static const signed short ff_joystick[] = {
...
@@ -50,6 +50,12 @@ static const signed short ff_joystick[] = {
-
1
-
1
};
};
static
const
signed
short
ff_joystick_ac
[]
=
{
FF_CONSTANT
,
FF_AUTOCENTER
,
-
1
};
static
const
signed
short
ff_wheel
[]
=
{
static
const
signed
short
ff_wheel
[]
=
{
FF_CONSTANT
,
FF_CONSTANT
,
FF_AUTOCENTER
,
FF_AUTOCENTER
,
...
@@ -60,8 +66,8 @@ static const struct dev_type devices[] = {
...
@@ -60,8 +66,8 @@ static const struct dev_type devices[] = {
{
0x046d
,
0xc211
,
ff_rumble
},
{
0x046d
,
0xc211
,
ff_rumble
},
{
0x046d
,
0xc219
,
ff_rumble
},
{
0x046d
,
0xc219
,
ff_rumble
},
{
0x046d
,
0xc283
,
ff_joystick
},
{
0x046d
,
0xc283
,
ff_joystick
},
{
0x046d
,
0xc286
,
ff_joystick
},
{
0x046d
,
0xc286
,
ff_joystick
_ac
},
{
0x046d
,
0xc294
,
ff_
joystick
},
{
0x046d
,
0xc294
,
ff_
wheel
},
{
0x046d
,
0xc295
,
ff_joystick
},
{
0x046d
,
0xc295
,
ff_joystick
},
{
0x046d
,
0xca03
,
ff_wheel
},
{
0x046d
,
0xca03
,
ff_wheel
},
};
};
...
...
drivers/hid/hid-ntrig.c
浏览文件 @
6341de05
/*
/*
* HID driver for
some ntrig "special" device
s
* HID driver for
N-Trig touchscreen
s
*
*
* Copyright (c) 1999 Andreas Gal
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
* Copyright (c) 2006-2007 Jiri Kosina
* Copyright (c) 2007 Paul Walmsley
* Copyright (c) 2008 Jiri Slaby
* Copyright (c) 2008 Rafi Rubin
* Copyright (c) 2008 Rafi Rubin
* Copyright (c) 2009 Stephane Chatty
*
*
*/
*/
...
@@ -29,15 +24,79 @@
...
@@ -29,15 +24,79 @@
#define nt_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
#define nt_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
EV_KEY, (c))
EV_KEY, (c))
struct
ntrig_data
{
__s32
x
,
y
,
id
,
w
,
h
;
char
reading_a_point
,
found_contact_id
;
};
/*
* this driver is aimed at two firmware versions in circulation:
* - dual pen/finger single touch
* - finger multitouch, pen not working
*/
static
int
ntrig_input_mapping
(
struct
hid_device
*
hdev
,
struct
hid_input
*
hi
,
static
int
ntrig_input_mapping
(
struct
hid_device
*
hdev
,
struct
hid_input
*
hi
,
struct
hid_field
*
field
,
struct
hid_usage
*
usage
,
struct
hid_field
*
field
,
struct
hid_usage
*
usage
,
unsigned
long
**
bit
,
int
*
max
)
unsigned
long
**
bit
,
int
*
max
)
{
{
if
((
usage
->
hid
&
HID_USAGE_PAGE
)
==
HID_UP_DIGITIZER
&&
switch
(
usage
->
hid
&
HID_USAGE_PAGE
)
{
(
usage
->
hid
&
0xff
)
==
0x47
)
{
nt_map_key_clear
(
BTN_TOOL_DOUBLETAP
);
case
HID_UP_GENDESK
:
return
1
;
switch
(
usage
->
hid
)
{
case
HID_GD_X
:
hid_map_usage
(
hi
,
usage
,
bit
,
max
,
EV_ABS
,
ABS_MT_POSITION_X
);
input_set_abs_params
(
hi
->
input
,
ABS_X
,
field
->
logical_minimum
,
field
->
logical_maximum
,
0
,
0
);
return
1
;
case
HID_GD_Y
:
hid_map_usage
(
hi
,
usage
,
bit
,
max
,
EV_ABS
,
ABS_MT_POSITION_Y
);
input_set_abs_params
(
hi
->
input
,
ABS_Y
,
field
->
logical_minimum
,
field
->
logical_maximum
,
0
,
0
);
return
1
;
}
return
0
;
case
HID_UP_DIGITIZER
:
switch
(
usage
->
hid
)
{
/* we do not want to map these for now */
case
HID_DG_INVERT
:
/* value is always 0 */
case
HID_DG_ERASER
:
/* value is always 0 */
case
HID_DG_CONTACTID
:
/* value is useless */
case
HID_DG_BARRELSWITCH
:
/* doubtful */
case
HID_DG_INPUTMODE
:
case
HID_DG_DEVICEINDEX
:
case
HID_DG_CONTACTCOUNT
:
case
HID_DG_CONTACTMAX
:
return
-
1
;
/* original mapping by Rafi Rubin */
case
HID_DG_CONFIDENCE
:
nt_map_key_clear
(
BTN_TOOL_DOUBLETAP
);
return
1
;
/* width/height mapped on TouchMajor/TouchMinor/Orientation */
case
HID_DG_WIDTH
:
hid_map_usage
(
hi
,
usage
,
bit
,
max
,
EV_ABS
,
ABS_MT_TOUCH_MAJOR
);
return
1
;
case
HID_DG_HEIGHT
:
hid_map_usage
(
hi
,
usage
,
bit
,
max
,
EV_ABS
,
ABS_MT_TOUCH_MINOR
);
input_set_abs_params
(
hi
->
input
,
ABS_MT_ORIENTATION
,
0
,
1
,
0
,
0
);
return
1
;
}
return
0
;
case
0xff000000
:
/* we do not want to map these: no input-oriented meaning */
return
-
1
;
}
}
return
0
;
return
0
;
}
}
...
@@ -51,6 +110,138 @@ static int ntrig_input_mapped(struct hid_device *hdev, struct hid_input *hi,
...
@@ -51,6 +110,138 @@ static int ntrig_input_mapped(struct hid_device *hdev, struct hid_input *hi,
return
0
;
return
0
;
}
}
/*
* this function is called upon all reports
* so that we can filter contact point information,
* decide whether we are in multi or single touch mode
* and call input_mt_sync after each point if necessary
*/
static
int
ntrig_event
(
struct
hid_device
*
hid
,
struct
hid_field
*
field
,
struct
hid_usage
*
usage
,
__s32
value
)
{
struct
input_dev
*
input
=
field
->
hidinput
->
input
;
struct
ntrig_data
*
nd
=
hid_get_drvdata
(
hid
);
if
(
hid
->
claimed
&
HID_CLAIMED_INPUT
)
{
switch
(
usage
->
hid
)
{
case
HID_GD_X
:
nd
->
x
=
value
;
nd
->
reading_a_point
=
1
;
break
;
case
HID_GD_Y
:
nd
->
y
=
value
;
break
;
case
HID_DG_CONTACTID
:
nd
->
id
=
value
;
/* we receive this only when in multitouch mode */
nd
->
found_contact_id
=
1
;
break
;
case
HID_DG_WIDTH
:
nd
->
w
=
value
;
break
;
case
HID_DG_HEIGHT
:
nd
->
h
=
value
;
/*
* when in single touch mode, this is the last
* report received in a finger event. We want
* to emit a normal (X, Y) position
*/
if
(
!
nd
->
found_contact_id
)
{
input_event
(
input
,
EV_ABS
,
ABS_X
,
nd
->
x
);
input_event
(
input
,
EV_ABS
,
ABS_Y
,
nd
->
y
);
}
break
;
case
HID_DG_TIPPRESSURE
:
/*
* when in single touch mode, this is the last
* report received in a pen event. We want
* to emit a normal (X, Y) position
*/
if
(
!
nd
->
found_contact_id
)
{
input_event
(
input
,
EV_ABS
,
ABS_X
,
nd
->
x
);
input_event
(
input
,
EV_ABS
,
ABS_Y
,
nd
->
y
);
input_event
(
input
,
EV_ABS
,
ABS_PRESSURE
,
value
);
}
break
;
case
0xff000002
:
/*
* we receive this when the device is in multitouch
* mode. The first of the three values tagged with
* this usage tells if the contact point is real
* or a placeholder
*/
if
(
!
nd
->
reading_a_point
||
value
!=
1
)
break
;
/* emit a normal (X, Y) for the first point only */
if
(
nd
->
id
==
0
)
{
input_event
(
input
,
EV_ABS
,
ABS_X
,
nd
->
x
);
input_event
(
input
,
EV_ABS
,
ABS_Y
,
nd
->
y
);
}
input_event
(
input
,
EV_ABS
,
ABS_MT_POSITION_X
,
nd
->
x
);
input_event
(
input
,
EV_ABS
,
ABS_MT_POSITION_Y
,
nd
->
y
);
if
(
nd
->
w
>
nd
->
h
)
{
input_event
(
input
,
EV_ABS
,
ABS_MT_ORIENTATION
,
1
);
input_event
(
input
,
EV_ABS
,
ABS_MT_TOUCH_MAJOR
,
nd
->
w
);
input_event
(
input
,
EV_ABS
,
ABS_MT_TOUCH_MINOR
,
nd
->
h
);
}
else
{
input_event
(
input
,
EV_ABS
,
ABS_MT_ORIENTATION
,
0
);
input_event
(
input
,
EV_ABS
,
ABS_MT_TOUCH_MAJOR
,
nd
->
h
);
input_event
(
input
,
EV_ABS
,
ABS_MT_TOUCH_MINOR
,
nd
->
w
);
}
input_mt_sync
(
field
->
hidinput
->
input
);
nd
->
reading_a_point
=
0
;
nd
->
found_contact_id
=
0
;
break
;
default:
/* fallback to the generic hidinput handling */
return
0
;
}
}
/* we have handled the hidinput part, now remains hiddev */
if
(
hid
->
claimed
&
HID_CLAIMED_HIDDEV
&&
hid
->
hiddev_hid_event
)
hid
->
hiddev_hid_event
(
hid
,
field
,
usage
,
value
);
return
1
;
}
static
int
ntrig_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
{
int
ret
;
struct
ntrig_data
*
nd
;
nd
=
kmalloc
(
sizeof
(
struct
ntrig_data
),
GFP_KERNEL
);
if
(
!
nd
)
{
dev_err
(
&
hdev
->
dev
,
"cannot allocate N-Trig data
\n
"
);
return
-
ENOMEM
;
}
nd
->
reading_a_point
=
0
;
nd
->
found_contact_id
=
0
;
hid_set_drvdata
(
hdev
,
nd
);
ret
=
hid_parse
(
hdev
);
if
(
!
ret
)
ret
=
hid_hw_start
(
hdev
,
HID_CONNECT_DEFAULT
);
if
(
ret
)
kfree
(
nd
);
return
ret
;
}
static
void
ntrig_remove
(
struct
hid_device
*
hdev
)
{
hid_hw_stop
(
hdev
);
kfree
(
hid_get_drvdata
(
hdev
));
}
static
const
struct
hid_device_id
ntrig_devices
[]
=
{
static
const
struct
hid_device_id
ntrig_devices
[]
=
{
{
HID_USB_DEVICE
(
USB_VENDOR_ID_NTRIG
,
USB_DEVICE_ID_NTRIG_TOUCH_SCREEN
),
{
HID_USB_DEVICE
(
USB_VENDOR_ID_NTRIG
,
USB_DEVICE_ID_NTRIG_TOUCH_SCREEN
),
.
driver_data
=
NTRIG_DUPLICATE_USAGES
},
.
driver_data
=
NTRIG_DUPLICATE_USAGES
},
...
@@ -58,11 +249,20 @@ static const struct hid_device_id ntrig_devices[] = {
...
@@ -58,11 +249,20 @@ static const struct hid_device_id ntrig_devices[] = {
};
};
MODULE_DEVICE_TABLE
(
hid
,
ntrig_devices
);
MODULE_DEVICE_TABLE
(
hid
,
ntrig_devices
);
static
const
struct
hid_usage_id
ntrig_grabbed_usages
[]
=
{
{
HID_ANY_ID
,
HID_ANY_ID
,
HID_ANY_ID
},
{
HID_ANY_ID
-
1
,
HID_ANY_ID
-
1
,
HID_ANY_ID
-
1
}
};
static
struct
hid_driver
ntrig_driver
=
{
static
struct
hid_driver
ntrig_driver
=
{
.
name
=
"ntrig"
,
.
name
=
"ntrig"
,
.
id_table
=
ntrig_devices
,
.
id_table
=
ntrig_devices
,
.
probe
=
ntrig_probe
,
.
remove
=
ntrig_remove
,
.
input_mapping
=
ntrig_input_mapping
,
.
input_mapping
=
ntrig_input_mapping
,
.
input_mapped
=
ntrig_input_mapped
,
.
input_mapped
=
ntrig_input_mapped
,
.
usage_table
=
ntrig_grabbed_usages
,
.
event
=
ntrig_event
,
};
};
static
int
ntrig_init
(
void
)
static
int
ntrig_init
(
void
)
...
...
drivers/hid/hid-sjoy.c
0 → 100644
浏览文件 @
6341de05
/*
* Force feedback support for SmartJoy PLUS PS2->USB adapter
*
* Copyright (c) 2009 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
*
* Based of hid-pl.c and hid-gaff.c
* Copyright (c) 2007, 2009 Anssi Hannula <anssi.hannula@gmail.com>
* Copyright (c) 2008 Lukasz Lubojanski <lukasz@lubojanski.info>
*/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* #define DEBUG */
#include <linux/input.h>
#include <linux/usb.h>
#include <linux/hid.h>
#include "hid-ids.h"
#ifdef CONFIG_SMARTJOYPLUS_FF
#include "usbhid/usbhid.h"
struct
sjoyff_device
{
struct
hid_report
*
report
;
};
static
int
hid_sjoyff_play
(
struct
input_dev
*
dev
,
void
*
data
,
struct
ff_effect
*
effect
)
{
struct
hid_device
*
hid
=
input_get_drvdata
(
dev
);
struct
sjoyff_device
*
sjoyff
=
data
;
u32
left
,
right
;
left
=
effect
->
u
.
rumble
.
strong_magnitude
;
right
=
effect
->
u
.
rumble
.
weak_magnitude
;
dev_dbg
(
&
dev
->
dev
,
"called with 0x%08x 0x%08x
\n
"
,
left
,
right
);
left
=
left
*
0xff
/
0xffff
;
right
=
(
right
!=
0
);
/* on/off only */
sjoyff
->
report
->
field
[
0
]
->
value
[
1
]
=
right
;
sjoyff
->
report
->
field
[
0
]
->
value
[
2
]
=
left
;
dev_dbg
(
&
dev
->
dev
,
"running with 0x%02x 0x%02x
\n
"
,
left
,
right
);
usbhid_submit_report
(
hid
,
sjoyff
->
report
,
USB_DIR_OUT
);
return
0
;
}
static
int
sjoyff_init
(
struct
hid_device
*
hid
)
{
struct
sjoyff_device
*
sjoyff
;
struct
hid_report
*
report
;
struct
hid_input
*
hidinput
=
list_entry
(
hid
->
inputs
.
next
,
struct
hid_input
,
list
);
struct
list_head
*
report_list
=
&
hid
->
report_enum
[
HID_OUTPUT_REPORT
].
report_list
;
struct
list_head
*
report_ptr
=
report_list
;
struct
input_dev
*
dev
;
int
error
;
if
(
list_empty
(
report_list
))
{
dev_err
(
&
hid
->
dev
,
"no output reports found
\n
"
);
return
-
ENODEV
;
}
report_ptr
=
report_ptr
->
next
;
if
(
report_ptr
==
report_list
)
{
dev_err
(
&
hid
->
dev
,
"required output report is "
"missing
\n
"
);
return
-
ENODEV
;
}
report
=
list_entry
(
report_ptr
,
struct
hid_report
,
list
);
if
(
report
->
maxfield
<
1
)
{
dev_err
(
&
hid
->
dev
,
"no fields in the report
\n
"
);
return
-
ENODEV
;
}
if
(
report
->
field
[
0
]
->
report_count
<
3
)
{
dev_err
(
&
hid
->
dev
,
"not enough values in the field
\n
"
);
return
-
ENODEV
;
}
sjoyff
=
kzalloc
(
sizeof
(
struct
sjoyff_device
),
GFP_KERNEL
);
if
(
!
sjoyff
)
return
-
ENOMEM
;
dev
=
hidinput
->
input
;
set_bit
(
FF_RUMBLE
,
dev
->
ffbit
);
error
=
input_ff_create_memless
(
dev
,
sjoyff
,
hid_sjoyff_play
);
if
(
error
)
{
kfree
(
sjoyff
);
return
error
;
}
sjoyff
->
report
=
report
;
sjoyff
->
report
->
field
[
0
]
->
value
[
0
]
=
0x01
;
sjoyff
->
report
->
field
[
0
]
->
value
[
1
]
=
0x00
;
sjoyff
->
report
->
field
[
0
]
->
value
[
2
]
=
0x00
;
usbhid_submit_report
(
hid
,
sjoyff
->
report
,
USB_DIR_OUT
);
dev_info
(
&
hid
->
dev
,
"Force feedback for SmartJoy PLUS PS2/USB adapter
\n
"
);
return
0
;
}
#else
static
inline
int
sjoyff_init
(
struct
hid_device
*
hid
)
{
return
0
;
}
#endif
static
int
sjoy_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
{
int
ret
;
ret
=
hid_parse
(
hdev
);
if
(
ret
)
{
dev_err
(
&
hdev
->
dev
,
"parse failed
\n
"
);
goto
err
;
}
ret
=
hid_hw_start
(
hdev
,
HID_CONNECT_DEFAULT
&
~
HID_CONNECT_FF
);
if
(
ret
)
{
dev_err
(
&
hdev
->
dev
,
"hw start failed
\n
"
);
goto
err
;
}
sjoyff_init
(
hdev
);
return
0
;
err:
return
ret
;
}
static
const
struct
hid_device_id
sjoy_devices
[]
=
{
{
HID_USB_DEVICE
(
USB_VENDOR_ID_WISEGROUP
,
USB_DEVICE_ID_SMARTJOY_PLUS
)
},
{
}
};
MODULE_DEVICE_TABLE
(
hid
,
sjoy_devices
);
static
struct
hid_driver
sjoy_driver
=
{
.
name
=
"smartjoyplus"
,
.
id_table
=
sjoy_devices
,
.
probe
=
sjoy_probe
,
};
static
int
sjoy_init
(
void
)
{
return
hid_register_driver
(
&
sjoy_driver
);
}
static
void
sjoy_exit
(
void
)
{
hid_unregister_driver
(
&
sjoy_driver
);
}
module_init
(
sjoy_init
);
module_exit
(
sjoy_exit
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Jussi Kivilinna"
);
drivers/hid/hid-tmff.c
浏览文件 @
6341de05
...
@@ -33,11 +33,6 @@
...
@@ -33,11 +33,6 @@
#include "hid-ids.h"
#include "hid-ids.h"
#include "usbhid/usbhid.h"
/* Usages for thrustmaster devices I know about */
#define THRUSTMASTER_USAGE_FF (HID_UP_GENDESK | 0xbb)
static
const
signed
short
ff_rumble
[]
=
{
static
const
signed
short
ff_rumble
[]
=
{
FF_RUMBLE
,
FF_RUMBLE
,
-
1
-
1
...
@@ -48,6 +43,12 @@ static const signed short ff_joystick[] = {
...
@@ -48,6 +43,12 @@ static const signed short ff_joystick[] = {
-
1
-
1
};
};
#ifdef CONFIG_THRUSTMASTER_FF
#include "usbhid/usbhid.h"
/* Usages for thrustmaster devices I know about */
#define THRUSTMASTER_USAGE_FF (HID_UP_GENDESK | 0xbb)
struct
tmff_device
{
struct
tmff_device
{
struct
hid_report
*
report
;
struct
hid_report
*
report
;
struct
hid_field
*
ff_field
;
struct
hid_field
*
ff_field
;
...
@@ -209,6 +210,12 @@ static int tmff_init(struct hid_device *hid, const signed short *ff_bits)
...
@@ -209,6 +210,12 @@ static int tmff_init(struct hid_device *hid, const signed short *ff_bits)
kfree
(
tmff
);
kfree
(
tmff
);
return
error
;
return
error
;
}
}
#else
static
inline
int
tmff_init
(
struct
hid_device
*
hid
,
const
signed
short
*
ff_bits
)
{
return
0
;
}
#endif
static
int
tm_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
static
int
tm_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
{
{
...
...
drivers/hid/hid-wacom.c
0 → 100644
浏览文件 @
6341de05
/*
* Bluetooth Wacom Tablet support
*
* Copyright (c) 1999 Andreas Gal
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
* Copyright (c) 2006-2007 Jiri Kosina
* Copyright (c) 2007 Paul Walmsley
* Copyright (c) 2008 Jiri Slaby <jirislaby@gmail.com>
* Copyright (c) 2006 Andrew Zabolotny <zap@homelink.ru>
* Copyright (c) 2009 Bastien Nocera <hadess@hadess.net>
*/
/*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*/
#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>
#include "hid-ids.h"
struct
wacom_data
{
__u16
tool
;
unsigned
char
butstate
;
};
static
int
wacom_raw_event
(
struct
hid_device
*
hdev
,
struct
hid_report
*
report
,
u8
*
raw_data
,
int
size
)
{
struct
wacom_data
*
wdata
=
hid_get_drvdata
(
hdev
);
struct
hid_input
*
hidinput
;
struct
input_dev
*
input
;
unsigned
char
*
data
=
(
unsigned
char
*
)
raw_data
;
int
tool
,
x
,
y
,
rw
;
if
(
!
(
hdev
->
claimed
&
HID_CLAIMED_INPUT
))
return
0
;
tool
=
0
;
hidinput
=
list_entry
(
hdev
->
inputs
.
next
,
struct
hid_input
,
list
);
input
=
hidinput
->
input
;
/* Check if this is a tablet report */
if
(
data
[
0
]
!=
0x03
)
return
0
;
/* Get X & Y positions */
x
=
le16_to_cpu
(
*
(
__le16
*
)
&
data
[
2
]);
y
=
le16_to_cpu
(
*
(
__le16
*
)
&
data
[
4
]);
/* Get current tool identifier */
if
(
data
[
1
]
&
0x90
)
{
/* If pen is in the in/active area */
switch
((
data
[
1
]
>>
5
)
&
3
)
{
case
0
:
/* Pen */
tool
=
BTN_TOOL_PEN
;
break
;
case
1
:
/* Rubber */
tool
=
BTN_TOOL_RUBBER
;
break
;
case
2
:
/* Mouse with wheel */
case
3
:
/* Mouse without wheel */
tool
=
BTN_TOOL_MOUSE
;
break
;
}
/* Reset tool if out of active tablet area */
if
(
!
(
data
[
1
]
&
0x10
))
tool
=
0
;
}
/* If tool changed, notify input subsystem */
if
(
wdata
->
tool
!=
tool
)
{
if
(
wdata
->
tool
)
{
/* Completely reset old tool state */
if
(
wdata
->
tool
==
BTN_TOOL_MOUSE
)
{
input_report_key
(
input
,
BTN_LEFT
,
0
);
input_report_key
(
input
,
BTN_RIGHT
,
0
);
input_report_key
(
input
,
BTN_MIDDLE
,
0
);
input_report_abs
(
input
,
ABS_DISTANCE
,
input
->
absmax
[
ABS_DISTANCE
]);
}
else
{
input_report_key
(
input
,
BTN_TOUCH
,
0
);
input_report_key
(
input
,
BTN_STYLUS
,
0
);
input_report_key
(
input
,
BTN_STYLUS2
,
0
);
input_report_abs
(
input
,
ABS_PRESSURE
,
0
);
}
input_report_key
(
input
,
wdata
->
tool
,
0
);
input_sync
(
input
);
}
wdata
->
tool
=
tool
;
if
(
tool
)
input_report_key
(
input
,
tool
,
1
);
}
if
(
tool
)
{
input_report_abs
(
input
,
ABS_X
,
x
);
input_report_abs
(
input
,
ABS_Y
,
y
);
switch
((
data
[
1
]
>>
5
)
&
3
)
{
case
2
:
/* Mouse with wheel */
input_report_key
(
input
,
BTN_MIDDLE
,
data
[
1
]
&
0x04
);
rw
=
(
data
[
6
]
&
0x01
)
?
-
1
:
(
data
[
6
]
&
0x02
)
?
1
:
0
;
input_report_rel
(
input
,
REL_WHEEL
,
rw
);
/* fall through */
case
3
:
/* Mouse without wheel */
input_report_key
(
input
,
BTN_LEFT
,
data
[
1
]
&
0x01
);
input_report_key
(
input
,
BTN_RIGHT
,
data
[
1
]
&
0x02
);
/* Compute distance between mouse and tablet */
rw
=
44
-
(
data
[
6
]
>>
2
);
if
(
rw
<
0
)
rw
=
0
;
else
if
(
rw
>
31
)
rw
=
31
;
input_report_abs
(
input
,
ABS_DISTANCE
,
rw
);
break
;
default:
input_report_abs
(
input
,
ABS_PRESSURE
,
data
[
6
]
|
(((
__u16
)
(
data
[
1
]
&
0x08
))
<<
5
));
input_report_key
(
input
,
BTN_TOUCH
,
data
[
1
]
&
0x01
);
input_report_key
(
input
,
BTN_STYLUS
,
data
[
1
]
&
0x02
);
input_report_key
(
input
,
BTN_STYLUS2
,
(
tool
==
BTN_TOOL_PEN
)
&&
data
[
1
]
&
0x04
);
break
;
}
input_sync
(
input
);
}
/* Report the state of the two buttons at the top of the tablet
* as two extra fingerpad keys (buttons 4 & 5). */
rw
=
data
[
7
]
&
0x03
;
if
(
rw
!=
wdata
->
butstate
)
{
wdata
->
butstate
=
rw
;
input_report_key
(
input
,
BTN_0
,
rw
&
0x02
);
input_report_key
(
input
,
BTN_1
,
rw
&
0x01
);
input_event
(
input
,
EV_MSC
,
MSC_SERIAL
,
0xf0
);
input_sync
(
input
);
}
return
1
;
}
static
int
wacom_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
{
struct
hid_input
*
hidinput
;
struct
input_dev
*
input
;
struct
wacom_data
*
wdata
;
int
ret
;
wdata
=
kzalloc
(
sizeof
(
*
wdata
),
GFP_KERNEL
);
if
(
wdata
==
NULL
)
{
dev_err
(
&
hdev
->
dev
,
"can't alloc wacom descriptor
\n
"
);
return
-
ENOMEM
;
}
hid_set_drvdata
(
hdev
,
wdata
);
ret
=
hid_parse
(
hdev
);
if
(
ret
)
{
dev_err
(
&
hdev
->
dev
,
"parse failed
\n
"
);
goto
err_free
;
}
ret
=
hid_hw_start
(
hdev
,
HID_CONNECT_DEFAULT
);
if
(
ret
)
{
dev_err
(
&
hdev
->
dev
,
"hw start failed
\n
"
);
goto
err_free
;
}
hidinput
=
list_entry
(
hdev
->
inputs
.
next
,
struct
hid_input
,
list
);
input
=
hidinput
->
input
;
/* Basics */
input
->
evbit
[
0
]
|=
BIT
(
EV_KEY
)
|
BIT
(
EV_ABS
)
|
BIT
(
EV_REL
);
input
->
absbit
[
0
]
|=
BIT
(
ABS_X
)
|
BIT
(
ABS_Y
)
|
BIT
(
ABS_PRESSURE
)
|
BIT
(
ABS_DISTANCE
);
input
->
relbit
[
0
]
|=
BIT
(
REL_WHEEL
);
set_bit
(
BTN_TOOL_PEN
,
input
->
keybit
);
set_bit
(
BTN_TOUCH
,
input
->
keybit
);
set_bit
(
BTN_STYLUS
,
input
->
keybit
);
set_bit
(
BTN_STYLUS2
,
input
->
keybit
);
set_bit
(
BTN_LEFT
,
input
->
keybit
);
set_bit
(
BTN_RIGHT
,
input
->
keybit
);
set_bit
(
BTN_MIDDLE
,
input
->
keybit
);
/* Pad */
input
->
evbit
[
0
]
|=
BIT
(
EV_MSC
);
input
->
mscbit
[
0
]
|=
BIT
(
MSC_SERIAL
);
/* Distance, rubber and mouse */
input
->
absbit
[
0
]
|=
BIT
(
ABS_DISTANCE
);
set_bit
(
BTN_TOOL_RUBBER
,
input
->
keybit
);
set_bit
(
BTN_TOOL_MOUSE
,
input
->
keybit
);
input
->
absmax
[
ABS_PRESSURE
]
=
511
;
input
->
absmax
[
ABS_DISTANCE
]
=
32
;
input
->
absmax
[
ABS_X
]
=
16704
;
input
->
absmax
[
ABS_Y
]
=
12064
;
input
->
absfuzz
[
ABS_X
]
=
4
;
input
->
absfuzz
[
ABS_Y
]
=
4
;
return
0
;
err_free:
kfree
(
wdata
);
return
ret
;
}
static
void
wacom_remove
(
struct
hid_device
*
hdev
)
{
hid_hw_stop
(
hdev
);
kfree
(
hid_get_drvdata
(
hdev
));
}
static
const
struct
hid_device_id
wacom_devices
[]
=
{
{
HID_BLUETOOTH_DEVICE
(
USB_VENDOR_ID_WACOM
,
USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH
)
},
{
}
};
MODULE_DEVICE_TABLE
(
hid
,
wacom_devices
);
static
struct
hid_driver
wacom_driver
=
{
.
name
=
"wacom"
,
.
id_table
=
wacom_devices
,
.
probe
=
wacom_probe
,
.
remove
=
wacom_remove
,
.
raw_event
=
wacom_raw_event
,
};
static
int
wacom_init
(
void
)
{
int
ret
;
ret
=
hid_register_driver
(
&
wacom_driver
);
if
(
ret
)
printk
(
KERN_ERR
"can't register wacom driver
\n
"
);
printk
(
KERN_ERR
"wacom driver registered
\n
"
);
return
ret
;
}
static
void
wacom_exit
(
void
)
{
hid_unregister_driver
(
&
wacom_driver
);
}
module_init
(
wacom_init
);
module_exit
(
wacom_exit
);
MODULE_LICENSE
(
"GPL"
);
drivers/hid/hid-zpff.c
浏览文件 @
6341de05
...
@@ -27,6 +27,7 @@
...
@@ -27,6 +27,7 @@
#include "hid-ids.h"
#include "hid-ids.h"
#ifdef CONFIG_ZEROPLUS_FF
#include "usbhid/usbhid.h"
#include "usbhid/usbhid.h"
struct
zpff_device
{
struct
zpff_device
{
...
@@ -108,6 +109,12 @@ static int zpff_init(struct hid_device *hid)
...
@@ -108,6 +109,12 @@ static int zpff_init(struct hid_device *hid)
return
0
;
return
0
;
}
}
#else
static
inline
int
zpff_init
(
struct
hid_device
*
hid
)
{
return
0
;
}
#endif
static
int
zp_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
static
int
zp_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
{
{
...
...
drivers/hid/hidraw.c
浏览文件 @
6341de05
...
@@ -349,10 +349,7 @@ int hidraw_connect(struct hid_device *hid)
...
@@ -349,10 +349,7 @@ int hidraw_connect(struct hid_device *hid)
int
minor
,
result
;
int
minor
,
result
;
struct
hidraw
*
dev
;
struct
hidraw
*
dev
;
/* TODO currently we accept any HID device. This should later
/* we accept any HID device, no matter the applications */
* probably be fixed to accept only those devices which provide
* non-input applications
*/
dev
=
kzalloc
(
sizeof
(
struct
hidraw
),
GFP_KERNEL
);
dev
=
kzalloc
(
sizeof
(
struct
hidraw
),
GFP_KERNEL
);
if
(
!
dev
)
if
(
!
dev
)
...
...
drivers/hid/usbhid/hid-core.c
浏览文件 @
6341de05
...
@@ -1234,12 +1234,11 @@ static int hid_post_reset(struct usb_interface *intf)
...
@@ -1234,12 +1234,11 @@ static int hid_post_reset(struct usb_interface *intf)
struct
hid_device
*
hid
=
usb_get_intfdata
(
intf
);
struct
hid_device
*
hid
=
usb_get_intfdata
(
intf
);
struct
usbhid_device
*
usbhid
=
hid
->
driver_data
;
struct
usbhid_device
*
usbhid
=
hid
->
driver_data
;
int
status
;
int
status
;
spin_lock_irq
(
&
usbhid
->
lock
);
spin_lock_irq
(
&
usbhid
->
lock
);
clear_bit
(
HID_RESET_PENDING
,
&
usbhid
->
iofl
);
clear_bit
(
HID_RESET_PENDING
,
&
usbhid
->
iofl
);
spin_unlock_irq
(
&
usbhid
->
lock
);
spin_unlock_irq
(
&
usbhid
->
lock
);
hid_set_idle
(
dev
,
intf
->
cur_altsetting
->
desc
.
bInterfaceNumber
,
0
,
0
);
hid_set_idle
(
dev
,
intf
->
cur_altsetting
->
desc
.
bInterfaceNumber
,
0
,
0
);
/* FIXME: Any more reinitialization needed? */
status
=
hid_start_in
(
hid
);
status
=
hid_start_in
(
hid
);
if
(
status
<
0
)
if
(
status
<
0
)
hid_io_error
(
hid
);
hid_io_error
(
hid
);
...
@@ -1251,14 +1250,14 @@ static int hid_post_reset(struct usb_interface *intf)
...
@@ -1251,14 +1250,14 @@ static int hid_post_reset(struct usb_interface *intf)
int
usbhid_get_power
(
struct
hid_device
*
hid
)
int
usbhid_get_power
(
struct
hid_device
*
hid
)
{
{
struct
usbhid_device
*
usbhid
=
hid
->
driver_data
;
struct
usbhid_device
*
usbhid
=
hid
->
driver_data
;
return
usb_autopm_get_interface
(
usbhid
->
intf
);
return
usb_autopm_get_interface
(
usbhid
->
intf
);
}
}
void
usbhid_put_power
(
struct
hid_device
*
hid
)
void
usbhid_put_power
(
struct
hid_device
*
hid
)
{
{
struct
usbhid_device
*
usbhid
=
hid
->
driver_data
;
struct
usbhid_device
*
usbhid
=
hid
->
driver_data
;
usb_autopm_put_interface
(
usbhid
->
intf
);
usb_autopm_put_interface
(
usbhid
->
intf
);
}
}
...
...
include/linux/hid.h
浏览文件 @
6341de05
...
@@ -238,6 +238,42 @@ struct hid_item {
...
@@ -238,6 +238,42 @@ struct hid_item {
#define HID_GD_RIGHT 0x00010092
#define HID_GD_RIGHT 0x00010092
#define HID_GD_LEFT 0x00010093
#define HID_GD_LEFT 0x00010093
#define HID_DG_DIGITIZER 0x000d0001
#define HID_DG_PEN 0x000d0002
#define HID_DG_LIGHTPEN 0x000d0003
#define HID_DG_TOUCHSCREEN 0x000d0004
#define HID_DG_TOUCHPAD 0x000d0005
#define HID_DG_STYLUS 0x000d0020
#define HID_DG_PUCK 0x000d0021
#define HID_DG_FINGER 0x000d0022
#define HID_DG_TIPPRESSURE 0x000d0030
#define HID_DG_BARRELPRESSURE 0x000d0031
#define HID_DG_INRANGE 0x000d0032
#define HID_DG_TOUCH 0x000d0033
#define HID_DG_UNTOUCH 0x000d0034
#define HID_DG_TAP 0x000d0035
#define HID_DG_TABLETFUNCTIONKEY 0x000d0039
#define HID_DG_PROGRAMCHANGEKEY 0x000d003a
#define HID_DG_INVERT 0x000d003c
#define HID_DG_TIPSWITCH 0x000d0042
#define HID_DG_TIPSWITCH2 0x000d0043
#define HID_DG_BARRELSWITCH 0x000d0044
#define HID_DG_ERASER 0x000d0045
#define HID_DG_TABLETPICK 0x000d0046
/*
* as of May 20, 2009 the usages below are not yet in the official USB spec
* but are being pushed by Microsft as described in their paper "Digitizer
* Drivers for Windows Touch and Pen-Based Computers"
*/
#define HID_DG_CONFIDENCE 0x000d0047
#define HID_DG_WIDTH 0x000d0048
#define HID_DG_HEIGHT 0x000d0049
#define HID_DG_CONTACTID 0x000d0051
#define HID_DG_INPUTMODE 0x000d0052
#define HID_DG_DEVICEINDEX 0x000d0053
#define HID_DG_CONTACTCOUNT 0x000d0054
#define HID_DG_CONTACTMAX 0x000d0055
/*
/*
* HID report types --- Ouch! HID spec says 1 2 3!
* HID report types --- Ouch! HID spec says 1 2 3!
*/
*/
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录