aboutsummaryrefslogtreecommitdiff
path: root/hid-tmt300rs.c
diff options
context:
space:
mode:
Diffstat (limited to 'hid-tmt300rs.c')
-rw-r--r--hid-tmt300rs.c119
1 files changed, 116 insertions, 3 deletions
diff --git a/hid-tmt300rs.c b/hid-tmt300rs.c
index ebb5538..40aa646 100644
--- a/hid-tmt300rs.c
+++ b/hid-tmt300rs.c
@@ -665,6 +665,8 @@ static int t300rs_upload_ramp(struct t300rs_device_entry *t300rs, struct t300rs_
send_buffer[22] = ramp.end_level > ramp.start_level ? 0x04 : 0x05;
send_buffer[23] = 0x4f;
+ hid_info(t300rs->hdev, "uploading ramp effect with dir %i", send_buffer[22]);
+
send_buffer[24] = le_duration & 0xff;
send_buffer[25] = le_duration >> 8;
@@ -850,7 +852,7 @@ static int t300rs_upload_periodic(struct t300rs_device_entry *t300rs, struct t30
le_offset = cpu_to_le16(effect.replay.delay);
le_duration = cpu_to_le16(duration);
- send_buffer[0] = 0x60;
+ send_buffer[0] = 0x60;
send_buffer[2] = effect.id + 1;
send_buffer[3] = 0x6b;
@@ -1122,6 +1124,16 @@ static void t300rs_set_autocenter(struct input_dev *dev, u16 value){
send_buffer[0] = 0x60;
send_buffer[1] = 0x08;
+ send_buffer[2] = 0x04;
+ send_buffer[3] = 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[3] = le_value & 0xff;
@@ -1163,7 +1175,7 @@ static int t300rs_open(struct input_dev *dev){
struct hid_device *hdev = input_get_drvdata(dev);
u8 *send_buffer = kzalloc(T300RS_BUFFER_LENGTH, GFP_ATOMIC);
int ret, trans;
-
+
t300rs = t300rs_get_device(hdev);
send_buffer[0] = 0x60;
@@ -1229,6 +1241,105 @@ 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;
@@ -1241,7 +1352,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;
- char range[10] = "1080"; /* max */
+ char range[10] = "900"; /* max */
int i, ret;
drv_data = hid_get_drvdata(hdev);
@@ -1365,6 +1476,8 @@ int t300rs_init(struct hid_device *hdev, const signed short *ff_bits){
t300rs_range_store(dev, &dev_attr_range, range, 10);
t300rs_set_gain(input_dev, 0xffff);
+ t300rs_init_interrupts(t300rs);
+
hid_info(hdev, "force feedback for T300RS\n");
return 0;