aboutsummaryrefslogtreecommitdiff
path: root/hid-tmt300rs.c
diff options
context:
space:
mode:
Diffstat (limited to 'hid-tmt300rs.c')
-rw-r--r--hid-tmt300rs.c681
1 files changed, 244 insertions, 437 deletions
diff --git a/hid-tmt300rs.c b/hid-tmt300rs.c
index 7fbe829..fa2656c 100644
--- a/hid-tmt300rs.c
+++ b/hid-tmt300rs.c
@@ -1,13 +1,5 @@
#include "hid-tmt300rs.h"
-static void t300rs_int_callback(struct urb *urb){
- if(urb->status){
- hid_warn(urb->dev, "urb status %i received\n", urb->status);
- }
-
- usb_free_urb(urb);
-}
-
static struct t300rs_device_entry *t300rs_get_device(struct hid_device *hdev){
struct t300rs_data *drv_data;
struct t300rs_device_entry *t300rs;
@@ -31,42 +23,31 @@ static struct t300rs_device_entry *t300rs_get_device(struct hid_device *hdev){
static int t300rs_send_int(struct input_dev *dev, u8 *send_buffer, int *trans){
struct hid_device *hdev = input_get_drvdata(dev);
struct t300rs_device_entry *t300rs;
- struct usb_device *usbdev;
- struct usb_interface *usbif;
- struct usb_host_endpoint *ep;
- struct urb *urb = usb_alloc_urb(0, GFP_ATOMIC);
-
+ int i;
+
t300rs = t300rs_get_device(hdev);
if(!t300rs){
hid_err(hdev, "could not get device\n");
+ return -1;
}
- usbdev = t300rs->usbdev;
- usbif = t300rs->usbif;
- ep = &usbif->cur_altsetting->endpoint[1];
+ for(i = 0; i < T300RS_BUFFER_LENGTH; ++i){
+ t300rs->ff_field->value[i] = send_buffer[i];
+ }
- usb_fill_int_urb(
- urb,
- usbdev,
- usb_sndintpipe(usbdev, 1),
- send_buffer,
- T300RS_BUFFER_LENGTH,
- t300rs_int_callback,
- hdev,
- ep->desc.bInterval
- );
+ hid_hw_request(t300rs->hdev, t300rs->report, HID_REQ_SET_REPORT);
- return usb_submit_urb(urb, GFP_ATOMIC);
+ return 0;
}
static int t300rs_play_effect(struct t300rs_device_entry *t300rs, struct t300rs_effect_state *state){
u8 *send_buffer = kzalloc(T300RS_BUFFER_LENGTH, GFP_ATOMIC);
int ret, trans;
- send_buffer[0] = 0x60;
- send_buffer[2] = state->effect.id + 1;
- send_buffer[3] = 0x89;
- send_buffer[4] = 0x01;
+
+ send_buffer[1] = state->effect.id + 1;
+ send_buffer[2] = 0x89;
+ send_buffer[3] = 0x01;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -81,9 +62,9 @@ static int t300rs_stop_effect(struct t300rs_device_entry *t300rs, struct t300rs_
u8 *send_buffer = kzalloc(T300RS_BUFFER_LENGTH, GFP_ATOMIC);
int ret, trans;
- send_buffer[0] = 0x60;
- send_buffer[2] = state->effect.id + 1;
- send_buffer[3] = 0x89;
+
+ send_buffer[1] = state->effect.id + 1;
+ send_buffer[2] = 0x89;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -95,25 +76,19 @@ static int t300rs_stop_effect(struct t300rs_device_entry *t300rs, struct t300rs_
}
static void t300rs_fill_envelope(u8 *send_buffer, int i, s16 level, u16 duration, struct ff_envelope *envelope){
- u16 le_attack_level, le_attack_length, le_fade_level, le_fade_length;
u16 attack_length = (duration * envelope->attack_length) / 0x7fff;
u16 attack_level = (level * envelope->attack_level) / 0x7fff;
u16 fade_length = (duration * envelope->fade_length) / 0x7fff;
u16 fade_level = (level * envelope->fade_level) / 0x7fff;
- le_attack_length = cpu_to_le16(attack_length);
- le_attack_level = cpu_to_le16(attack_level);
- le_fade_length = cpu_to_le16(fade_length);
- le_fade_level = cpu_to_le16(fade_level);
-
- send_buffer[i ] = le_attack_length & 0xff;
- send_buffer[i + 1] = le_attack_length >> 8;
- send_buffer[i + 2] = le_attack_level & 0xff;
- send_buffer[i + 3] = le_attack_level >> 8;
- send_buffer[i + 4] = le_fade_length & 0xff;
- send_buffer[i + 5] = le_fade_length >> 8;
- send_buffer[i + 6] = le_fade_level & 0xff;
- send_buffer[i + 7] = le_fade_level >> 8;
+ send_buffer[i ] = attack_length & 0xff;
+ send_buffer[i + 1] = attack_length >> 8;
+ send_buffer[i + 2] = attack_level & 0xff;
+ send_buffer[i + 3] = attack_level >> 8;
+ send_buffer[i + 4] = fade_length & 0xff;
+ send_buffer[i + 5] = fade_length >> 8;
+ send_buffer[i + 6] = fade_level & 0xff;
+ send_buffer[i + 7] = fade_level >> 8;
}
static int t300rs_modify_envelope(struct t300rs_device_entry *t300rs,
@@ -126,7 +101,6 @@ static int t300rs_modify_envelope(struct t300rs_device_entry *t300rs,
struct ff_envelope envelope_old
){
u16 attack_length, attack_level, fade_length, fade_level;
- u16 le_attack_length, le_attack_level, le_fade_length, le_fade_level;
int ret = 0, trans;
if(duration == 0){
@@ -138,20 +112,15 @@ static int t300rs_modify_envelope(struct t300rs_device_entry *t300rs,
fade_length = (duration * envelope.fade_length) / 0x7fff;
fade_level = (level * envelope.fade_level) / 0x7fff;
- le_attack_length = cpu_to_le16(attack_length);
- le_attack_level = cpu_to_le16(attack_level);
- le_fade_length = cpu_to_le16(fade_length);
- le_fade_level = cpu_to_le16(fade_level);
-
- send_buffer[0] = 0x60;
- send_buffer[2] = id + 1;
- send_buffer[3] = 0x31;
+
+ send_buffer[1] = id + 1;
+ send_buffer[2] = 0x31;
if(envelope.attack_length != envelope_old.attack_length){
- send_buffer[4] = 0x81;
+ send_buffer[3] = 0x81;
- send_buffer[5] = le_attack_length & 0xff;
- send_buffer[6] = le_attack_length >> 8;
+ send_buffer[4] = attack_length & 0xff;
+ send_buffer[5] = attack_length >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -161,10 +130,10 @@ static int t300rs_modify_envelope(struct t300rs_device_entry *t300rs,
}
if(envelope.attack_level != envelope_old.attack_level){
- send_buffer[4] = 0x82;
+ send_buffer[3] = 0x82;
- send_buffer[5] = le_attack_level & 0xff;
- send_buffer[6] = le_attack_level >> 8;
+ send_buffer[4] = attack_level & 0xff;
+ send_buffer[5] = attack_level >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -174,10 +143,10 @@ static int t300rs_modify_envelope(struct t300rs_device_entry *t300rs,
}
if(envelope.fade_length != envelope_old.fade_length){
- send_buffer[4] = 0x84;
+ send_buffer[3] = 0x84;
- send_buffer[5] = le_fade_length & 0xff;
- send_buffer[6] = le_fade_length >> 8;
+ send_buffer[4] = fade_length & 0xff;
+ send_buffer[5] = fade_length >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -187,10 +156,10 @@ static int t300rs_modify_envelope(struct t300rs_device_entry *t300rs,
}
if(envelope.fade_level != envelope_old.fade_level){
- send_buffer[4] = 0x88;
+ send_buffer[3] = 0x88;
- send_buffer[5] = le_fade_level & 0xff;
- send_buffer[6] = le_fade_level >> 8;
+ send_buffer[4] = fade_level & 0xff;
+ send_buffer[5] = fade_level >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -207,7 +176,7 @@ error:
static int t300rs_modify_duration(struct t300rs_device_entry *t300rs, struct t300rs_effect_state *state, u8 *send_buffer){
struct ff_effect effect = state->effect;
struct ff_effect old = state->old;
- u16 duration, le_duration;
+ u16 duration;
int ret = 0, trans;
if(effect.replay.length == 0){
@@ -216,16 +185,14 @@ static int t300rs_modify_duration(struct t300rs_device_entry *t300rs, struct t30
duration = effect.replay.length;
}
- le_duration = cpu_to_le16(duration);
-
if(effect.replay.length != old.replay.length){
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x49;
- send_buffer[5] = 0x41;
+
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x49;
+ send_buffer[4] = 0x41;
- send_buffer[6] = le_duration & 0xff;
- send_buffer[7] = le_duration >> 8;
+ send_buffer[5] = duration & 0xff;
+ send_buffer[6] = duration >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -244,18 +211,17 @@ static int t300rs_modify_constant(struct t300rs_device_entry *t300rs, struct t30
struct ff_constant_effect constant = effect.u.constant;
struct ff_constant_effect constant_old = old.u.constant;
int ret, trans;
- s16 level, le_level;
+ s16 level;
level = (constant.level * fixp_sin16(effect.direction * 360 / 0x10000)) / 0x7fff;
- le_level = cpu_to_le16(level);
if(constant.level != constant_old.level){
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x0a;
+
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x0a;
- send_buffer[4] = le_level & 0xff;
- send_buffer[5] = le_level >> 8;
+ send_buffer[3] = level & 0xff;
+ send_buffer[4] = level >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -298,8 +264,8 @@ static int t300rs_modify_ramp(struct t300rs_device_entry *t300rs, struct t300rs_
struct ff_ramp_effect ramp_old = old.u.ramp;
int ret, trans;
- u16 difference, le_difference, top, bottom;
- s16 level, le_level;
+ u16 difference, top, bottom;
+ s16 level;
top = ramp.end_level > ramp.start_level ? ramp.end_level : ramp.start_level;
bottom = ramp.end_level > ramp.start_level ? ramp.start_level : ramp.end_level;
@@ -307,22 +273,20 @@ static int t300rs_modify_ramp(struct t300rs_device_entry *t300rs, struct t300rs_
difference = ((top - bottom) * fixp_sin16(effect.direction * 360 / 0x10000)) / 0x7fff;
- le_difference = cpu_to_le16(difference);
level = (top * fixp_sin16(effect.direction * 360 / 0x10000)) / 0x7fff;
- le_level = cpu_to_le16(level);
if(ramp.start_level != ramp_old.start_level || ramp.end_level != ramp_old.end_level){
- send_buffer[0] = 0x60;
+
send_buffer[1] = effect.id + 1;
send_buffer[2] = 0x0e;
send_buffer[3] = 0x03;
- send_buffer[4] = le_difference & 0xff;
- send_buffer[5] = le_difference >> 8;
+ send_buffer[4] = difference & 0xff;
+ send_buffer[5] = difference >> 8;
- send_buffer[6] = le_level & 0xff;
- send_buffer[7] = le_level >> 8;
+ send_buffer[6] = level & 0xff;
+ send_buffer[7] = level >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -342,6 +306,7 @@ static int t300rs_modify_ramp(struct t300rs_device_entry *t300rs, struct t300rs_
ramp.envelope,
ramp_old.envelope
);
+
if(ret){
hid_err(t300rs->hdev, "failed modifying ramp envelope\n");
goto error;
@@ -365,15 +330,15 @@ static int t300rs_modify_damper(struct t300rs_device_entry *t300rs, struct t300r
int ret, trans;
if(damper.right_coeff != damper_old.right_coeff){
- s16 le_coeff = cpu_to_le16(damper.right_coeff);
+ s16 coeff = damper.right_coeff;
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x0e;
- send_buffer[4] = 0x41;
+
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x0e;
+ send_buffer[3] = 0x41;
- send_buffer[5] = le_coeff & 0xff;
- send_buffer[6] = le_coeff >> 8;
+ send_buffer[4] = coeff & 0xff;
+ send_buffer[5] = coeff >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -385,15 +350,15 @@ static int t300rs_modify_damper(struct t300rs_device_entry *t300rs, struct t300r
}
if(damper.left_coeff != damper_old.left_coeff){
- s16 le_coeff = cpu_to_le16(damper.left_coeff);
+ s16 coeff = damper.left_coeff;
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x0e;
- send_buffer[4] = 0x42;
+
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x0e;
+ send_buffer[3] = 0x42;
- send_buffer[5] = le_coeff & 0xff;
- send_buffer[6] = le_coeff >> 8;
+ send_buffer[4] = coeff & 0xff;
+ send_buffer[5] = coeff >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -405,19 +370,19 @@ static int t300rs_modify_damper(struct t300rs_device_entry *t300rs, struct t300r
if((damper.deadband != damper_old.deadband) ||
(damper.center != damper_old.center)){
- u16 le_deadband_right = cpu_to_le16(0xfffe - damper.deadband - damper.center);
- u16 le_deadband_left = cpu_to_le16(0xfffe - damper.deadband + damper.center);
+ u16 deadband_right = 0xfffe - damper.deadband - damper.center;
+ u16 deadband_left = 0xfffe - damper.deadband + damper.center;
+
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x0e;
- send_buffer[4] = 0x4c;
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x0e;
+ send_buffer[3] = 0x4c;
- send_buffer[5] = le_deadband_right & 0xff;
- send_buffer[6] = le_deadband_right >> 8;
+ send_buffer[4] = deadband_right & 0xff;
+ send_buffer[5] = deadband_right >> 8;
- send_buffer[7] = le_deadband_left & 0xff;
- send_buffer[8] = le_deadband_left >> 8;
+ send_buffer[6] = deadband_left & 0xff;
+ send_buffer[7] = deadband_left >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -445,20 +410,19 @@ static int t300rs_modify_periodic(struct t300rs_device_entry *t300rs, struct t30
struct ff_periodic_effect periodic = effect.u.periodic;
struct ff_periodic_effect periodic_old = old.u.periodic;
int ret, trans;
- s16 level, le_level;
+ s16 level;
level = (periodic.magnitude * fixp_sin16(effect.direction * 360 / 0x10000)) / 0x7fff;
- le_level = cpu_to_le16(level);
if(periodic.magnitude != periodic_old.magnitude){
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x0e;
- send_buffer[4] = 0x01;
+
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x0e;
+ send_buffer[3] = 0x01;
- send_buffer[5] = le_level & 0xff;
- send_buffer[6] = le_level >> 8;
+ send_buffer[4] = level & 0xff;
+ send_buffer[5] = level >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -470,15 +434,15 @@ static int t300rs_modify_periodic(struct t300rs_device_entry *t300rs, struct t30
}
if(periodic.offset != periodic_old.offset){
- s16 le_offset = cpu_to_le16(periodic.offset);
+ s16 offset = periodic.offset;
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x0e;
- send_buffer[4] = 0x04;
+
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x0e;
+ send_buffer[3] = 0x02;
- send_buffer[5] = le_offset & 0xff;
- send_buffer[6] = le_offset >> 8;
+ send_buffer[4] = offset & 0xff;
+ send_buffer[5] = offset >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -489,15 +453,15 @@ static int t300rs_modify_periodic(struct t300rs_device_entry *t300rs, struct t30
}
if(periodic.phase != periodic_old.phase){
- s16 le_phase = cpu_to_le16(periodic.phase);
+ s16 phase = periodic.phase;
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x0e;
- send_buffer[4] = 0x02;
+
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x0e;
+ send_buffer[3] = 0x04;
- send_buffer[5] = le_phase & 0xff;
- send_buffer[6] = le_phase >> 8;
+ send_buffer[4] = phase & 0xff;
+ send_buffer[5] = phase >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -508,15 +472,15 @@ static int t300rs_modify_periodic(struct t300rs_device_entry *t300rs, struct t30
}
if(periodic.period != periodic_old.period){
- s16 le_period = cpu_to_le16(periodic.period);
+ s16 period = periodic.period;
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x0e;
- send_buffer[4] = 0x08;
+
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x0e;
+ send_buffer[3] = 0x08;
- send_buffer[5] = le_period & 0xff;
- send_buffer[6] = le_period >> 8;
+ send_buffer[4] = period & 0xff;
+ send_buffer[5] = period >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -555,8 +519,8 @@ static int t300rs_upload_constant(struct t300rs_device_entry *t300rs, struct t30
u8 *send_buffer = kzalloc(T300RS_BUFFER_LENGTH, GFP_ATOMIC);
struct ff_effect effect = state->effect;
struct ff_constant_effect constant = state->effect.u.constant;
- s16 level, le_level;
- u16 duration, le_offset, le_duration;
+ s16 level;
+ u16 duration, offset;
int ret, trans;
@@ -578,30 +542,28 @@ static int t300rs_upload_constant(struct t300rs_device_entry *t300rs, struct t30
duration = effect.replay.length;
}
- le_level = cpu_to_le16(level);
- le_offset = cpu_to_le16(effect.replay.delay);
- le_duration = cpu_to_le16(duration);
+ offset = effect.replay.delay;
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x6a;
+
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x6a;
- send_buffer[4] = le_level & 0xff;
- send_buffer[5] = le_level >> 8;
+ send_buffer[3] = level & 0xff;
+ send_buffer[4] = level >> 8;
- t300rs_fill_envelope(send_buffer, 6, level,
+ t300rs_fill_envelope(send_buffer, 5, level,
duration, &constant.envelope);
- send_buffer[15] = 0x4f;
+ send_buffer[14] = 0x4f;
- send_buffer[16] = le_duration & 0xff;
- send_buffer[17] = le_duration >> 8;
+ send_buffer[15] = duration & 0xff;
+ send_buffer[16] = duration >> 8;
- send_buffer[20] = le_offset & 0xff;
- send_buffer[21] = le_offset >> 8;
+ send_buffer[19] = offset & 0xff;
+ send_buffer[20] = offset >> 8;
+ send_buffer[22] = 0xff;
send_buffer[23] = 0xff;
- send_buffer[24] = 0xff;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -617,8 +579,8 @@ static int t300rs_upload_ramp(struct t300rs_device_entry *t300rs, struct t300rs_
struct ff_effect effect = state->effect;
struct ff_ramp_effect ramp = state->effect.u.ramp;
int ret, trans;
- u16 difference, le_difference, top, bottom, duration, le_duration, le_offset;
- s16 level, le_level;
+ u16 difference, offset, top, bottom, duration;
+ s16 level;
if(test_bit(FF_EFFECT_PLAYING, &state->flags) &&
test_bit(FF_EFFECT_QUEUE_UPDATE, &state->flags)){
@@ -638,38 +600,34 @@ static int t300rs_upload_ramp(struct t300rs_device_entry *t300rs, struct t300rs_
difference = ((top - bottom) * fixp_sin16(effect.direction * 360 / 0x10000)) / 0x7fff;
level = (top * fixp_sin16(effect.direction * 360 / 0x10000)) / 0x7fff;
-
- le_difference = cpu_to_le16(difference);
- le_level = cpu_to_le16(level);
- le_duration = cpu_to_le16(duration);
- le_offset = cpu_to_le16(effect.replay.delay);
+ offset = effect.replay.delay;
- send_buffer[0] = 0x60;
+
send_buffer[1] = effect.id + 1;
send_buffer[2] = 0x6b;
- send_buffer[3] = le_difference & 0xff;
- send_buffer[4] = le_difference >> 8;
+ send_buffer[3] = difference & 0xff;
+ send_buffer[4] = difference >> 8;
- send_buffer[5] = le_level & 0xff;
- send_buffer[6] = le_level >> 8;
+ send_buffer[5] = level & 0xff;
+ send_buffer[6] = level >> 8;
- send_buffer[9] = le_duration & 0xff;
- send_buffer[10] = le_duration >> 8;
+ send_buffer[9] = duration & 0xff;
+ send_buffer[10] = duration >> 8;
send_buffer[12] = 0x80;
- t300rs_fill_envelope(send_buffer, 14, level,
+ t300rs_fill_envelope(send_buffer, 13, level,
effect.replay.length, &ramp.envelope);
send_buffer[22] = ramp.end_level > ramp.start_level ? 0x04 : 0x05;
send_buffer[23] = 0x4f;
- send_buffer[24] = le_duration & 0xff;
- send_buffer[25] = le_duration >> 8;
+ send_buffer[24] = duration & 0xff;
+ send_buffer[25] = duration >> 8;
- send_buffer[28] = le_offset & 0xff;
- send_buffer[29] = le_offset >> 8;
+ send_buffer[28] = offset & 0xff;
+ send_buffer[29] = offset >> 8;
send_buffer[31] = 0xff;
send_buffer[32] = 0xff;
@@ -689,8 +647,7 @@ static int t300rs_upload_spring(struct t300rs_device_entry *t300rs, struct t300r
/* we only care about the first axis */
struct ff_condition_effect spring = state->effect.u.condition[0];
int ret, trans;
- u16 duration, le_right_coeff, le_left_coeff, le_deadband_right, le_deadband_left,
- le_duration, le_offset;
+ u16 duration, right_coeff, left_coeff, deadband_right, deadband_left, offset;
if(test_bit(FF_EFFECT_PLAYING, &state->flags) &&
test_bit(FF_EFFECT_QUEUE_UPDATE, &state->flags)){
@@ -704,42 +661,41 @@ static int t300rs_upload_spring(struct t300rs_device_entry *t300rs, struct t300r
duration = effect.replay.length;
}
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x64;
- le_right_coeff = cpu_to_le16(spring.right_coeff);
- le_left_coeff = cpu_to_le16(spring.left_coeff);
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x64;
+
+ right_coeff = spring.right_coeff;
+ left_coeff = spring.left_coeff;
- le_deadband_right = cpu_to_le16(0xfffe - spring.deadband - spring.center);
- le_deadband_left = cpu_to_le16(0xfffe - spring.deadband + spring.center);
+ deadband_right = 0xfffe - spring.deadband - spring.center;
+ deadband_left = 0xfffe - spring.deadband + spring.center;
- le_duration = cpu_to_le16(duration);
- le_offset = cpu_to_le16(effect.replay.delay);
+ offset = effect.replay.delay;
- send_buffer[4] = le_right_coeff & 0xff;
- send_buffer[5] = le_right_coeff >> 8;
+ send_buffer[3] = right_coeff & 0xff;
+ send_buffer[4] = right_coeff >> 8;
- send_buffer[6] = le_left_coeff & 0xff;
- send_buffer[7] = le_left_coeff >> 8;
+ send_buffer[5] = left_coeff & 0xff;
+ send_buffer[6] = left_coeff >> 8;
- send_buffer[8] = le_deadband_right & 0xff;
- send_buffer[9] = le_deadband_right >> 8;
+ send_buffer[7] = deadband_right & 0xff;
+ send_buffer[8] = deadband_right >> 8;
- send_buffer[10] = le_deadband_left & 0xff;
- send_buffer[11] = le_deadband_left >> 8;
+ send_buffer[9] = deadband_left & 0xff;
+ send_buffer[10] = deadband_left >> 8;
- memcpy(&send_buffer[12], spring_values, ARRAY_SIZE(spring_values));
- send_buffer[29] = 0x4f;
+ memcpy(&send_buffer[11], spring_values, ARRAY_SIZE(spring_values));
+ send_buffer[28] = 0x4f;
- send_buffer[30] = le_duration & 0xff;
- send_buffer[31] = le_duration >> 8;
+ send_buffer[29] = duration & 0xff;
+ send_buffer[30] = duration >> 8;
- send_buffer[34] = le_offset & 0xff;
- send_buffer[35] = le_offset >> 8;
+ send_buffer[33] = offset & 0xff;
+ send_buffer[34] = offset >> 8;
+ send_buffer[36] = 0xff;
send_buffer[37] = 0xff;
- send_buffer[38] = 0xff;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -756,8 +712,7 @@ static int t300rs_upload_damper(struct t300rs_device_entry *t300rs, struct t300r
/* we only care about the first axis */
struct ff_condition_effect spring = state->effect.u.condition[0];
int ret, trans;
- u16 duration, le_right_coeff, le_left_coeff, le_deadband_right, le_deadband_left,
- le_duration, le_offset;
+ u16 duration, right_coeff, left_coeff, deadband_right, deadband_left, offset;
if(test_bit(FF_EFFECT_PLAYING, &state->flags) &&
test_bit(FF_EFFECT_QUEUE_UPDATE, &state->flags)){
@@ -771,42 +726,41 @@ static int t300rs_upload_damper(struct t300rs_device_entry *t300rs, struct t300r
duration = effect.replay.length;
}
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x64;
- le_right_coeff = cpu_to_le16(spring.right_coeff);
- le_left_coeff = cpu_to_le16(spring.left_coeff);
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x64;
+
+ right_coeff = spring.right_coeff;
+ left_coeff = spring.left_coeff;
- le_deadband_right = cpu_to_le16(0xfffe - spring.deadband - spring.center);
- le_deadband_left = cpu_to_le16(0xfffe - spring.deadband + spring.center);
+ deadband_right = 0xfffe - spring.deadband - spring.center;
+ deadband_left = 0xfffe - spring.deadband + spring.center;
- le_duration = cpu_to_le16(duration);
- le_offset = cpu_to_le16(effect.replay.delay);
+ offset = effect.replay.delay;
- send_buffer[4] = le_right_coeff & 0xff;
- send_buffer[5] = le_right_coeff >> 8;
+ send_buffer[3] = right_coeff & 0xff;
+ send_buffer[4] = right_coeff >> 8;
- send_buffer[6] = le_left_coeff & 0xff;
- send_buffer[7] = le_left_coeff >> 8;
+ send_buffer[5] = left_coeff & 0xff;
+ send_buffer[6] = left_coeff >> 8;
- send_buffer[8] = le_deadband_right & 0xff;
- send_buffer[9] = le_deadband_right >> 8;
+ send_buffer[7] = deadband_right & 0xff;
+ send_buffer[8] = deadband_right >> 8;
- send_buffer[10] = le_deadband_left & 0xff;
- send_buffer[11] = le_deadband_left >> 8;
+ send_buffer[9] = deadband_left & 0xff;
+ send_buffer[10] = deadband_left >> 8;
- memcpy(&send_buffer[12], damper_values, ARRAY_SIZE(damper_values));
- send_buffer[29] = 0x4f;
+ memcpy(&send_buffer[11], damper_values, ARRAY_SIZE(damper_values));
+ send_buffer[28] = 0x4f;
- send_buffer[30] = le_duration & 0xff;
- send_buffer[31] = le_duration >> 8;
+ send_buffer[29] = duration & 0xff;
+ send_buffer[30] = duration >> 8;
- send_buffer[34] = le_offset & 0xff;
- send_buffer[35] = le_offset >> 8;
+ send_buffer[33] = offset & 0xff;
+ send_buffer[34] = offset >> 8;
+ send_buffer[36] = 0xff;
send_buffer[37] = 0xff;
- send_buffer[38] = 0xff;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -822,8 +776,8 @@ static int t300rs_upload_periodic(struct t300rs_device_entry *t300rs, struct t30
struct ff_effect effect = state->effect;
struct ff_periodic_effect periodic = state->effect.u.periodic;
int ret, trans;
- u16 duration, magnitude, le_magnitude, le_phase, le_period, le_offset, le_duration;
- s16 le_periodic_offset;
+ u16 duration, magnitude, phase, period, offset;
+ s16 periodic_offset;
if(test_bit(FF_EFFECT_PLAYING, &state->flags) &&
test_bit(FF_EFFECT_QUEUE_UPDATE, &state->flags)){
@@ -839,45 +793,43 @@ static int t300rs_upload_periodic(struct t300rs_device_entry *t300rs, struct t30
magnitude = (periodic.magnitude * fixp_sin16(effect.direction * 360 / 0x10000)) / 0x7fff;
- le_magnitude = cpu_to_le16(magnitude);
- le_phase = cpu_to_le16(periodic.phase);
- le_periodic_offset = cpu_to_le16(periodic.offset);
- le_period = cpu_to_le16(periodic.period);
- le_offset = cpu_to_le16(effect.replay.delay);
- le_duration = cpu_to_le16(duration);
+ phase = periodic.phase;
+ periodic_offset = periodic.offset;
+ period = periodic.period;
+ offset = effect.replay.delay;
- send_buffer[0] = 0x60;
- send_buffer[2] = effect.id + 1;
- send_buffer[3] = 0x6b;
- send_buffer[4] = le_magnitude & 0xff;
- send_buffer[5] = le_magnitude >> 8;
+ send_buffer[1] = effect.id + 1;
+ send_buffer[2] = 0x6b;
+
+ send_buffer[3] = magnitude & 0xff;
+ send_buffer[4] = magnitude >> 8;
- send_buffer[6] = le_phase & 0xff;
- send_buffer[7] = le_phase >> 8;
+ send_buffer[7] = phase & 0xff;
+ send_buffer[8] = phase >> 8;
- send_buffer[8] = le_periodic_offset & 0xff;
- send_buffer[9] = le_periodic_offset >> 8;
+ send_buffer[5] = periodic_offset & 0xff;
+ send_buffer[6] = periodic_offset >> 8;
- send_buffer[10] = le_period & 0xff;
- send_buffer[11] = le_period >> 8;
+ send_buffer[9] = period & 0xff;
+ send_buffer[10] = period >> 8;
- send_buffer[13] = 0x80;
+ send_buffer[12] = 0x80;
- t300rs_fill_envelope(send_buffer, 14, magnitude,
+ t300rs_fill_envelope(send_buffer, 13, magnitude,
effect.replay.length, &periodic.envelope);
- send_buffer[22] = periodic.waveform - 0x57;
- send_buffer[23] = 0x4f;
+ send_buffer[21] = periodic.waveform - 0x57;
+ send_buffer[22] = 0x4f;
- send_buffer[24] = le_duration & 0xff;
- send_buffer[25] = le_duration >> 8;
+ send_buffer[23] = duration & 0xff;
+ send_buffer[24] = duration >> 8;
- send_buffer[28] = le_offset & 0xff;
- send_buffer[29] = le_offset >> 8;
+ send_buffer[27] = offset & 0xff;
+ send_buffer[28] = offset >> 8;
+ send_buffer[30] = 0xff;
send_buffer[31] = 0xff;
- send_buffer[32] = 0xff;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -989,7 +941,6 @@ static enum hrtimer_restart t300rs_timer(struct hrtimer *t){
}
}
-
static int t300rs_upload(struct input_dev *dev, struct ff_effect *effect, struct ff_effect *old){
struct hid_device *hdev = input_get_drvdata(dev);
struct t300rs_device_entry *t300rs;
@@ -1013,6 +964,8 @@ static int t300rs_upload(struct input_dev *dev, struct ff_effect *effect, struct
if(old){
state->old = *old;
__set_bit(FF_EFFECT_QUEUE_UPDATE, &state->flags);
+ } else {
+ __clear_bit(FF_EFFECT_QUEUE_UPDATE, &state->flags);
}
__set_bit(FF_EFFECT_QUEUE_UPLOAD, &state->flags);
@@ -1036,15 +989,6 @@ static int t300rs_play(struct input_dev *dev, int effect_id, int value){
spin_lock_irqsave(&t300rs->lock, t300rs->lock_flags);
if(value > 0){
- /*
- if(test_bit(FF_EFFECT_QUEUE_START, &state->flags)){
- __set_bit(FF_EFFECT_QUEUE_STOP, &state->flags);
- } else {
- t300rs->effects_used++;
- }*/
-
-
-
state->count = value;
state->start_time = JIFFIES2MS(jiffies);
__set_bit(FF_EFFECT_QUEUE_START, &state->flags);
@@ -1071,7 +1015,6 @@ static ssize_t t300rs_range_store(struct device *dev, struct device_attribute *a
struct t300rs_device_entry *t300rs;
u8 *send_buffer = kzalloc(T300RS_BUFFER_LENGTH, GFP_ATOMIC);
u16 range = simple_strtoul(buf, NULL, 10);
- u16 le_range;
int ret, trans;
t300rs = t300rs_get_device(hdev);
@@ -1086,13 +1029,11 @@ static ssize_t t300rs_range_store(struct device *dev, struct device_attribute *a
range *= 0x3c;
- le_range = cpu_to_le16(range);
-
- send_buffer[0] = 0x60;
- send_buffer[1] = 0x08;
- send_buffer[2] = 0x11;
- send_buffer[3] = le_range & 0xff;
- send_buffer[4] = le_range >> 8;
+
+ send_buffer[0] = 0x08;
+ send_buffer[1] = 0x11;
+ send_buffer[2] = range & 0xff;
+ send_buffer[3] = range >> 8;
ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
if(ret){
@@ -1121,25 +1062,23 @@ static DEVICE_ATTR(range, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, t300r
static void t300rs_set_autocenter(struct input_dev *dev, u16 value){
struct hid_device *hdev = input_get_drvdata(dev);
u8 *send_buffer = kzalloc(T300RS_BUFFER_LENGTH, GFP_ATOMIC);
- u16 le_value = cpu_to_le16(value);
int ret, trans;
- send_buffer[0] = 0x60;
- send_buffer[1] = 0x08;
- send_buffer[2] = 0x04;
- send_buffer[3] = 0x01;
+
+ send_buffer[0] = 0x08;
+ send_buffer[1] = 0x04;
+ send_buffer[2] = 0x01;
ret = t300rs_send_int(dev, send_buffer, &trans);
if(ret){
hid_err(hdev, "failed setting autocenter");
}
- send_buffer[0] = 0x60;
- send_buffer[1] = 0x08;
- send_buffer[2] = 0x03;
+ send_buffer[0] = 0x08;
+ send_buffer[1] = 0x03;
- send_buffer[3] = le_value & 0xff;
- send_buffer[4] = le_value >> 8;
+ send_buffer[2] = value & 0xff;
+ send_buffer[3] = value >> 8;
ret = t300rs_send_int(dev, send_buffer, &trans);
if(ret){
@@ -1154,24 +1093,23 @@ static void t300rs_set_gain(struct input_dev *dev, u16 gain){
u8 *send_buffer = kzalloc(T300RS_BUFFER_LENGTH, GFP_ATOMIC);
int ret, trans;
- send_buffer[0] = 0x60;
- send_buffer[1] = 0x02;
- send_buffer[2] = SCALE_VALUE_U16(gain, 8);
+
+ send_buffer[0] = 0x02;
+ send_buffer[1] = SCALE_VALUE_U16(gain, 8);
ret = t300rs_send_int(dev, send_buffer, &trans);
if(ret){
- hid_err(hdev, "failed setting gain\n");
+ hid_err(hdev, "failed setting gain: %i\n", ret);
}
kfree(send_buffer);
}
static void t300rs_destroy(struct ff_device *ff){
- /* maybe not temp? */
+ /* maybe not necessary? */
return;
}
-
static int t300rs_open(struct input_dev *dev){
struct t300rs_device_entry *t300rs;
struct hid_device *hdev = input_get_drvdata(dev);
@@ -1180,43 +1118,17 @@ static int t300rs_open(struct input_dev *dev){
t300rs = t300rs_get_device(hdev);
- send_buffer[0] = 0x60;
- send_buffer[1] = 0x01;
- send_buffer[2] = 0x04;
+ send_buffer[0] = 0x01;
+ send_buffer[1] = 0x05;
ret = t300rs_send_int(dev, send_buffer, &trans);
if(ret){
hid_err(hdev, "failed sending interrupts\n");
goto err;
}
- memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
-
- send_buffer[0] = 0x60;
- send_buffer[1] = 0x12;
- send_buffer[2] = 0xbf;
- send_buffer[3] = 0x04;
- send_buffer[6] = 0x03;
- send_buffer[7] = 0xb7;
- send_buffer[8] = 0x1e;
-
- ret = t300rs_send_int(dev, send_buffer, &trans);
- if(ret){
- hid_err(hdev, "failed sending interrupts\n");
- goto err;
- }
- memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
-
- send_buffer[0] = 0x60;
- send_buffer[1] = 0x01;
- send_buffer[2] = 0x05;
-
- ret = t300rs_send_int(dev, send_buffer, &trans);
- if(ret){
- hid_err(hdev, "failed sending interrupts\n");
- goto err;
- }
-
+
err:
+
kfree(send_buffer);
return t300rs->open(dev);
}
@@ -1229,8 +1141,7 @@ static void t300rs_close(struct input_dev *dev){
t300rs = t300rs_get_device(hdev);
- send_buffer[0] = 0x60;
- send_buffer[1] = 0x01;
+ send_buffer[0] = 0x01;
ret = t300rs_send_int(dev, send_buffer, &trans);
if(ret){
@@ -1243,105 +1154,6 @@ err:
return;
}
-void t300rs_init_interrupts(struct t300rs_device_entry *t300rs){
- int ret, trans;
- u8 *send_buffer = kzalloc(T300RS_BUFFER_LENGTH, GFP_ATOMIC);
-
- send_buffer[0] = 0x42;
- send_buffer[1] = 0x01;
-
- ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
- if(ret){
- hid_err(t300rs->hdev, "failed sending interrupts\n");
- goto err;
- }
- memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
-
- send_buffer[0] = 0x0a;
- send_buffer[1] = 0x04;
- send_buffer[2] = 0x90;
- send_buffer[3] = 0x03;
-
- ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
- if(ret){
- hid_err(t300rs->hdev, "failed sending interrupts\n");
- goto err;
- }
- memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
-
- send_buffer[0] = 0x0a;
- send_buffer[1] = 0x04;
- send_buffer[2] = 0x00;
- send_buffer[3] = 0x0c;
-
- ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
- if(ret){
- hid_err(t300rs->hdev, "failed sending interrupts\n");
- goto err;
- }
- memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
-
- send_buffer[0] = 0x0a;
- send_buffer[1] = 0x04;
- send_buffer[2] = 0x12;
- send_buffer[3] = 0x10;
-
- ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
- if(ret){
- hid_err(t300rs->hdev, "failed sending interrupts\n");
- goto err;
- }
- memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
-
- send_buffer[0] = 0x0a;
- send_buffer[1] = 0x04;
- send_buffer[2] = 0x00;
- send_buffer[3] = 0x06;
-
- ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
- if(ret){
- hid_err(t300rs->hdev, "failed sending interrupts\n");
- goto err;
- }
- memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
-
- send_buffer[0] = 0x0a;
- send_buffer[1] = 0x04;
- send_buffer[2] = 0x03;
-
- ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
- if(ret){
- hid_err(t300rs->hdev, "failed sending interrupts\n");
- goto err;
- }
- memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
-
- send_buffer[0] = 0x0a;
- send_buffer[1] = 0x04;
- send_buffer[2] = 0x03;
-
- ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
- if(ret){
- hid_err(t300rs->hdev, "failed sending interrupts\n");
- goto err;
- }
- memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
-
- send_buffer[0] = 0x0a;
- send_buffer[1] = 0x04;
- send_buffer[2] = 0x03;
-
- ret = t300rs_send_int(t300rs->input_dev, send_buffer, &trans);
- if(ret){
- hid_err(t300rs->hdev, "failed sending interrupts\n");
- goto err;
- }
- memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
-err:
- kfree(send_buffer);
- return;
-}
-
int t300rs_init(struct hid_device *hdev, const signed short *ff_bits){
struct t300rs_device_entry *t300rs;
struct t300rs_data *drv_data;
@@ -1354,6 +1166,7 @@ int t300rs_init(struct hid_device *hdev, const signed short *ff_bits){
struct usb_device *usbdev = interface_to_usbdev(usbif);
struct hid_report *report;
struct ff_device *ff;
+ u8 *transfer = kzalloc(64, GFP_ATOMIC);
char range[10] = "900"; /* max */
int i, ret;
@@ -1385,7 +1198,6 @@ int t300rs_init(struct hid_device *hdev, const signed short *ff_bits){
}
spin_lock_init(&t300rs->lock);
- spin_lock_init(&data_lock);
drv_data->device_props = t300rs;
@@ -1401,7 +1213,7 @@ int t300rs_init(struct hid_device *hdev, const signed short *ff_bits){
}
switch(field->usage[0].hid){
- case 0xff00000a:
+ case 0xff000060:
if(field->report_count < 2){
hid_warn(hdev, "ignoring FF field with report_count < 2\n");
continue;
@@ -1432,7 +1244,7 @@ int t300rs_init(struct hid_device *hdev, const signed short *ff_bits){
break;
default:
- hid_warn(hdev, "ignoring unknown output usage\n");
+ hid_warn(hdev, "ignoring unknown output usage: %i\n", field->usage[0].hid);
continue;
}
}
@@ -1468,17 +1280,14 @@ int t300rs_init(struct hid_device *hdev, const signed short *ff_bits){
hid_warn(hdev, "unable to create sysfs interface for range\n");
goto out;
}
-
hrtimer_init(&t300rs->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
t300rs->hrtimer.function = t300rs_timer;
- spin_unlock_irqrestore(&lock, lock_flags);
-
t300rs_range_store(dev, &dev_attr_range, range, 10);
t300rs_set_gain(input_dev, 0xffff);
- t300rs_init_interrupts(t300rs);
+ kfree(transfer);
hid_info(hdev, "force feedback for T300RS\n");
return 0;
@@ -1500,7 +1309,6 @@ static int t300rs_probe(struct hid_device *hdev, const struct hid_device_id *id)
struct t300rs_data *drv_data;
spin_lock_init(&lock);
- spin_lock_irqsave(&lock, lock_flags);
drv_data = kzalloc(sizeof(struct t300rs_data), GFP_ATOMIC);
if(!drv_data){
@@ -1532,7 +1340,6 @@ static int t300rs_probe(struct hid_device *hdev, const struct hid_device_id *id)
return 0;
err:
kfree(drv_data);
- spin_unlock_irqrestore(&lock, lock_flags);
return ret;
}