From b092962fefe7788c45188aadac8c102fcc4f28b7 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Tue, 3 Nov 2020 16:25:38 +0200 Subject: Reverted changes made to opening/closing device --- hid-tmt300rs.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'hid-tmt300rs.c') diff --git a/hid-tmt300rs.c b/hid-tmt300rs.c index 46b792c..a842081 100644 --- a/hid-tmt300rs.c +++ b/hid-tmt300rs.c @@ -35,6 +35,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){ @@ -1266,7 +1267,7 @@ static int t300rs_open(struct input_dev *dev){ err: kfree(send_buffer); - return t300rs->open(dev); + return 0; // t300rs->open(dev); } static void t300rs_close(struct input_dev *dev){ @@ -1657,8 +1658,8 @@ int t300rs_init(struct hid_device *hdev, const signed short *ff_bits){ t300rs->open = input_dev->open; t300rs->close = input_dev->close; - input_dev->open = t300rs_open; - input_dev->close = t300rs_close; + //input_dev->open = t300rs_open; + //input_dev->close = t300rs_close; ret = device_create_file(&hdev->dev, &dev_attr_range); if(ret){ @@ -1674,7 +1675,7 @@ int t300rs_init(struct hid_device *hdev, const signed short *ff_bits){ t300rs->hrtimer.function = t300rs_timer; //spin_unlock_irqrestore(&lock, lock_flags); - //t300rs_open(input_dev); + t300rs_open(input_dev); // this is starting to become a bit silly -- cgit v1.3 From a70f3c3bf2f9016e8bb7349cbd7399b3333d8ac7 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Tue, 3 Nov 2020 17:47:48 +0200 Subject: Added command to init sequence --- hid-tmt300rs.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) (limited to 'hid-tmt300rs.c') diff --git a/hid-tmt300rs.c b/hid-tmt300rs.c index a842081..6c44d61 100644 --- a/hid-tmt300rs.c +++ b/hid-tmt300rs.c @@ -1226,7 +1226,7 @@ static int t300rs_open(struct input_dev *dev){ send_buffer[0] = 0x60; send_buffer[1] = 0x01; - send_buffer[2] = 0x04; + send_buffer[2] = 0x05; ret = t300rs_send_int(dev, send_buffer, &trans); if(ret){ @@ -1237,13 +1237,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){ @@ -1677,10 +1678,8 @@ int t300rs_init(struct hid_device *hdev, const signed short *ff_bits){ //spin_unlock_irqrestore(&lock, lock_flags); t300rs_open(input_dev); - - // 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); -- cgit v1.3 From 85715cec22276cf794e38a10dd6f38f373e2f35a Mon Sep 17 00:00:00 2001 From: Kimplul Date: Tue, 3 Nov 2020 22:41:11 +0200 Subject: One more attempt to imitate the Windows driver Sending out some more weird interrupts when opening device, doubt they're actually useful for anything. --- hid-tmt300rs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'hid-tmt300rs.c') diff --git a/hid-tmt300rs.c b/hid-tmt300rs.c index 6c44d61..0938499 100644 --- a/hid-tmt300rs.c +++ b/hid-tmt300rs.c @@ -1226,7 +1226,7 @@ static int t300rs_open(struct input_dev *dev){ send_buffer[0] = 0x60; send_buffer[1] = 0x01; - send_buffer[2] = 0x05; + send_buffer[2] = 0x04; ret = t300rs_send_int(dev, send_buffer, &trans); if(ret){ @@ -1253,7 +1253,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; -- cgit v1.3 From f605352ef1a78145c01323633eeb15664ebb3cc4 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Wed, 4 Nov 2020 12:31:17 +0200 Subject: Added interrupts in after initial interrupts out I really don't know why they would matter, but hey, one step closer to imitating Windows. Woo. --- hid-tminit.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- hid-tmt300rs.c | 51 +++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 3 deletions(-) (limited to 'hid-tmt300rs.c') 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 0938499..248309c 100644 --- a/hid-tmt300rs.c +++ b/hid-tmt300rs.c @@ -1294,6 +1294,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; @@ -1308,6 +1356,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); @@ -1324,6 +1374,7 @@ void t300rs_init_interrupts(struct t300rs_device_entry *t300rs){ goto err; } + msleep(10); memset(send_buffer, 0, T300RS_BUFFER_LENGTH); -- cgit v1.3