diff options
| -rw-r--r-- | .gitignore | 8 | ||||
| -rw-r--r-- | fft.txt | 11 | ||||
| -rw-r--r-- | force-effects.txt | 10 | ||||
| -rw-r--r-- | hid-tminit.c | 32 | ||||
| -rw-r--r-- | hid-tmt300rs.c | 681 | ||||
| -rw-r--r-- | hid-tmt300rs.h | 6 |
6 files changed, 292 insertions, 456 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ad1d72 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +*.o +*.ko +*.mod* +*.orig +*.cmd +compile_commands.json +Module.symvers +modules.order @@ -0,0 +1,11 @@ +83 +85 +84 +86 + +81 + +83 +85 +84 +86 diff --git a/force-effects.txt b/force-effects.txt index 4f6973e..dc2b8f1 100644 --- a/force-effects.txt +++ b/force-effects.txt @@ -258,8 +258,8 @@ FF_PERIODIC: 01 - ID 6b - new periodic effect 00 00 - magnitude *** - fe ff - phase (left/right) - 00 00 - offset of effect (forward/backward) + fe ff - offset (up/down) + 00 00 - phase (left/right) e8 03 - period 00 80 00 00 - attack_length @@ -293,7 +293,7 @@ FF_PERIODIC: offset of effect: 60 00 02 - ID - 0e 04 + 0e 02 64 35 - value, signed (between 00 00 and ff 7f?) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 @@ -303,7 +303,7 @@ FF_PERIODIC: phase: 60 00 02 - ID - 0e 02 + 0e 04 64 35 - value, signed (between 80 01 and ff 7f?) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 @@ -389,7 +389,7 @@ Open: (this command doesn't appear every time, odd) 60 12 - ? - bf 04 00 00 03 b7 1e - ? + bf 04 00 00 03 b7 1e - ? /* wow, this is different on different wheels? */ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 diff --git a/hid-tminit.c b/hid-tminit.c index f9b14d8..ba52ea3 100644 --- a/hid-tminit.c +++ b/hid-tminit.c @@ -1,7 +1,11 @@ #include "hid-tminit.h" static void tminit_callback(struct urb *urb){ - hid_info(urb->dev, "urb status %d received\n", urb->status); + if(urb->status){ + hid_info(urb->dev, "urb status %d received\n", urb->status); + } + + usb_free_urb(urb); } /* for some godawful reason these interrupts are absolutely necessary, otherwise @@ -15,7 +19,7 @@ static void tminit_interrupts(struct hid_device *hdev){ struct device *dev = &hdev->dev; struct usb_interface *usbif = to_usb_interface(dev->parent); struct usb_device *usbdev = interface_to_usbdev(usbif); - + ep = &usbif->cur_altsetting->endpoint[1]; b_ep = ep->desc.bEndpointAddress; @@ -27,12 +31,14 @@ static void tminit_interrupts(struct hid_device *hdev){ send_buf, setup_arr_sizes[i], &trans, - USB_CTRL_SET_TIMEOUT); + USB_CTRL_SET_TIMEOUT + ); if(ret){ hid_err(hdev, "setup data couldn't be sent\n"); return; } + } kzfree(send_buf); @@ -45,7 +51,8 @@ int tminit(struct hid_device *hdev){ struct usb_interface *usbif = to_usb_interface(dev->parent); struct usb_device *usbdev = interface_to_usbdev(usbif); int ret; - + u8 *transfer = kzalloc(64, GFP_ATOMIC); + tminit_interrupts(hdev); setup_packet = kmalloc(8, GFP_ATOMIC); @@ -57,13 +64,13 @@ int tminit(struct hid_device *hdev){ urb = usb_alloc_urb(0, GFP_ATOMIC); usb_fill_control_urb(urb, - usbdev, - usb_sndctrlpipe(usbdev, 0), - setup_packet, - transfer_buffer, - 8, - tminit_callback, - hdev); + usbdev, + usb_sndctrlpipe(usbdev, 0), + setup_packet, + transfer_buffer, + 8, + tminit_callback, + hdev); /* we sort of have to go on faith that the message is sent, because the * wheel usually completely dies as soon as it receives the message. @@ -72,6 +79,7 @@ int tminit(struct hid_device *hdev){ ret = usb_submit_urb(urb, GFP_ATOMIC); kfree(setup_packet); kfree(transfer_buffer); + kfree(transfer); return ret; } @@ -94,7 +102,7 @@ static int tminit_probe(struct hid_device *hdev, const struct hid_device_id *id) hid_err(hdev, "hw start failed\n"); goto err; } - + ret = tminit(hdev); if(ret){ hid_err(hdev, "tminit exited, error might be intended behaviour\n"); 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; } diff --git a/hid-tmt300rs.h b/hid-tmt300rs.h index e5bb58d..2d05127 100644 --- a/hid-tmt300rs.h +++ b/hid-tmt300rs.h @@ -5,7 +5,7 @@ #include <linux/fixp-arith.h> #define T300RS_MAX_EFFECTS 16 -#define T300RS_BUFFER_LENGTH 64 +#define T300RS_BUFFER_LENGTH 63 /* the wheel seems to only be capable of processing a certain number of * interrupts per second, and if this value is too low the kernel urb buffer(or @@ -87,7 +87,9 @@ struct t300rs_data{ void *device_props; }; -static __u8 t300rs_rdesc_fixed[] = {0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0x09, 0x01, 0xa1, 0x00, 0x85, 0x07, 0x09, 0x30, 0x15, 0x00, 0x27, 0xff, 0xff, 0x00, 0x00, 0x35, 0x00, 0x47, 0xff, 0xff, 0x00, 0x00, 0x75, 0x10, 0x95, 0x01, 0x81, 0x02, 0x09, 0x35, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x31, 0x81, 0x02, 0x81, 0x03, 0x05, 0x09, 0x19, 0x01, 0x29, 0x0d, 0x25, 0x01, 0x45, 0x01, 0x75, 0x01, 0x95, 0x0d, 0x81, 0x02, 0x75, 0x0b, 0x95, 0x01, 0x81, 0x03, 0x05, 0x01, 0x09, 0x39, 0x25, 0x07, 0x46, 0x3b, 0x01, 0x55, 0x00, 0x65, 0x14, 0x75, 0x04, 0x81, 0x42, 0x65, 0x00, 0x81, 0x03, 0x85, 0x0a, 0x06, 0x00, 0xff, 0x09, 0x0a, 0x75, 0x08, 0x95, 0x3f, 0x26, 0xff, 0x7f, 0x16, 0x00, 0x80, 0x46, 0xff, 0x7f, 0x36, 0x00, 0x80, 0x91, 0x02, 0x85, 0x02, 0x09, 0x02, 0x81, 0x02, 0x09, 0x14, 0x85, 0x14, 0x81, 0x02, 0xc0, 0xc0,}; +static __u8 t300rs_rdesc_fixed[] = {0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0x09, 0x01, 0xa1, 0x00, 0x85, 0x07, 0x09, 0x30, 0x15, 0x00, 0x27, 0xff, 0xff, 0x00, 0x00, 0x35, 0x00, 0x47, 0xff, 0xff, 0x00, 0x00, 0x75, 0x10, 0x95, 0x01, 0x81, 0x02, 0x09, 0x35, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x31, 0x81, 0x02, 0x81, 0x03, 0x05, 0x09, 0x19, 0x01, 0x29, 0x0d, 0x25, 0x01, 0x45, 0x01, 0x75, 0x01, 0x95, 0x0d, 0x81, 0x02, 0x75, 0x0b, 0x95, 0x01, 0x81, 0x03, 0x05, 0x01, 0x09, 0x39, 0x25, 0x07, 0x46, 0x3b, 0x01, 0x55, 0x00, 0x65, 0x14, 0x75, 0x04, 0x81, 0x42, 0x65, 0x00, 0x81, 0x03, 0x85, 0x60, // here 0x0a + 0x06, 0x00, 0xff, 0x09, 0x60, // here 0x0a + 0x75, 0x08, 0x95, 0x3f, 0x26, 0xff, 0x7f, 0x15, 0x00, 0x46, 0xff, 0x7f, 0x36, 0x00, 0x80, 0x91, 0x02, 0x85, 0x02, 0x09, 0x02, 0x81, 0x02, 0x09, 0x14, 0x85, 0x14, 0x81, 0x02, 0xc0, 0xc0,}; static u8 spring_values[] = { 0xa6, 0x6a, 0xa6, 0x6a, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xdf, 0x58, 0xa6, 0x6a, 0x06 |
