diff options
Diffstat (limited to 'hid-tmt300rs.c')
| -rw-r--r-- | hid-tmt300rs.c | 681 |
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; } |
