aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hid-tminit.c79
-rw-r--r--hid-tmt300rs.c79
2 files changed, 145 insertions, 13 deletions
diff --git a/hid-tminit.c b/hid-tminit.c
index 7f1c657..be62ee8 100644
--- a/hid-tminit.c
+++ b/hid-tminit.c
@@ -1,9 +1,52 @@
#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);
+}
+
+static int tminit_send_int(struct hid_device *hdev, struct usb_device *usbdev, struct usb_interface *usbif, u8 *send_buffer, int *trans){
+ struct urb *urb = usb_alloc_urb(0, GFP_ATOMIC);
+ struct usb_host_endpoint *ep;
+
+ ep = &usbif->cur_altsetting->endpoint[1];
+
+ usb_fill_int_urb(
+ urb,
+ usbdev,
+ usb_sndintpipe(usbdev, 1),
+ send_buffer,
+ 9,
+ tminit_callback,
+ hdev,
+ ep->desc.bInterval
+ );
+
+ return usb_submit_urb(urb, GFP_ATOMIC);
}
+static int tminit_send_int_in(struct hid_device *hdev, struct usb_device *usbdev, struct usb_interface *usbif, u8 *send_buffer, int *trans){
+ struct urb *urb = usb_alloc_urb(0, GFP_ATOMIC);
+ struct usb_host_endpoint *ep;
+
+ ep = &usbif->cur_altsetting->endpoint[1];
+
+ usb_fill_int_urb(
+ urb,
+ usbdev,
+ usb_rcvintpipe(usbdev, 2),
+ send_buffer,
+ 27,
+ tminit_callback,
+ hdev,
+ ep->desc.bInterval
+ );
+
+ return usb_submit_urb(urb, GFP_ATOMIC);
+}
/* for some godawful reason these interrupts are absolutely necessary, otherwise
* the whole kernel crashes. I have no idea why.
* */
@@ -19,7 +62,30 @@ static void tminit_interrupts(struct hid_device *hdev){
ep = &usbif->cur_altsetting->endpoint[1];
b_ep = ep->desc.bEndpointAddress;
- for(i = 0; i < ARRAY_SIZE(setup_arr); ++i){
+ memcpy(send_buf, setup_arr[0], setup_arr_sizes[0]);
+ ret = usb_interrupt_msg(usbdev,
+ usb_sndintpipe(usbdev, b_ep),
+ send_buf,
+ setup_arr_sizes[0],
+ &trans,
+ USB_CTRL_SET_TIMEOUT
+ );
+
+ if(ret){
+ hid_err(hdev, "setup int couldn't be sent: %i\n", ret);
+ }
+
+ for(i = 0; i < 4; ++i){
+ ret = tminit_send_int_in(hdev, usbdev, usbif, send_buf, trans);
+
+ if(ret){
+ hid_err(hdev, "setup int in couldn't be sent: %i\n", ret);
+ }
+ }
+
+ msleep(100);
+
+ for(i = 1; i < ARRAY_SIZE(setup_arr); ++i){
memcpy(send_buf, setup_arr[i], setup_arr_sizes[i]);
ret = usb_interrupt_msg(usbdev,
@@ -27,12 +93,15 @@ 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;
}
+
+ msleep(10);
}
@@ -140,6 +209,9 @@ int tminit(struct hid_device *hdev){
memcpy(setup_packet, hw_rq_out, 8);
memcpy(transfer_buffer, hw_rq_in, 8);
+ // this is really ugly but it'll work for now I suppose
+ msleep(200);
+
ret = usb_control_msg(usbdev,
usb_rcvctrlpipe(usbdev, 0),
73,
@@ -154,6 +226,7 @@ int tminit(struct hid_device *hdev){
hid_err(hdev, "failed retrieving 73 after interrupts: %i", ret);
}
+
urb = usb_alloc_urb(0, GFP_ATOMIC);
usb_fill_control_urb(urb,
diff --git a/hid-tmt300rs.c b/hid-tmt300rs.c
index 85cc370..5885a74 100644
--- a/hid-tmt300rs.c
+++ b/hid-tmt300rs.c
@@ -38,6 +38,7 @@ static int t300rs_send_int(struct input_dev *dev, u8 *send_buffer, int *trans){
struct usb_interface *usbif;
struct usb_host_endpoint *ep;
struct urb *urb = usb_alloc_urb(0, GFP_ATOMIC);
+ int ret;
t300rs = t300rs_get_device(hdev);
if(!t300rs){
@@ -1241,13 +1242,14 @@ static int t300rs_open(struct input_dev *dev){
memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
send_buffer[0] = 0x60;
- send_buffer[1] = 0x12; // 0x12;
- send_buffer[2] = 0xbf; // 0xbf;
- send_buffer[3] = 0x04; // 0x04;
+ send_buffer[1] = 0x13; // 0x12;
+ send_buffer[2] = 0x04; // 0xbf;
+ send_buffer[3] = 0xbf; // 0x04;
+ send_buffer[4] = 0x04;
- send_buffer[6] = 0x03;
- send_buffer[7] = 0xc3; //0xb7;
- send_buffer[8] = 0x20; //0x1e;
+ send_buffer[7] = 0x03;
+ send_buffer[8] = 0xc3; //0xb7;
+ send_buffer[9] = 0x20; //0x1e;
ret = t300rs_send_int(dev, send_buffer, &trans);
if(ret){
@@ -1256,7 +1258,7 @@ static int t300rs_open(struct input_dev *dev){
}
memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
- //t300rs_open_interrupts(t300rs);
+ t300rs_open_interrupts(t300rs);
send_buffer[0] = 0x60;
send_buffer[1] = 0x01;
@@ -1271,7 +1273,11 @@ static int t300rs_open(struct input_dev *dev){
err:
kfree(send_buffer);
+<<<<<<< HEAD
return 0; //t300rs->open(dev);
+=======
+ return 0; // t300rs->open(dev);
+>>>>>>> f605352ef1a78145c01323633eeb15664ebb3cc4
}
static void t300rs_close(struct input_dev *dev){
@@ -1297,6 +1303,54 @@ err:
}
+static int t300rs_send_int_in(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 ret;
+
+ t300rs = t300rs_get_device(hdev);
+ if(!t300rs){
+ hid_err(hdev, "could not get device\n");
+ }
+
+ usbdev = t300rs->usbdev;
+ usbif = t300rs->usbif;
+ ep = &usbif->cur_altsetting->endpoint[1];
+
+ usb_fill_int_urb(
+ urb,
+ usbdev,
+ usb_rcvintpipe(usbdev, 2),
+ send_buffer,
+ T300RS_BUFFER_LENGTH,
+ t300rs_int_callback,
+ hdev,
+ ep->desc.bInterval
+ );
+
+ return usb_submit_urb(urb, GFP_ATOMIC);
+}
+
+void t300rs_send_five_ints(struct t300rs_device_entry *t300rs){
+ int i, ret, trans;
+ u8 *send_buf = kmalloc(64, GFP_KERNEL);
+
+ for(i = 0; i < 5; ++i){
+ ret = t300rs_send_int_in(t300rs->input_dev, send_buf, &trans);
+
+ if(ret){
+ hid_err(t300rs->hdev, "in int not sent at index: %i error: %i\n", i, ret);
+ return;
+ }
+
+ }
+}
+
+
void t300rs_init_interrupts(struct t300rs_device_entry *t300rs){
int ret;
int trans;
@@ -1311,6 +1365,8 @@ void t300rs_init_interrupts(struct t300rs_device_entry *t300rs){
hid_err(t300rs->hdev, "failed sending interrupts\n");
goto err;
}
+
+ t300rs_send_five_ints(t300rs);
msleep(10);
@@ -1327,6 +1383,7 @@ void t300rs_init_interrupts(struct t300rs_device_entry *t300rs){
goto err;
}
+
msleep(10);
memset(send_buffer, 0, T300RS_BUFFER_LENGTH);
@@ -1682,11 +1739,13 @@ int t300rs_init(struct hid_device *hdev, const signed short *ff_bits){
//spin_unlock_irqrestore(&lock, lock_flags);
t300rs_open(input_dev);
+<<<<<<< HEAD
+=======
+>>>>>>> f605352ef1a78145c01323633eeb15664ebb3cc4
- // this is starting to become a bit silly
- //t300rs_range_store(dev, &dev_attr_range, range, 10);
- //t300rs_set_gain(input_dev, 0xffff);
+ t300rs_range_store(dev, &dev_attr_range, range, 10);
+ t300rs_set_gain(input_dev, 0xffff);
kfree(transfer);