Skip to content

Commit

Permalink
HID: roccat: fix special button support
Browse files Browse the repository at this point in the history
Added new data and changed workaround for abnormal button behaviour
according to new gained knowledge about Roccat Kone device.

Signed-off-by: Stefan Achatz <erazor_de@users.sourceforge.net>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
  • Loading branch information
Stefan Achatz authored and Jiri Kosina committed May 19, 2010
1 parent 00237bc commit 73b3577
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 8 deletions.
11 changes: 6 additions & 5 deletions drivers/hid/hid-roccat-kone.c
Original file line number Diff line number Diff line change
Expand Up @@ -928,14 +928,15 @@ static int kone_raw_event(struct hid_device *hdev, struct hid_report *report,
return 0;

/*
* Firmware 1.38 introduced new behaviour for tilt buttons.
* Pressed tilt button is reported in each movement event.
* Firmware 1.38 introduced new behaviour for tilt and special buttons.
* Pressed button is reported in each movement event.
* Workaround sends only one event per press.
*/
if (kone->last_tilt_state == event->tilt)
event->tilt = 0;
if (memcmp(&kone->last_mouse_event.tilt, &event->tilt, 5))
memcpy(&kone->last_mouse_event, event,
sizeof(struct kone_mouse_event));
else
kone->last_tilt_state = event->tilt;
memset(&event->tilt, 0, 5);

/*
* handle special events and keep actual profile and dpi values
Expand Down
19 changes: 16 additions & 3 deletions drivers/hid/hid-roccat-kone.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,17 @@ enum kone_button_info_types {
kone_button_info_type_multimedia_volume_down = 0x27
};

enum kone_button_info_numbers {
kone_button_top = 1,
kone_button_wheel_tilt_left = 2,
kone_button_wheel_tilt_right = 3,
kone_button_forward = 4,
kone_button_backward = 5,
kone_button_middle = 6,
kone_button_plus = 7,
kone_button_minus = 8,
};

struct kone_light_info {
uint8_t number; /* number of light 1-5 */
uint8_t mod; /* 1 = on, 2 = off */
Expand Down Expand Up @@ -120,6 +131,7 @@ struct kone_profile {
uint8_t light_effect_speed; /* range 0-255 */

struct kone_light_info light_infos[5];
/* offset is kone_button_info_numbers - 1 */
struct kone_button_info button_infos[8];

uint16_t checksum; /* \brief holds checksum of struct */
Expand Down Expand Up @@ -165,7 +177,7 @@ enum kone_mouse_events {
/* TODO clarify meaning and occurence of kone_mouse_event_calibration */
kone_mouse_event_calibration = 0xc0,
kone_mouse_event_call_overlong_macro = 0xe0,
/* switch events notify if user changed values wiht mousebutton click */
/* switch events notify if user changed values with mousebutton click */
kone_mouse_event_switch_dpi = 0xf0,
kone_mouse_event_switch_profile = 0xf1
};
Expand All @@ -188,8 +200,9 @@ struct kone_device {
* is no way of getting this information from the device on demand
*/
int actual_profile, actual_dpi;
/* Used for neutralizing abnormal tilt button behaviour */
int last_tilt_state;
/* Used for neutralizing abnormal button behaviour */
struct kone_mouse_event last_mouse_event;

/*
* It's unlikely that multiple sysfs attributes are accessed at a time,
* so only one mutex is used to secure hardware access and profiles and
Expand Down

0 comments on commit 73b3577

Please sign in to comment.